2016-01-24 51 views
0

我寫了一個Javascript事件監聽器來捕獲捕獲階段的點擊,執行一個動作,然後重複點擊觸發任何通常應該發生的代碼。如何阻止事件回調自行啓動?

var obj=document.getElementById('button'); 
obj.addEventListener('click', function(event){ 
    event.stopPropagation(); 
    console.log('Performing operation here'); 
    otherOperation('ajax', function(){ 
     obj.click(); 
    }); 
}, true); 

顯然這會創建一個無限循環的操作。我認爲這是最好的方法,因爲操作需要時間延遲,我不能繼續事件傳播,直到我得到另一個回調。

有沒有辦法檢測點擊是由我自己的回調函數執行的,因此忽略它?

我有一個理論,在操作完成後刪除事件監聽器,但它需要在某些情況下再次添加,這會產生大量代碼。

+1

您確定您的事件處理程序將在所有其他以前連接的處理程序之前運行嗎?不知何故,我覺得這不會起作用 –

+0

@hege_hegedus你是對的,它不是一個完美的解決方案!不過,在我的測試中,當我點擊* capture *而不是bubble時,它出現在我的用例頁面上的所有其他插件/東西之前。 – NoChecksum

回答

1

一個在大多數瀏覽器上工作的黑客解決方案是複製按鈕本身,隱藏或刪除原來的按鈕,爲新的按鈕添加一個點擊處理程序,並在需要時調用舊的按鈕處理程序button.click()

+0

謝謝!如果頁面上的其他人干擾我的回調,接受adeneo的答案爲簡單,但我需要多瀏覽器支持,這似乎是方式。 – NoChecksum

5

它在現代的瀏覽器(不是IE或Safari)瑣碎,用event.isTrusted,至極是唯一真正的,如果事件是由用戶操作

var obj=document.getElementById('button'); 

obj.addEventListener('click', function(event){ 

    if (event.isTrusted) { 

     event.stopPropagation(); 
     console.log('Performing operation here'); 
     otherOperation('ajax', function(){ 
      obj.click(); 
     }); 
    } else { 
     // click triggered by javascript 
    } 

}, true); 

如果您有支持Safari和IE9及以上的燃煤,你可以用自定義參數

var obj = document.getElementById('button'); 

obj.addEventListener('click', function(event) { 

    if ('trusted' in event && event.trusted === false) { 
     // click triggered by javascript  
    } else { 

     event.stopPropagation(); 
     console.log('Performing operation here'); 

     otherOperation('ajax', function() { 
      var ev = new MouseEvent('click', { // create event 
       'view': window, 
       'bubbles': true, 
       'cancelable': true 
      }); 

      ev.trusted = false; // add custom data 
      self.dispatchEvent(ev); // trigger event 
     }); 

    } 
}, true); 

jQuery的事件增加了幾分相似的功能,其中一個可能只是檢查是否有originalEvent知道,如果事件被觸發或者沒有發出事件。

+0

謝謝@adeneo的確是一個很好的解決方案。不幸的是,我需要支持IE/Safari,如果我正確理解了文檔,這將導致在IE中的無限循環:( – NoChecksum

0

如果我正確地理解了這個問題,那有兩個操作。 1.「其他操作」作爲異步呼叫觸發2.「正常」操作。

正常操作可以通過按鈕偵聽器中的回調來觸發,也可以通過任何其他方式單獨調用。下面的解決方案如何呢?

var obj=document.getElementById('button'); 
obj.addEventListener('click', function(event){ 
    event.stopPropagation(); 
    console.log('Performing operation here'); 
    otherOperation('ajax', function(){ 
     normalOperation(); 
    }); 
}, true); 

function normalOperation() { 
    //normal operation to be happened for click 
} 
+0

感謝@rajbharath抽空回答。不幸的是,「正常操作」腳本硬編碼到按鈕的「onClick」屬性我無法改變這一點(我正在爲核心腳本編寫一個插件)。 – NoChecksum