2017-06-01 53 views
1

我試圖觸發一個處理程序,只有當兩個事件觸發(即scrollmousewheel)從同一個單一行動。是否有可能將多個事件的偵聽器設置爲一起觸發?

我的第一次嘗試是:

$('#right-nav').on('scroll mousewheel', function(event){ console.log('Fired') }) 

但是這裏有可能觸發scroll沒有mousewheel,並觸發mousewheel沒有scroll。此外,如果您同時觸發,則該功能將執行兩次。

我想爲只執行,如果mousewheel也觸發scroll,簡單地說,趕上

反之亦然,執行「所產生兩個事件單一動作」只有mousewheel不會觸發scroll

這可能嗎?無論如何要告訴其他事件是否會到來?

這裏是一個遊樂場的jsfiddle: https://jsfiddle.net/o2gxgz9r/8028/

+0

看一看[DOMMouseScroll(https://開頭developer.mozilla.org/en-US/docs/Web/Events/DOMMouseScroll),這可能是你正在尋找的 – empiric

+0

這將是很好的,但它不支持任何現代瀏覽器 – lonewarrior556

回答

1

沒有辦法立刻觸發兩個(或更多)的事件。 但是,如果它們可能是相關的,你總是可以想到事件的順序等。 請記住,JavaScript是單線程的,例如, 假設滾動事件應當提前或鼠標滾輪事件之後,但在100ms內我會做:

var eventHappened = false ; 

$(something).on('scroll', function(){ 
    if (eventHappened){ 
    // do the task I need for both events 
    } 
    else{ 
    eventHappened = true ; 
    window.setTimeout(function(){ eventHappened = false ; }, 100); 
    } 
}); 

$(something).on('mousewheel', function(){ 
    if (eventHappened){ 
    // do the task I need for both events 
    } 
    else{ 
    eventHappened = true ; 
    window.setTimeout(function(){ eventHappened = false ; }, 100); 
    } 
}); 
+1

這不會工作,作爲兩個單獨的卷軸(例如從箭頭鍵)將在滾動中觸發eventHappened事件。 –

+0

這只是一個想法,可以根據確切的需求進行調整,但請記住,不會有任何兩個事件會被單獨解僱。 JavaScript是單線程的! – neojg

+0

同時滾動總是多次觸發滾動事件,它們會在setTimout之前觸發 – lonewarrior556

0

擴大對@ neojg的回答是:

var scroll = false, mouse = false; 

$(something).on('scroll', function(){ 
    if (mouse){ 
    // do the task I need for both events 
    } 
    else{ 
    scroll = true ; 
    window.setTimeout(function(){ scroll = false ; }, 100); 
    } 
}); 

$(something).on('mousewheel', function(){ 
    if (scroll){ 
    // do the task I need for both events 
    } 
    else{ 
    mouse = true ; 
    window.setTimeout(function(){ mouse = false ; }, 100); 
    } 
}); 
相關問題