Javascript 如何在不实际禁用按钮的情况下临时禁用按钮上的单击事件?

Javascript 如何在不实际禁用按钮的情况下临时禁用按钮上的单击事件?,javascript,jquery,Javascript,Jquery,使用jQuery,我希望在不更改给定按钮的disabled属性的情况下,禁用该按钮的所有单击事件 我正在考虑检索单击事件处理程序,解除绑定并存储它们(比如,使用data()) 然后我可以在再次启用按钮后重新绑定它们 这就是路。如果将onclick指定为属性,则可以切换属性busing $(button_element).attr('click', ''); 及 您可以使用unbind和bind $(“#控件”).unbind('click') 及 $(“#控件”).bind('click',

使用jQuery,我希望在不更改给定按钮的
disabled
属性的情况下,禁用该按钮的所有单击事件

我正在考虑检索单击事件处理程序,解除绑定并存储它们(比如,使用
data()


然后我可以在再次启用按钮后重新绑定它们

这就是路。如果将onclick指定为属性,则可以切换属性busing

 $(button_element).attr('click', '');


您可以使用
unbind
bind

$(“#控件”).unbind('click')


$(“#控件”).bind('click',name of function调用)

还有另一种方法:

$("#myButton").click(function() {
    if ($(this).attr("temp_disable") == "disabled") {
        //nothing to do, temporarily disabled...
    }
    else {
        alert("You clicked me!");
    }
});
要将其“禁用”10秒钟:

$("#myButton").attr("temp_disable", "disabled");
window.setTimeout(function() { $("#myButton").attr("temp_disable", ""); }, 10000);

实时测试用例:

不难,因为jQuery已经将其所有事件处理程序作为
data()
存储在元素本身上。您可以通过
.data().events
获取(并修改)此对象

现在,您可以通过以下方式轻松保存对处理程序的引用:

 events._click = events.click;
 events.click = null;
然后使用以下命令恢复它们:

 events.click = events._click;
 events._click = null;
请注意,这不会禁用通过
.delegate()
.live()
绑定的事件,因为它们通过事件冒泡/传播工作。要禁用这些元素,只需绑定一个阻止传播到祖先元素的新处理程序:

 events._click = events.click;
 events.click = null;
 // Block .live() and .delegate()
 $("#el").click(function (e) {
     e.stopPropagation();
 });
您甚至不需要在再次启用处理程序时解除此阻止程序函数的绑定,因为
events.click=events.\u click
将覆盖您刚才与所有旧处理程序绑定的函数。

我将详细介绍Barry和Thariama提供的答案。。。我认为这将满足Ovesh的反对意见:

可以将命名空间添加到事件绑定中。这样,您就可以在以后引用特定的事件绑定,而不会与其他绑定发生冲突。我认为这比公认的答案更清楚。。。(公平地说,在最初的问题出现时,jQuery中可能没有这一点)


使用核心Javascript来完成此任务,而不是执行此操作 e、 看下面的例子

function MakeSaveDisabled(flg) {
    if (flg != null) {
        $(".btnpost").each(function () {
            this.removeAttribute("disabled");
            if (this.hasAttribute("oclickevt")) {
                this.setAttribute("onclick", this.getAttribute("oclickevt"));
            }
        });
    }
    else {
        $(".btnpost").each(function () {
            this.setAttribute("disabled", "true");
            if (this.getAttribute("onclick") != null) {
                this.setAttribute("oclickevt", this.getAttribute("onclick"));
            }
            this.removeAttribute("onclick");
        });
    }
}

将javascript函数保存在某个临时属性中,并在需要时进行绑定。

这里的所有答案现在都过时了-从jQuery 1.7开始,您应该使用
.off()
,如前所述


非演示
钮扣{
保证金:5px;
}
按钮#一个{
颜色:红色;
背景:黄色;
}
什么都不做。。。
添加单击
删除单击
点击
函数flash(){
$(“div”).show().fadeOut(“慢”);
}
$(“#绑定”)。单击(函数(){
$(“正文”)
.打开(“单击”,“打开”,闪烁)
.查找(“#theone”)
.text(“可以单击!”);
});
$(“#解除绑定”)。单击(函数(){
$(“正文”)
.off(“单击”,“打开”,闪烁)
.查找(“#theone”)
.text(“什么也不做…”);
});

您可以保存事件,然后还原它们,这似乎是可行的(请注意,根据JQuery的版本,可能需要省略u)

此示例在更改事件触发时停止引导切换,然后触发该切换,然后将事件重置为以前发生的任何事件。您可以通过单击等方式执行相同的操作

var events;
// Save change events associated with this control
events = $._data($(this)[0], "events").change;
$._data($(this)[0], "events").change = null;

// Do your stuff here
$(this).bootstrapToggle("off");

// Reset change events
$._data($(this)[0], "events").change = events;

您可能需要重新考虑您的方法-如果您希望按钮不起作用,请禁用它。向用户清楚地表明该按钮已禁用。与围绕默认行为工作相比,它更整洁、更简单、更一致。为什么要避免禁用按钮?我认为这并不能回答OP的问题(尽管我可能错了)。从听起来,可能有多个点击处理程序,他可能无法获得绑定处理程序的引用(例如匿名函数或另一个作用域中的函数)。这种方法可能会有问题。首先,我想我在某个地方读到,jQuery的新版本不支持这种行为。但即使这不是真的,它也不是一种有文档记录的行为,因此我不能在jQuery的未来版本中依赖它。@Ovesh,顺便说一句,我认为Javascript是其中一种语言,可能是因为它的动态特性,事实上的“开源”(从未编译,只是有时缩小),以及浏览器不兼容的历史,对隐藏/保护实现细节不太感兴趣的地方。只要理解了风险,并且没有更好的替代方案存在,那么就可以自由地深入研究、修改原型、覆盖功能以及一般情况。。走开;)同意。我会接受这个答案,因为可能没有更好的解决方案。这似乎不再有效(至少从jQuery 1.10开始)。假设我不知道分配给元素的所有事件处理程序。可能不止一个,这就是我最后所做的。但问题是,它必须添加到定义的每个处理程序中。从设计的角度来看,这不是一个好的解决方案,因为有些事件可能是由我无法控制的代码添加的。@Ovesh是“全局”执行此操作的唯一方法除了真正禁用按钮外,还需要将其更改为其他类似于按钮的内容,例如
div
,然后在时间到期时将其更改回按钮-希望事件处理程序将被保留,需要先检查它。这实际上是一个非常好的主意。您可以将其替换为已启用样式的按钮(没有附加单击事件),并使用
data()
保留原始按钮。然后把原来的按钮换回去。我想我应该在问题中说得更清楚。可能有多个单击事件,但并非所有事件都受我的代码约束。此解决方案不够通用。在我的示例中,generic.click()是由其他代码绑定的事件。名称空间的.bind(单击…)在代码中。您可以取消绑定名称共享的单击处理程序,而不会影响其他单击处理程序。啊,但问题是,我想禁用它上的所有单击事件。我接受这一点,但我希望首先编辑的示例不带参数地取消()以显示它如何删除所有att
function MakeSaveDisabled(flg) {
    if (flg != null) {
        $(".btnpost").each(function () {
            this.removeAttribute("disabled");
            if (this.hasAttribute("oclickevt")) {
                this.setAttribute("onclick", this.getAttribute("oclickevt"));
            }
        });
    }
    else {
        $(".btnpost").each(function () {
            this.setAttribute("disabled", "true");
            if (this.getAttribute("onclick") != null) {
                this.setAttribute("oclickevt", this.getAttribute("onclick"));
            }
            this.removeAttribute("onclick");
        });
    }
}
var events;
// Save change events associated with this control
events = $._data($(this)[0], "events").change;
$._data($(this)[0], "events").change = null;

// Do your stuff here
$(this).bootstrapToggle("off");

// Reset change events
$._data($(this)[0], "events").change = events;