Запись события jQuery
Мне нужно захватить событие, а не позволить ему пузыриться. Это то, что я хочу:
<body>
<div>
</div>
</body>
Из этого примера кода у меня есть событие click, ограниченное div и телом. Я хочу, чтобы событие тела было вызвано первым. Как мне это сделать?
Ответы
Ответ 1
Вместо этого используйте захват событий: -
$("body").get(0).addEventListener("click", function(){}, true);
Проверить последний аргумент на "addEventListener" по умолчанию, он является ложным и находится в режиме барботажа событий. Если установлено значение true, это будет работать как событие захвата.
Для кросс-браузерной реализации.
var bodyEle = $("body").get(0);
if(bodyEle.addEventListener){
bodyEle.addEventListener("click", function(){}, true);
}else if(bodyEle.attachEvent){
document.attachEvent("onclick", function(){
var event = window.event;
});
}
IE8 и ранее по умолчанию используют событие bubbling. Поэтому я привязал событие к документу вместо тела, поэтому вам нужно использовать объект события для получения целевого объекта. Для IE вам нужно быть очень сложным.
Ответ 2
Я бы сделал это вот так:
$("body").click(function (event) {
// Do body action
var target = $(event.target);
if (target.is($("#myDiv"))) {
// Do div action
}
});
Ответ 3
В общем, чем @pvnarula ответ:
var global_handler = function(name, handler) {
var bodyEle = $("body").get(0);
if(bodyEle.addEventListener) {
bodyEle.addEventListener(name, handler, true);
} else if(bodyEle.attachEvent) {
handler = function(){
var event = window.event;
handler(event)
};
document.attachEvent("on" + name, handler)
}
return handler
}
var global_handler_off = function(name, handler) {
var bodyEle = $("body").get(0);
if(bodyEle.removeEventListener) {
bodyEle.removeEventListener(name, handler, true);
} else if(bodyEle.detachEvent) {
document.detachEvent("on" + name, handler);
}
}
Затем для использования:
shield_handler = global_handler("click", function(ev) {
console.log("poof")
})
// disable
global_handler_off("click", shield_handler)
shield_handler = null;