我有一个keydown事件处理程序,我附加到我的文档,所以我可以在任何地方观看keydown事件。但是,在满足条件后,我希望能够删除该条件并仅删除该处理程序。我怎么能这样做?
这是我当前的处理程序:
$(document).keydown(function(event){
console.log(event);
var tag = event.target.tagName.toLowerCase();
if(event.which = 27 && tag != 'input' && tag != 'textarea'){ //escape has been pressed
_dismissModal(modal_id);
}
});
我希望在调用_dismissModal
后删除此keydown事件处理程序。如何在不删除所有keydown事件处理程序的情况下执行此操作?
答案 0 :(得分:6)
你可以使用jquery off()方法。您还可以将您的keydown逻辑放入一个单独的函数中,这样您就可以在off方法中定位该keydown操作。
var mykeydownfunction= function(){
console.log(event);
var tag = event.target.tagName.toLowerCase();
if(event.which = 27 && tag != 'input' && tag != 'textarea'){ //escape has been pressed
_dismissModal(modal_id);
$(this).off('keydown', mykeydownfunction);// $(this) is the document
}
}
$(document).on('keydown', mykeydownfunction);
答案 1 :(得分:5)
使用.off()删除事件处理程序。
$(document).on("keydown", function(event){
console.log(event);
var tag = event.target.tagName.toLowerCase();
if(event.which = 27 && tag != 'input' && tag != 'textarea'){ //escape has been pressed
_dismissModal(modal_id);
$(this).off("keydown");
}
});
答案 2 :(得分:3)
这已经得到了回答,但使用命名空间删除事件非常有帮助,并确保不会造成任何副作用。
// add click event with my.namespace as the namespace
$('element').on('click.my.namespace', function (e) {
// do something
});
// remove my.namespace click event from element
$('element').off('click.my.namespace');
您可以打开开发控制台并使用
查看元素的事件$._data($('element')[0], 'events');
打开对象,您将看到一个单击数组。展开您的活动,您将看到命名空间实际显示为
namespace.my
而不是
my.namespace
搜索事件名称和命名空间以获取更多信息。
答案 3 :(得分:2)
满足条件时,请使用.off()
$(document).off('keydown');
答案 4 :(得分:2)
使用.off()
$(document).off('keydown');
答案 5 :(得分:0)
只需命名该函数即可保持内联。
$(document).keydown(function myhandler(e) { // <- see? "myhandler"!
//do stuff blahblah
$(document).off("keydown", null, myhandler)
});
P.S。没有jquery的东西:
document.addEventListener("keydown", function myhandler(event) {
//blahblahblah do stuff
document.removeEventListener("keydown", myhandler);
});