在vanilla JavaScript和jQuery中禁用按钮 香草JavaScript

在vanilla JavaScript和jQuery中禁用按钮 香草JavaScript,javascript,jquery,event-handling,dom-events,jquery-events,Javascript,Jquery,Event Handling,Dom Events,Jquery Events,在vanilla JavaScript中,可以使用以下语句轻松启用和禁用按钮: button.disabled = state; 这在人类尝试单击按钮和以编程方式单击按钮时都有效: var-button=document.getElementById('myButton'); addEventListener('click',function(){ 警惕(“世界”); }); button.disabled=true; 按钮。单击();//无输出 button.disabled=false;

在vanilla JavaScript中,可以使用以下语句轻松启用和禁用按钮:

button.disabled = state;
这在人类尝试单击按钮和以编程方式单击按钮时都有效:

var-button=document.getElementById('myButton');
addEventListener('click',function(){
警惕(“世界”);
});
button.disabled=true;
按钮。单击();//无输出
button.disabled=false;
按钮。单击();//输出:“你好”和“世界”
button.disabled=true;
按钮。单击();//无输出
使用.prop()是正确的方法。我认为问题在于您“测试”它的方式。请参阅此示例,其中使用切换按钮正确禁用/启用按钮,而不管处理程序是通过onclick还是通过jquery连接的

window.testFunc=函数(事件){
if(!$('myButton2').prop('disabled')){
警惕(“你好”);
console.log(“你好”);
}
}
$(文档).ready(函数(){
var按钮=$(“#myButton2”);
点击按钮,功能(事件){
if(!$(this.prop('disabled')){
警惕(“世界”);
console.log(“世界”);
}
});
$(“#切换按钮”)。单击(函数(){
$('myButton1').prop('disabled'),!$('myButton1').prop('disabled');
$('myButton2').prop('disabled'),!$('myButton2').prop('disabled');
});
$('#tester')。单击(函数(){
$(“#myButton1”)。单击();
$(“#myButton2”)。单击();
});
})

如果您查看这些行:

handlers: function( event, handlers ) {
    var i, matches, sel, handleObj,
        handlerQueue = [],
        delegateCount = handlers.delegateCount,
        cur = event.target;

    // Support (at least): Chrome, IE9
    // Find delegate handlers
    // Black-hole SVG <use> instance trees (#13180)
    //
    // Support: Firefox<=42+
    // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
    if ( delegateCount && cur.nodeType &&
        ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {

        /* jshint eqeqeq: false */
        for ( ; cur != this; cur = cur.parentNode || this ) {
            /* jshint eqeqeq: true */

            // Don't check non-elements (#13208)
            // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
            if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {

点击我
启用/禁用按钮

测试单击
您将直接调用单击函数3次(button.Click()),该函数将在禁用属性的情况下激发

disabled属性仅响应单击事件

请参见更新的示例:

var按钮=$(“#myButton”);
变量按钮2=$(“#我的按钮2”);
按钮。道具(“禁用”,错误);
按钮。打开(“单击”,函数(){
警惕(“世界”);
按钮2.道具(“禁用”,错误);
});
按钮2.道具(“禁用”,正确);
按钮2.打开(“单击”,函数(){
警惕(“世界”);
按钮。道具(“禁用”,真);
});

为了达到预期的结果,您可以在jQuery触发器中使用
.isTrigger
单击
处理程序来确定事件是否由
javascript
触发,而不是由用户操作触发

将属性事件侦听器定义为一个命名函数,其中
可以传递此
来检查
禁用的
属性,如果
条件是调用或未调用
警报()

使用
.attr(“disabled”、“disabled”)
在元素处设置
disabled
。removeAttr(“disabled”)
删除属性;
.attr(“onclick”,null)
删除事件属性
onclick
处理程序;
.attr(“onclick”,“handleClick(true)”)
重置事件属性


功能手柄点击(el){
如果(el.disabled!=“disabled”)
警报(“你好”)
}
var按钮=$(“#myButton”);
按钮。打开(“单击”,功能(e){
控制台日志(e);
如果(e.isTrigger!==3&&!e.target.disabled)
警惕(“世界”);
});
按钮。属性(“禁用”、“禁用”);
attr(“onclick”,null);
按钮。单击();//无输出
setTimeout(函数(){
按钮。移除按钮(“禁用”);
attr(“onclick”、“handleClick(按钮[0])”;
按钮。单击();//输出:“世界”和“你好”
//在'setTimeout'调用之间单击按钮
//调用jQuery事件和事件属性
}, 1000);
setTimeout(函数(){
按钮。属性(“禁用”、“禁用”);
attr(“onclick”,null);
按钮。单击();//无输出
}, 10000);

一个有趣的问题。我的第一个猜测是,jQuery完全按照您告诉它的方式执行-您在元素上附加了一个单击处理程序,它会在单击时尽职尽责地触发。它是否被启用并不重要,因为它只是被视为一个DOM元素。但是,对于普通的JS,似乎情况并非如此。@Abhi:the
。off()
方法只删除附加了
.on()的事件处理程序
@JohnSlegers我的建议是在禁用和重新绑定时删除绑定。虽然不确定它的效率,但是当您从元素中删除内联的
onClick
函数时会发生什么?当您以编程方式单击按钮时,它会忽略按钮是否已禁用(请参阅)。情况不应该如此,如果没有一个肮脏的解决方法,我似乎无法解决这个问题!是的。禁用只会影响用户交互,因此当您以编程方式“单击它”时。单击()处理程序仍将正常工作。请看这个问题:我知道……但启用/禁用按钮并不是这样工作的……或者至少不是它在普通JavaScript中的实现方式(请参阅)。我同意您的预期。单击()当按钮被禁用时,处理程序不会被调用,但现在,这是我们需要解决的jQuery问题之一。我猜假设是,如果您手动触发单击事件,您可以同样轻松地手动确定它是否被启用。我希望以这种方式实现它的jQuery开发人员有一个很好的理由。缺点考虑到预期的行为是在vanilla JavaScript中实现的,而不是在jQuery中实现的,我怀疑这是jQuery中的一个错误,但我还不能验证这一点。因此,我在这里的问题是。。。