使用命名空间取消绑定一些事件处理程序

时间:2016-07-06 13:22:23

标签: javascript jquery

我想问一下,如何从document删除事件处理程序,但只删除具有命名空间的事件处理程序?

我有这段代码,我没有看到任何错误,但是这个函数总是在mouseup之后触发touchend.unbind的事件处理程序。我确定我在这段代码中有一些错误。

$(".inp").on("autocompleteresponse", function(event, ui) {
    $(document).bind( "mouseup.test, touchend.test", function(e) {
        var container = $('.ui-autocomplete');
        if (!container.is(e.target) && container.has(e.target).length === 0) {
            if (ui.content.length > 0) {
                ui.item = ui.content[0];
                console.log (ui.item);
                $(".inp").val(ui.item.label);
                // This will fire always, on document click, should only once per time
                $(document).unbind("mouseup.test, touchend.test");
            }
        }
    });
});

感谢您的建议

1 个答案:

答案 0 :(得分:2)

首先,on()off()现在是首选方法,而不是过时的bind()unbind()

其次,要解决您的问题,您应该使用空格而不是逗号分隔事件。试试这个:

$(".inp").on("autocompleteresponse", function(event, ui) {
    $(document).on("mouseup.test touchend.test", function(e) {
        var container = $('.ui-autocomplete');
        if (!container.is(e.target) && container.has(e.target).length === 0) {
            if (ui.content.length > 0) {
                ui.item = ui.content[0];
                console.log(ui.item);
                $(".inp").val(ui.item.label);

                $(document).off("mouseup.test touchend.test");
            }
        }
    });
});

另请注意,如果要关闭与命名空间关联的所有事件,可以单独将命名空间传递给off()方法:

$(document).off(".test")