2011-10-21 46 views
3

有没有办法备份所有给定元素上设置的事件?jQuery - 备份/缓存元素的事件?

Backstory:我有一些代码,当用户将鼠标悬停在某个图标上时,会显示绝对定位的“弹出”类型(请考虑悬停帮助文本)。如果用户将鼠标悬停在弹出框上,则它会停留在周围,但是如果它们从弹出框或图标上滑下,弹出框就会隐藏起来。这一切都按预期工作。然而,弹出窗口中还有一些表单元素(不要问),如果用户开始填写表单,我想删除隐藏弹出窗口的mouseleave事件,以便它们不会意外关闭并丢失他们的数据。抛开糟糕的用户体验,这很容易做到,但是一旦用户提交表单或者单击图标,我想重新添加mouseleave功能。

伪代码:

var event_backup; 
var icon = $("img#icon"); 
var popup = $("div#popup"); 

icon.bind("mouseenter"):  
    popup.show(); 
icon.bind("mouseleave"): 
    popup.hide(); 
icon.bind("click"): 
    popup.hide(); 
    popup.events = event_backup; //how do I do this? 

popup.bind("mouseleave"): 
    popup.hide(); 
popup.bind(...): 
    //lots of bind events for popup that I want to keep 
    //I'd rather not duplicate code and manually re-add these later 

popup.children("form input").bind("focus"): 
    event_backup = popup.events; //how do I do this? 
    popup.unbind(); 
popup.children("form input#done_button").bind("click"): 
    popup.events = event_backup; //how do I do this? 

希望这是有道理的,并且道歉,如果这是一个愚蠢的问题...这是一个漫长的一天。

回答

2

可能是更好的只是有一个标志,并在相关职能开始进行简单的检查,如果你可以:

if (skipHover) return; 

如果在任何情况下,你希望获得绑定的事件:

popup.data('events').click 

是一个绑定函数的数组,对于其他事件名称也如此。

+0

谢谢!休息一段时间后,再次查看我的代码,当用户单击表单时,我返回并添加了各种标志。当他们点击表单时,我会向父级添加一个“聚焦”类,并修改我的mouseleave事件以检查“聚焦”类,如果“聚焦”类不存在,则只隐藏弹出窗口。点击图标或提交表单然后删除“重点”类。 – Ray

1

而不是把你所有的代码放在bind里面,你可以尝试把它分离出来,并将它分解成它自己的函数。这样,它应该更容易绑定,你也可以参考它。例如:

var popupBind = function(el) { 
    //some code in here, however long you want 
    //we can reference the element triggering the event with 'el' 
} 

//now we can use this in our bind calls 

popup.bind("click", 
    function() { 
     popupBind($(this)); 
    } 
); 
+0

啊,我知道只有在漫长的一天过后,我才会变得愚蠢,像你刚刚展示的更好的代码组织会完全避免这个问题。 – Ray

1

您可以创建一个管理图标绑定的函数。然后,您可以解除绑定,并在需要重新绑定所有事件时重新运行该功能。

var popup = $("div#popup"); 

function bind_popup() { 
    popup.bind(blah); 
    ... 
} 

bind_popup(); 

popup.children("form input").focus(function() { 
    popup.unbind(); 
}); 
popup.children("form input#done_button").click(function() { 
    bind_popup(); 
}); 

我更喜欢达文的答案,但国旗的想法。