【问题标题】:Trigger play function on scroll once滚动一次触发播放功能
【发布时间】:2017-06-26 15:27:45
【问题描述】:

我想在滚动到定义的 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();
    }
});

【问题讨论】:

  • 也许:$(window).off('scroll')

标签: javascript jquery audio scroll mp3


【解决方案1】:

也许你可以放一个外部变量来检查:

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 实用程序,但您可以使用其他一些库,例如下划线,或者只是找出代码来限制。

【讨论】:

  • 第一个解决方案奏效了。我认为越简单越好。无论如何,我需要对其进行测试,看看我是否可以利用其他功能来添加到该功能中。谢谢。
  • 本质上,once() 只是(也许)一种更优雅的方式来做同样的事情,而throttle() 在滚动期间节省内存/cpu。它允许在滚动期间定期调用更少的函数。它几乎总是一个更好的解决方案,就像 debounce() onresize 一样。如果您有空闲时间,请看这里:css-tricks.com/debouncing-throttling-explained-examples
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2021-05-23
  • 2012-03-11
相关资源
最近更新 更多