禁用(大多数)页面上的事件?

时间:2012-01-07 08:59:40

标签: javascript jquery

我有一堆不同事件的按钮。

当应用程序处于“超级”模式时,我需要禁用所有这些事件,但要保持2-3个活动状态。

做这样的事情的最佳方法是什么?我是否需要取消绑定每个处理程序,还是可以超级某些阻止默认行为的事件?

3 个答案:

答案 0 :(得分:4)

我不知道如何简单地禁用并稍后以自动方式重新启用(几乎)页面上的所有事件,就像您似乎要问的那样。

但实现最终结果的两个非常简单的方法是:

  1. 取消绑定,然后重新绑定。如果有很多绑定会有点麻烦,听起来很麻烦,但是如果你把所有的绑定代码放在一个函数中,而所有绑定代码放在另一个函数中,打开和关闭它们只是调用这些函数的问题而且你没有重复的代码。您可能应该将初始jQuery选择器的结果缓存到变量中,这样您就可以解除绑定并重新绑定最初与选择器匹配的元素,即使它们已被更新,使得它们不再匹配(例如,如果最初按类选择)然后可以删除该课程。)

  2. 设置eventsDisabled标志,让所有事件处理程序在执行任何操作之前检查该标志。

  3. 像这样的简单工作:

     var eventsDisabled = false;
    
     $("some selector").on("some event", function() {
         if (eventsDisabled) return;
         // actual event handling code here
     }
    
     // in some other part of your code:
     eventsDisabled = true; // turn off all events
    

    显然,这样做的缺点是你必须在所有事件处理程序的开头添加一个额外的行,除了你想要一直保持活动的少数几行,但它只是三个单词和一些括号......

答案 1 :(得分:1)

...试

$(":button").unbind("click mouseover mouseout");

上面的代码将取消绑定所有按钮上的指定事件,调用unbind而不使用args将取消绑定页面上所有按钮上的所有事件

答案 2 :(得分:0)

/* Store Old Events */
var ClickEvents = $("#MyButton").data("events")["click"];
var OldEvents = new Array();
/* we have to do this because ClickEvents is a reference to the click events obj and gets modified on the unbind call below */
for( i in ClickEvents )
{
    OldEvents.push(ClickEvents[i]);
}
$("#MyButton").unbind("click");

/* Set Binds For "Super" */
$("#MyButton").click(function(){ alert("new bind");});
/* Reset old events when not "Super" */
$("#MyButtno").unbind("click");
for(i in OldEvents)
{
    $("#MyButton").click( OldEvents[i] );
}

将“点击”更改为您想要操纵的任何事件

可能更容易为“超级”模式制作单独的按钮,并在超级时隐藏旧按钮,然后在不超级时将它们带回来。

此外,如果您只想禁用(解除绑定)某些事件并保留一些事件,请将它们分隔到不同的命名空间

示例:

$("#MyButton").bind("click.SuperBinds",function()
{
    alert("a super bind");
});

$("#MyButton").bind("click.RegularBinds",function()
{
     alert("a regular bind");
});

/*disable regular binds, and keep SuperBinds click events*/
$("#MyButton").unbind("click.RegularBinds");