jquery rebind()禁用特定时间的事件,然后重新绑定它们
单击按钮后,我的脚本会加载新内容。 只要它正在加载我就不希望可点击的元素列表。
有没有办法取消绑定这些元素的点击事件,加载内容,然后正确“重新绑定”事件?
我想要阻止的是每个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'); });
您可以临时将新的click事件与您的元素的特定命名空间绑定,以阻止Click事件传播,并在加载内容时解除绑定事件。
$("a").bind("click.disabled", function(e) { e.stopImmediatePropagation(); return false; });
后来:
$("a").unbind("click.disabled");
编辑:正如Yoshi所指出的,这要求您的click事件处理程序在自定义事件之前附加到元素。 所以我可以通过两种方式看到这个:
- 要么在创建它们时始终将此事件处理程序绑定到每个元素,以便始终在自定义单击事件处理程序之前调用它们。 并且您只执行
stopImmediatePropagation()
并在加载数据时return false
。 - 或者您检查这个其他问题,以便您的新事件处理程序在列表中排在第一位。
如果您选择第一种方法,您的活动将是这样的:
var clicDisabled = false; $("a").bind("click.disabled", function(e) { if (true == clicDisabled) { e.stopImmediatePropagation(); return false; } });
然后在加载内容时,暂时将变量clicDisabled
设置为true。
根据你的答案,我写了以下插件:
(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中控制。
看看演示 !
THX对所有人!
更新:检查出来!!