2011-10-21 42 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(); 
}); 

我更喜歡達文的答案,但國旗的想法。