在事件处理程序内部删除jquery事件处理程序

时间:2014-01-28 20:17:58

标签: javascript jquery javascript-events

我有一个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事件处理程序的情况下执行此操作?

6 个答案:

答案 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

http://api.jquery.com/on/

搜索事件名称和命名空间以获取更多信息。

答案 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);
});