jquery rebind()禁用特定时间的事件,然后重新绑定它们

时间:2012-12-05 18:11:06

标签: jquery bind unbind

点击按钮后,我的脚本会加载新内容。只要它正在加载我就不希望可以点击元素列表。

有没有办法取消绑定这些元素的点击事件,加载内容然后正确“重新绑定”事件?

我想要阻止的是每个click-function / element中的if语句。

以下是我的尝试:

$(load_button).click(function(){
    $('a').each(function(){
        var dis_e = $(this).data('events');
        $(this).data('disabled-events', dis_e);
    }).unbind('click');

    $(some_content).load(function(){
        $('a').each(function(){
            var dis_e = $(this).data('disabled-events');
            $(this).removeData('disabled-events');
            $(this).bind('click', dis_e);
        });
    });
});

更新:

它还应该阻止(在这种情况下)警告“点击”的元素:

$('a').click(function(){
   alert('click');
});

2 个答案:

答案 0 :(得分:2)

您可以暂时将新的点击事件与您的元素的特定命名空间绑定,以防止点击事件传播,并在您加载内容时取消绑定您的事件。

$("a").bind("click.disabled", function(e) {
    e.stopImmediatePropagation();
    return false;
});

后来:

$("a").unbind("click.disabled");

编辑:正如Yoshi所指出的,这要求您的Click事件处理程序在自定义事件之前附加到元素。所以我可以看到两种解决方法:

  1. 要么在创建它们时始终将此事件处理程序绑定到每个元素,以便始终在自定义单击事件处理程序之前调用它们。只有在加载数据时才会stopImmediatePropagation()return false
  2. 或者您检查此other question,以便新的事件处理程序位于列表的第一位。
  3. 如果您选择第一种方法,您的活动将是这样的:

    var clicDisabled = false;
    $("a").bind("click.disabled", function(e) {
        if (true == clicDisabled) {
            e.stopImmediatePropagation();
            return false;
        }
    });
    

    然后在加载内容时,您可以暂时将变量clicDisabled设置为true。

答案 1 :(得分:1)

根据您的回答,我编写了以下插件:

(function($){
    $.fn.rebind = function(){
        var init = 'init-rebind';
        return this.each(function() {
            var is_init = $(this).data(init);
            if (!is_init){
                $(this).data(init, true);
                $(this).bind('click.rebind mouseenter.rebind mouseleave.rebind', function(e){
                    if ($(this).hasClass('disabled')){
                        e.stopImmediatePropagation();
                        e.preventDefault();
                    }
                });
            }
        });
    };
})(jQuery);

我决定添加/删除“禁用”类,而不是使用全局变量,以便在css中控制。

查看demo

THX to all!


更新:检查this !!