Как остановить распространение события с помощью встроенного атрибута onclick?

Учтите следующее:

<div onclick = "alert('you clicked the header')" class = "header">
  <span onclick = "alert('you clicked inside the header');">something inside the header</span>
</div>

Как я могу сделать так, чтобы, когда пользователь щелкает диапазон, он не запускал событие click div?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
327
0
465 856
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Ответ принят как подходящий

Используйте event.stopPropagation ().

<span onclick = "event.stopPropagation(); alert('you clicked inside the header');">something inside the header</span>

Для IE: window.event.cancelBubble = true

<span onclick = "window.event.cancelBubble = true; alert('you clicked inside the header');">something inside the header</span>

В FireFox нет такого понятия, как объект события.

Robert C. Barth 23.12.2008 03:07

Объект события - это параметр обратного вызова. На самом деле в IE нет такого объекта, как объект события, потому что этот объект доступен через window.event вместо того, чтобы быть параметром функции :-)

Vincent Robert 23.12.2008 03:22

Это просто неправильно - встроенные обработчики onclick не передают событие в качестве аргумента. Правильное решение - Гаретс, ниже.

Benubird 09.12.2010 19:22

В Firefox у вас может быть доступ к переменному событию во встроенном скрипте, но window.event недоступен. <div onclick = "alert (событие);"> </div>

Morgan Cheng 19.05.2011 12:37
event, похоже, также доступен во встроенных событиях в IOS Safari.
Yuval A. 03.02.2015 02:24

Может вы перепутали с функция, предоставляемая jQuery?

TechNyquist 01.12.2016 11:53

похоже, вы муза пользуетесь event.stopPropagation(). Если вы измените event на любое другое имя параметра, например e, он не сможет работать. Кто-нибудь знает почему?

Leon 03.07.2019 16:39

Согласно эта страница, в IE нужно:

event.cancelBubble = true

Имейте в виду, что window.event не поддерживается в FireFox, и поэтому это должно быть что-то вроде:

e.cancelBubble = true

Или вы можете использовать стандарт W3C для FireFox:

e.stopPropagation();

Если вы хотите пофантазировать, вы можете сделать это:

function myEventHandler(e)
{
    if (!e)
      e = window.event;

    //IE9 & Other Browsers
    if (e.stopPropagation) {
      e.stopPropagation();
    }
    //IE8 and Lower
    else {
      e.cancelBubble = true;
    }
}

И чтобы это работало, нужно называть это так: <div onclick = "myEventHandler(event);">

DarkDust 22.12.2010 17:35

Это могло быть «событие || window.event».

Pointy 23.06.2011 01:49

если (e.cancelBubble) мне не кажется правильным, вы устанавливаете его в true, если это уже правда

Guillaume86 06.10.2011 16:33
e.cancelBubble возвращает false в IE! Не может добраться до инструкции e.cancelBubble = true;. Используйте вместо этого условие SoftwareARM !!
mauretto 30.03.2012 13:38

Получить объект события из функции можно двумя способами:

  1. Первый аргумент в браузере, совместимом с W3C (Chrome, Firefox, Safari, IE9 +)
  2. Объект window.event в Internet Explorer (<= 8)

Если вам нужно поддерживать устаревшие браузеры, которые не следуют рекомендациям W3C, обычно внутри функции вы должны использовать что-то вроде следующего:

function(e) {
  var event = e || window.event;
  [...];
}

который будет проверять сначала одно, а затем другое и сохранять то, что было найдено внутри переменной события. Однако во встроенном обработчике событий нет объекта e для использования. В этом случае вы должны воспользоваться коллекцией arguments, которая всегда доступна и относится к полному набору аргументов, переданных функции:

onclick = "var event = arguments[0] || window.event; [...]"

Однако, вообще говоря, вам следует избегать встроенных обработчиков событий, если вам нужно что-то сложное, например, остановка распространения. Написание обработчиков событий отдельно и присоединение их к элементам - гораздо лучшая идея в среднесрочной и долгосрочной перспективе, как для удобочитаемости, так и для удобства обслуживания.

Из встроенного слушателя вы можете передать объект события, например: onclick = "foo(event)", а затем в функцию function foo(event){/* do stuff with event */}. Это работает как в моделях событий IE, так и в W3C.

RobG 26.12.2014 02:30

Это «меньше или равно восьми» несколько ... двусмысленно.

TechNyquist 01.12.2016 11:39

это на самом деле не отвечает на вопрос.

jcomeau_ictx 19.06.2017 09:08

аккуратный ответ на другой вопрос. : - /

Arel 28.10.2018 21:29

Используйте эту функцию, она проверит наличие правильного метода.

function disabledEventPropagation(event)
{
   if (event.stopPropagation){
       event.stopPropagation();
   }
   else if (window.event){
      window.event.cancelBubble=true;
   }
}

