我在页面上有许多可点击元素,在加载资源之前不应启用这些元素。我的想法是使用.disabled
类初始化按钮,然后在资源准备好后将其删除。与此同时,我在.disabled
点击事件上有一个处理程序,可以阻止事件传播到其他处理程序。
问题是,即使我首先添加.disabled
处理程序,我也无法在其他点击处理程序之前触发它。
$( "body" ).on('click','.disabled', function(e) {
alert('disabled');
e.stopImmediatePropagation();
return false;
});
$('.clickable').click(function(e) {
alert('enabled');
});
// Call this when ready:
//$('.clickable').removeClass('disabled');
FIDDLE: http://jsfiddle.net/4rJxU/7/
这将首先弹出“启用”警报,然后弹出“禁用”警报,大概是因为委托事件是由.clickable
元素的父级捕获的,因此会在以后处理?
如何使用委派事件禁用点击处理程序?
答案 0 :(得分:1)
添加保持实际状态的变量不是更好吗?
var isLoaded = false;
$( "body" ).on('click', function(e) {
if (isLoaded) {
alert('enabled');
} else {
alert('disabled');
e.stopImmediatePropagation();
return false;
}
});
然后在一切就绪后将其更改为true
。
答案 1 :(得分:1)
这应该有效(不需要禁用类):
var clickEnabled = false;
$('.clickable').on('click', function(e) {
if (!clickEnabled) {
alert('disabled');
e.stopImmediatePropagation();
return false;
}
else {
alert('enabled');
}
});
...只需将clickEnabled设置为true即可。
小提琴:http://jsfiddle.net/ehFGX/
如果您想要的是默认点击处理程序在一切准备就绪后触发,您可以删除上面的else块,如果您的处理程序没有返回false,它将继续使用默认值。
如果你仍然喜欢使用被禁用的类,你可以检查$(this)是否有该类而不是检查!clickEnabled。