2013-07-17 61 views
13

我想打一個額外的點擊處理程序(客戶端頁面,不能修改自己的JS/HTML),它應該像這樣工作在我的腳本:stopPropagation和startPropagation

1)event.stopPropagation(暫停客戶端點擊傳播)
2)我的函數(做我的功能,當一切都做下一步)
3)event.startPropagation(繼續標準的客戶端動作)

眼下,第一和第二工作。第三個是問題。
我知道event.startPropagation不存在,但我想要的東西。 任何提示?

回答

4

首先不要停止傳播。

測試my function是否執行您想要的操作,然後決定是否要停止傳播。

+1

當我點擊錨,我的功能(GET到DB)還沒有時間來執行。我認爲它必須在開始時停止傳播 –

+0

您應該考慮可能的用戶體驗傷害:用戶單擊某件事物,直到數據庫調用完成纔會發生任何事情。最糟糕的是,這可能是很長時間沒有反應。 – ehdv

+0

這是一個不好的答案,因爲當在同一個元素上冒泡幾個事件時,停止傳播通常是必需的。這是該方法存在的全部原因。 – kjdion84

0

如果要分別啓用/禁用單擊事件,請添加和刪除單擊處理程序。由於event.stopPropagation()將阻止事件向上傳播dom樹。

更新:

如果您正在使用jQuery,使用.trigger()功能。

​​

9

可以重新觸發相同的事件對象的父節點,f.ex(jQuery的)上。您需要先複製事件對象,並把它傳遞到觸發條件才能捕捉到氣球相同的事件屬性(f.ex e.pageX):

var copy = $.extend(true, {}, e); 
setTimeout(function() { 
    $(copy.target.parentNode).trigger(copy); 
},500); 
e.stopPropagation(); 

演示:http://jsfiddle.net/GKkth/

編輯

基於您的評論,我認爲你正在尋找的東西,如:

$.fn.bindFirst = function(type, handler) { 
    return this.each(function() { 
     var elm = this; 
     var evs = $._data(this).events; 
     if (type in evs) { 
      var handlers = evs[type].map(function(ev) { 
       return ev.handler; 
      }); 
      $(elm).unbind(type).on(type, function(e) { 
       handler.call(elm, e, function() { 
        handlers.forEach(function(fn) { 
         fn.call(elm); 
        }); 
       }); 
      }); 
     } 
    }); 
}; 

這個原型允許你綁定一個「高級處理程序」,它包含一個next函數,它可以在你想要的時候執行所有以前的處理程序到同一個元素。 使用它像

$('button').click(function() { 
    console.log('first'); 
}).click(function() { 
    console.log('second'); 
}).bindFirst('click', function(e, next) { 
    console.log('do something first'); 
    setTimeout(next, 1000); // holds the other handlers for 1sec 
}); 

DEMO:http://jsfiddle.net/BGuU3/1/

+0

好吧,我在很多方面嘗試過這種方法,結果並不好。也許我做錯了什麼。 例如: //客戶端,他自己的點擊處理程序 $('p')。點擊(功能(e){document.location ='http://www.onet.pl'; }); 。 //我的腳本 $( 'P')點擊(函數(E){ e.stopPropagation(); e.preventDefault(); $ 獲得( ...., ... 。, function(){ // if if ok,then do something like startPropagation } ) }); –

+2

@PiotrWójcik聽起來像你正在尋找'stopImmediatePropagation()',因爲處理程序被附加到相同的元素:http://api.jquery.com/event.stopImmediatePropagation/。請記住,它不會阻止先前綁定的處理程序被執行。或者也許你只需要找到已綁定的處理程序,保存它們並稍後在自己的觸發器中執行它們。 – David

+2

@PiotrWójcik我用一個可能的解決方案編輯了我的答案,那是你需要的嗎? – David