2014-09-05 99 views
0

這是一個抽象問題,但我一直在思考它的實用性,也許它已經被解決或者啓發某人基於它做些事情。在JS中同步瀏覽器事件

最近我遇到了一個問題,三個瀏覽器事件都是由單個用戶交互引發的:點擊,模糊和焦點。當用戶從一個輸入點擊到另一個輸入時,發生這些事件;並且在用戶從一個標籤到另一個標籤時發生類似的設置。

我遇到的麻煩是他們按照這個順序開火:模糊,焦點,點擊。這意味着,如果模糊事件導致DOM更改,則點擊事件可能會受到影響。我真的很想點擊,模糊,專注 - 但這不是瀏覽器給我的。

我覺得可以生成一個通用工具,捕獲和取消瀏覽器事件,然後同步它們併爲所有三個事件啓動一個處理程序。也許擴展Event類以便事件可以恢復。

是否有更抽象的設計模式,我可以在這裏使用?什麼東西可以讓我設置任意數量的事件偵聽器,然後在所有事件完成時觸發單個事件?它是否已經有一個實現?所有建議歡迎。

+0

是的,你可以實現你的抽象監聽器。但是,請確定當它們沒有被同一動作觸發時應該發生什麼(這可能只能實現爲「一起在短時間內一起開火」)。從關注不同於您感興趣的元素的模糊事件,或者通過不點擊而這樣做。 – Bergi 2014-09-05 13:01:25

回答

0

不需要打破這個頭!您始終可以觸發這些事件編程

注意:這裏引用的object是使用JavaScript選擇器選擇的任何元素。

最初onBlur & onFocusevent.preventDefault允許onClick做的工作首先

var clicked=false; 
object.onblur = function(e) { 
    if (!clicked) { 
     e.preventDefault 
    } 
}; 

object.onfocus = function(e) { 
    if (!clicked) { 
     e.preventDefault 
    } 
}; 

點擊事件中撤消上述預防措施,並觸發你想

object.onclick=function(){ 
clicked=true; 
//Do anything 
object.unbind('blur'); //this do undo prevent default 
object.unbind('focus'); //this do undo prevent default 

object.blur(); //in order you want 
object.focus(); 

//make sure to put condition if click clicked 
}; 

這就是它的順序事件!希望它有幫助