2017-06-26 125 views
0

我想在滾動到定義的ID #counter時播放聲音。它工作正常,但我想玩一次。當有人再次上下滾動時,音樂就處於一種循環中。如何阻止?一次滾動觸發播放功能

// play countdown sound on scroll when you hit #counter 

$(window).scroll(function() { 
    var elemTop = $('#counter').offset().top, 
      elemHeight = $('#counter').outerHeight(), 
      windowHeight = $(window).height(), 
      windowScroll = $(this).scrollTop(); 
    var countdownSound = new Audio('./music/countdown.mp3'); 

    if(windowScroll > (elemTop + elemHeight - windowHeight)) { 
     countdownSound.play(); 
    } 
}); 
+1

也許:'$(window).off('scroll')' –

回答

2

也許你可以只是把一個外部變量來檢查:

var played = false; 

$(window).scroll(function() { 
    var elemTop = $('#counter').offset().top, 
    elemHeight = $('#counter').outerHeight(), 
    windowHeight = $(window).height(), 
    windowScroll = $(this).scrollTop(); 
    var countdownSound = new Audio('./music/countdown.mp3'); 

    if(windowScroll > (elemTop + elemHeight - windowHeight) && played == false) { 
    countdownSound.play(); 
    played = true; 
    } 
}); 

或者,你也許可以建立一個播放功能,並通過lodash.once(https://lodash.com/docs/4.17.4#once),或類似的東西調用它。


這就是說,常常onscroll調用函數時,它扼殺他們是有用的:

$(window).scroll(_.throttle(do_things_onscroll, 25)); 

function do_things_onscroll(){ 
//[do things] 
} 

注意,我還在服用Lodash公用事業優勢,但你可以使用一些其他圖書館一樣下劃線或者只是找出代碼來節制。

+0

第一個解決方案奏效。我認爲最簡單最好。無論如何,我需要測試它,看看我是否可以利用其他功能來添加到該功能。謝謝。 –

+0

Essencially,一次()只是(可能)一個更好的方法來做同樣的事情,而throttle()在滾動期間保存內存/ CPU。它允許在滾動過程中定期進行更少的函數調用。它幾乎總是一個更好的解決方案,就像debounce()onresize一樣。如果你有一些閒暇時間,請看看這裏:https://css-tricks.com/debouncing-throttling-explained-examples/ – Stratboy