У меня была такая же проблема - окно ошибки js в IE - это отлично работает во всех браузерах, насколько я могу видеть (event.cancelBubble = true выполняет свою работу в IE)

onClick = "if (event.stopPropagation){event.stopPropagation();}event.cancelBubble=true;"

Спасибо @MSC именно то, что мне нужно!

DannyC 17.07.2015 18:31

Встроенный скрипт. Он отвечает на вопрос

Cesar 19.07.2017 00:47

Это также работает - в HTML-ссылке используйте onclick с возвратом следующим образом:

<a href = "mypage.html" onclick = "return confirmClick();">Delete</a>

И тогда функция comfirmClick () должна быть такой:

function confirmClick() {
    if (confirm("Do you really want to delete this task?")) {
        return true;
    } else {
        return false;
    }
};

Вопрос не в этом.

jzonthemtn 26.09.2013 20:53

@jbird Именно это и имел в виду вопрос. Это другой (более старый) способ отменить всплытие события в дереве доменов (это указано в спецификациях уровня 1 API-интерфейса dom).

gion_13 02.10.2013 15:29

@ gion_13 Но действие щелчка - это не то, что нужно подтверждать пользователю. В вопросе мы хотим, чтобы запускался только дочерний onclick (), а не родительский onclick (). Помещение пользовательской подсказки между ними бесполезно. Надеюсь, вы заметите эту разницу.

jzonthemtn 03.10.2013 16:13

confirm не имеет отношения к делу. Я имею в виду возвращаемое значение. цитата: В ссылке HTML используйте onclick с такой отдачей

gion_13 03.10.2013 18:51

возвращает ложные отмены после ссылки, это не отменяет распространение на моем Chrome

commonpike 04.01.2016 01:03

Для веб-страниц ASP.NET (не MVC) вы можете использовать объект Sys.UI.DomEvent в качестве оболочки собственного события.

<div onclick = "event.stopPropagation();" ...

или передать событие в качестве параметра внутренней функции:

<div onclick = "someFunction(event);" ...

и в некоторых функциях:

function someFunction(event){
    event.stopPropagation(); // here Sys.UI.DomEvent.stopPropagation() method is used
    // other onclick logic
}

Это сработало для меня

<script>
function cancelBubble(e) {
 var evt = e ? e:window.event;
 if (evt.stopPropagation)    evt.stopPropagation();
 if (evt.cancelBubble!=null) evt.cancelBubble = true;
}
</script>

<div onclick = "alert('Click!')">
  <div onclick = "cancelBubble(event)">Something inside the other div</div>
</div>

Вы уверены, что именно этот фрагмент кода сработал для вас? Поскольку похоже, что в обработчике onclick внешнего div ...?!

Nicole 21.11.2018 14:51
<div onclick = "alert('you clicked the header')" class = "header">
  <span onclick = "alert('you clicked inside the header'); event.stopPropagation()">
    something inside the header
  </span>
</div>

Почему бы просто не проверить, какой элемент был нажат? Если вы щелкнете по чему-либо, window.event.target будет назначен элементу, по которому щелкнули, а также элемент, по которому щелкнули, также может быть передан в качестве аргумента.

Если цель и элемент не равны, это было событие, которое распространялось вверх.

function myfunc(el){
  if (window.event.target === el){
      // perform action
  }
}
<div onclick = "myfunc(this)" />

Спасибо, дружище, это, кажется, самое чистое решение. Однако вы должны учитывать, что это соответствует только тогда, когда щелкнувший элемент является фактическим самым верхним элементом.

Simon Mattes 26.04.2017 00:14

Я не могу комментировать из-за Кармы, поэтому я пишу это как полный ответ: Согласно ответу Гарета (var e = arguments [0] || window.event; [...]) Я использовал этот oneliner, встроенный в onclick для быстрый взлом:

<div onclick = "(arguments[0] || window.event).stopPropagation();">..</div>

Я знаю, что уже поздно, но я хотел сообщить вам, что это работает в одной строке. Фигурные скобки возвращают событие, к которому в обоих случаях прикреплена функция stopPropagation, поэтому я попытался заключить их в фигурные скобки, как в if и .... это работает. :)

Лучшим решением будет обработка события с помощью функции javascript, но для того, чтобы использовать простое и быстрое решение с использованием элемента html напрямую и после того, как «событие» и «window.event» устарели и не поддерживаются повсеместно ( https://developer.mozilla.org/en-US/docs/Web/API/Window/event), предлагаю следующий «жесткий код»:

<div onclick = "alert('blablabla'); (arguments[0] ? arguments[0].stopPropagation() : false);">...</div>

Используйте отдельный обработчик, например:

function myOnClickHandler(th){
//say let t=$(th)
}

а в html сделайте это:

<...onclick = "myOnClickHandler(this); event.stopPropagation();"...>

Или даже :

function myOnClickHandler(e){
  e.stopPropagation();
}

для:

<...onclick = "myOnClickHandler(event)"...>

Другие вопросы по теме