Учтите следующее:
<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?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте 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>
Объект события - это параметр обратного вызова. На самом деле в IE нет такого объекта, как объект события, потому что этот объект доступен через window.event вместо того, чтобы быть параметром функции :-)
Это просто неправильно - встроенные обработчики onclick не передают событие в качестве аргумента. Правильное решение - Гаретс, ниже.
В Firefox у вас может быть доступ к переменному событию во встроенном скрипте, но window.event недоступен. <div onclick = "alert (событие);"> </div>
event, похоже, также доступен во встроенных событиях в IOS Safari.
Может вы перепутали с функция, предоставляемая jQuery?
похоже, вы муза пользуетесь event.stopPropagation(). Если вы измените event на любое другое имя параметра, например e, он не сможет работать. Кто-нибудь знает почему?
Согласно эта страница, в 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);">
Это могло быть «событие || window.event».
если (e.cancelBubble) мне не кажется правильным, вы устанавливаете его в true, если это уже правда
e.cancelBubble возвращает false в IE! Не может добраться до инструкции e.cancelBubble = true;. Используйте вместо этого условие SoftwareARM !!
Получить объект события из функции можно двумя способами:
Если вам нужно поддерживать устаревшие браузеры, которые не следуют рекомендациям 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.
Это «меньше или равно восьми» несколько ... двусмысленно.
это на самом деле не отвечает на вопрос.
аккуратный ответ на другой вопрос. : - /
Используйте эту функцию, она проверит наличие правильного метода.
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 именно то, что мне нужно!
Встроенный скрипт. Он отвечает на вопрос
Это также работает - в 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;
}
};
Вопрос не в этом.
@jbird Именно это и имел в виду вопрос. Это другой (более старый) способ отменить всплытие события в дереве доменов (это указано в спецификациях уровня 1 API-интерфейса dom).
@ gion_13 Но действие щелчка - это не то, что нужно подтверждать пользователю. В вопросе мы хотим, чтобы запускался только дочерний onclick (), а не родительский onclick (). Помещение пользовательской подсказки между ними бесполезно. Надеюсь, вы заметите эту разницу.
confirm не имеет отношения к делу. Я имею в виду возвращаемое значение. цитата: В ссылке HTML используйте onclick с такой отдачей
возвращает ложные отмены после ссылки, это не отменяет распространение на моем Chrome
Для веб-страниц 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 ...?!
<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)" />
Спасибо, дружище, это, кажется, самое чистое решение. Однако вы должны учитывать, что это соответствует только тогда, когда щелкнувший элемент является фактическим самым верхним элементом.
Я не могу комментировать из-за Кармы, поэтому я пишу это как полный ответ: Согласно ответу Гарета (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)"...>
В FireFox нет такого понятия, как объект события.