Javascript 如果元素有“0”,则拦截并阻止所有单击事件;残疾人士;班

Javascript 如果元素有“0”,则拦截并阻止所有单击事件;残疾人士;班,javascript,jquery,Javascript,Jquery,我真的厌倦了这种模式: $("#moveButton").click(function() { if ($(this).hasClass("disabled")) { return; } //do something }); 我想拦截动态添加了类“disabled”的元素的所有单击事件。 我试过这个: $('input,a,div').click(function(event){ if ($(this).hasClass("disabled"))

我真的厌倦了这种模式:

$("#moveButton").click(function() {
    if ($(this).hasClass("disabled")) {
        return;
    }
    //do something
});
我想拦截动态添加了类“disabled”的元素的所有单击事件。

我试过这个:

$('input,a,div').click(function(event){
    if ($(this).hasClass("disabled")) {
        event.preventDefault()
        event.stopPropagation();
    }
});
但不知何故,它不起作用。 此脚本位于my page.js的顶部


更新 缺点是“disabled”类可以动态添加

因此,如果您已经将事件侦听器添加到按钮,则必须有一个解决方案来拦截它的所有单击处理程序,并检查该元素现在是否被禁用。如果是,则停止此事件以被处理程序捕获。

使用此代码

    $('input,a,div').click(function(event){
    if ($(this).hasClass("disabled")) {
        return false;
    }
});
使用此代码

    $('input,a,div').click(function(event){
    if ($(this).hasClass("disabled")) {
        return false;
    }
});

您可以使用伪类
:disabled

$('input:disabled,a:disabled,div:disabled').click(function() {

    return false;

});

您可以使用伪类
:disabled

$('input:disabled,a:disabled,div:disabled').click(function() {

    return false;

});

那就过滤掉那些元素吧

$('input,a,div').not('.disabled').on('click', function(){
    // do stuff 
});
如果稍后添加该类,则可以使用委托事件处理程序,如果确实希望为具有该类或位于此类元素中的所有元素返回false:

$('input,a,div').on('click', function(e) {
    if ( $(e.target).closest('.disabled').length ) return false;
});
编辑:

如上所述,如果委托了事件处理程序,则可以过滤掉稍后在事件处理程序中添加的类,如以下示例:

//bind an event handler to all DIV element that does NOT have a .disabled class

$(document).on('click', 'div:not(.disabled)', function() {
    alert('ok');
});

// even if we add the class later, the event handler above will filter it out

$('.test').eq(1).addClass('disabled');

那就过滤掉那些元素吧

$('input,a,div').not('.disabled').on('click', function(){
    // do stuff 
});
如果稍后添加该类,则可以使用委托事件处理程序,如果确实希望为具有该类或位于此类元素中的所有元素返回false:

$('input,a,div').on('click', function(e) {
    if ( $(e.target).closest('.disabled').length ) return false;
});
编辑:

如上所述,如果委托了事件处理程序,则可以过滤掉稍后在事件处理程序中添加的类,如以下示例:

//bind an event handler to all DIV element that does NOT have a .disabled class

$(document).on('click', 'div:not(.disabled)', function() {
    alert('ok');
});

// even if we add the class later, the event handler above will filter it out

$('.test').eq(1).addClass('disabled');

已解决:

我发现了两种拦截方式:


1) 不是拦截。正如@adeneo所说,在附加事件处理程序时,我们可以将
.on(
与测试方法一起使用:

$(document).on('click', 'div:not(.disabled)', function() {
    alert('ok');
});
有关更多详细信息,请参见他的答案,如果您觉得这有帮助,请向上投票


2) 我们可以将此代码放在顶部以首先执行,但请确保在呈现DOM时添加它:

这将阻止所有现有的
.click
.on('click'
)和
.live('click'
处理程序)被执行。如果它们没有其他参数。

如果您已经有很多处理程序并且不想重写它,那么这个解决方案是很好的。
已解决:

我发现了两种拦截方式:


1) 不是拦截。正如@adeneo所说,我们可以在附加事件处理程序时将
.on(
与test method一起使用:

$(document).on('click', 'div:not(.disabled)', function() {
    alert('ok');
});
有关更多详细信息,请参见他的答案,如果您觉得这有帮助,请向上投票


2) 我们可以将此代码放在顶部以首先执行,但请确保在呈现DOM时添加它:

这将阻止所有现有的
.click
.on('click'
)和
.live('click'
处理程序)被执行。如果它们没有其他参数。

如果您已经有很多处理程序并且不想重写它,那么这个解决方案是很好的。

这个问题引出了一个好问题,如何拦截由其他脚本设置的事件处理程序?假设脚本a向元素添加了一个事件句柄。我不想使用off()完全丢失它而是禁用temporarily@AtifMohammedAmeenuddin谢谢。这正是我想要的。很抱歉解释得不好。@AtifMohammedAmeenuddin-你不能,就这么简单。停止默认操作和传播只与默认的“html”事件有关。javascript中的事件处理程序触发的操作不能“关闭”只需在另一个事件处理程序中返回false,这不是它的工作方式,唯一的方法是在事件处理程序中使用标志,或删除事件处理程序。@ZuzEL-我对委派方法进行了一些详细说明,这就是您要找的吗?这非常接近。我的回答是+1。我稍后会接受它。这个问题让我开始思考od问题,如何拦截由其他脚本设置的事件处理程序?假设脚本A向元素添加了一个事件处理程序。我不希望使用off()完全丢失它而是禁用temporarily@AtifMohammedAmeenuddin谢谢。这正是我想要的。很抱歉解释得不好。@AtifMohammedAmeenuddin-你不能,就这么简单。停止默认操作和传播只与默认的“html”事件有关。javascript中的事件处理程序触发的操作不能“关闭”只需在另一个事件处理程序中返回false,这不是它的工作方式,唯一的方法是在事件处理程序中使用标志,或者删除事件处理程序。@ZuzEL-我对委派方法进行了一些详细说明,这就是您要找的吗?这非常接近。我将在稍后接受它。这还不错,得到两个对一个答案进行投票,答案完全正确,我的意思是与问题中的代码完全相同?在javascript中,每个单词都很重要,因为它区分大小写,并且您更改了什么?但是在jQuery中返回false是preventDefault和StopperPropagation的快捷方式,因此它与OP使用的代码完全相同?除了OP的代码不适用于我和retu之外rn false;对我来说确实有效。这还不错,在一个答案上获得了两张赞成票,这是完全正确的,我的意思是与问题中的代码完全相同?在javascript中,每个单词都很重要,因为它区分大小写,您更改了什么?但是在jQuery中返回false是preventDefault和stopPropagation的快捷方式,因此它与OP的代码完全相同正在使用?除了OP的代码对我无效,返回false;对我有效。