点击按钮后,我的脚本会加载新内容。只要它正在加载我就不希望可以点击元素列表。
有没有办法取消绑定这些元素的点击事件,加载内容然后正确“重新绑定”事件?
我想要阻止的是每个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');
});
答案 0 :(得分:2)
您可以暂时将新的点击事件与您的元素的特定命名空间绑定,以防止点击事件传播,并在您加载内容时取消绑定您的事件。
$("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。
答案 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 !!