Я надеюсь, что кто-то может помочь мне понять, почему сценарий ниже терпит неудачу. У меня есть родительский тег ul с обработчиком событий, который создает условия для данного элемента li потомства в другом теге ul, вложенном в него. Разметка:Может ли обработчик событий предков остановить распространение одного из событий его дочернего элемента?
<ul id="outerUL">
<li>LIST ITEM 1</li>
<li>LIST ITEM 2</li>
<li>
<ul id="innerUL">
<li>LIST ITEM 3</li>
<li>LIST ITEM 4</li>
<li>
<ul id="inMostUL">
<li>LIST ITEM 5</li>
<li>LIST ITEM 6</li><!-- we condition for this element -->
<li>LIST ITEM 7</li>
</ul>
</li>
</ul>
</li>
</ul>
Javascript является: (это кажется условным .stopPropagation() при вызове метода предка не может ...)
var outerMostUL = document.getElementById("outerUL");
outerMostUL.addEventListener('click',
function(e){
if(e.target.innerHTML === "LIST ITEM 6"){
e.stopPropagation();
alert("you clicked LIST ITEM 6. Event travel stops.");
// return; // a return WILL work
}
// below runs if propagation continues...
alert("outerMostUL event handler fired!");
},
false);
Теперь, если я решил положить в сдержанный. addEventListener вызова() на что Ли тег, .stopPropagation() работает, как ожидалось, например:
// A discreet event handler does work
var inMostUL = document.getElementById("inMostUL");
inMostUL.children[1].addEventListener('click', function(e){
e.stopPropagation();
alert("The descendent event fires, but stops now.");
});
так что мой вопрос: вы должны быть в состоянии использовать состояние в обработчике предка для данного e.target и прекратить распространение накануне nt, если активируется барботирование? Кажется, что у элемента должен быть свой собственный обработчик, связанный с возникновением события, но, возможно, я путаю распространяющееся событие, перемещающее цепочку предков, фактически добавляя прослушиватель событий через этот метод. Любое световое излучение будет оценено по достоинству. Я просто пытаюсь концептуализировать обработку событий js с помощью простых примеров. Спасибо за любое рассмотрение этого.
Добавьте 'e.cancelBubble = true;' для более старой поддержки IE, если вы не используете jQuery, и в этом случае jQuery обрабатывает его для вас. – crush