如何在jQuery中正确分离事件处理程序

时间:2013-01-28 09:09:38

标签: javascript-events jquery

我有这个jQuery函数,它通过滚动支持垂直居中元素:

    $.fn.center = function () {
        var self = this;
        this.css("position", "absolute");
        this.css("top", ($(window).height() - this.height()) / 2 + $(window).scrollTop() + "px");            
        $(document).on("scroll", function () {
            self.center();
        });
        return this;
    };

它与jQuery Block UI插件一起使用:

    $('#cph')
        .block(finalOptions)
        .find('.blockUI.blockMsg')
        .center();

每次需要阻止UI时,我都会执行第二个代码段。但是当我取消阻止UI时,我只是简单地使用Block UI API删除它,但我对滚动事件处理程序没有任何作用。如果我多次阻止/取消阻止UI,我会注册许多事件处理程序来滚动事件 - 我猜这很糟糕。但我不知道如何妥善解决这个问题。你能建议吗?

1 个答案:

答案 0 :(得分:13)

使用jquery off

// assume you have a method for reuse purpose
function YourFunction(){
    // do something
};

$(document).on("scroll", YourFunction);
$(document).off("scroll", YourFunction);

请注意,除非您想要分离所有事件处理程序,否则匿名函数在这种情况下不起作用:

$(document).off("scroll");

您还可以在“开启”和“关闭”事件时指定“命名空间”:

// delegate events under the ".validator" namespace
$(document).on("click.validator", function(){
    // do something
});

// remove only event handlers in the ".validator" namespace
$("form").off(".validator");