Javascript-触发函数使用反跳机制时删除事件侦听器

马修

我有一个触发屏幕大小调整操作的函数:

if ( window.addEventListener ) {
            // For all major browsers, except IE 8 and earlier            
            window.addEventListener('resize', debounce(function () {
              if ( $videosContainer.attr('data-video-hosting') === 'youtube' ) {                    
                resizeVideo(netVidX, netVidY, cryptoVidX, cryptoVidY, 'youtube');         
              }
            }, 250));
          } else if (window.attachEvent ) {
            // For IE 8 and earlier versions
            window.attachEvent('resize', debounce(function () {
              if ( $videosContainer.attr('data-video-hosting') === 'youtube' ) {
                resizeVideo(netVidX, netVidY, cryptoVidX, cryptoVidY, 'youtube');                    
              }
            }, 250));
          }

防抖动机制定义如下:

// Smart debounce. Source - https://gist.github.com/vincentorback/9649034
// it works the exact same way as you'd expect, except it only fires once the keypress event is idle for XX ms 
function debounce(fn, wait) {
  var timeout;
  return function () {
    clearTimeout(timeout);
    timeout = setTimeout(function () {
      fn.apply(this, arguments)
    }, (wait || 1));
  }
}

由于此函数被反复调用,因此我想删除监听器/取消绑定,然后再添加(再次)。它在视频的滑块中,我需要重新设置调整大小的侦听器,因为某些本地范围设置和事实视频的尺寸不同,比如说长话长说……)

在jquery中,我可以按照以下方式进行操作:

$video.off('resize').on('resize', function(e) {

在javascript中,我可以使用removeEventListener

if (window.removeEventListener) {
              window.removeEventListener('resize', functionToUnbind, false);
            } else if (window.detachEvent) {
              window.detachEvent('resize', functionToUnbind, false);
            }

但是我的问题是,由于去抖动的位置,我无法使removeEventListener正常工作。

我尝试将所有“去抖动块”放入一个名为functionToUnbind的新函数中,以便能够使用如上所示的标准removelistener方法,但是它不起作用。

launchStuffForLatestSliderVideo();
function launchStuffForLatestSliderVideo() {
     //remove first any lingering/remaining/existing resize listener on the videos
if (window.removeEventListener) {
     window.removeEventListener('resize', functionToUnbind, false);
} else if (window.detachEvent) {
     window.detachEvent('resize', functionToUnbind, false);
}

function functionToUnbind() {
   debounce(function () {
              if ( $videosContainer.attr('data-video-hosting') === 'youtube' ) {
                resizeVideo(netVidX, netVidY, cryptoVidX, cryptoVidY, 'youtube');                    
              }
            }, 250)
}

//reset a new event listener for the latest video
if ( window.addEventListener ) {
   // For all major browsers, except IE 8 and earlier
   window.addEventListener('resize', functionToUnbind);            
 } else if (window.attachEvent ) {
   // For IE 8 and earlier versions
    window.attachEvent('resize', functionToUnbind);
 }

}

每次重新设置监听器之前,应该如何删除它?我认为问题出在防弹跳上,但我不确定

伊凡·费里奇(IvanFerić)

问题在于,您尝试使用它的方式,每个resize事件都会对timeout变量有不同的引用

由于您始终将事件处理程序设置在window仅具有一个实例的全局对象上,因此您可能会更改timeout为处于全局范围内,因此它也只有一个实例。

为此,您应该将debounce函数更改为如下所示:

var globalResizeTimeout;
function debounce(fn, wait) {
  clearTimeout(globalResizeTimeout);
  globalResizeTimeout = setTimeout(function () {
    fn.apply(this, arguments)
  }, (wait || 1));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

删除在函数内部创建的事件侦听器?(JavaScript)

Javascript 事件侦听器未触发

使用“ this”的javascript函数DOM事件侦听器

JavaScript - 使用带有 setTimeout 函数的事件侦听器

Javascript删除“焦点”事件侦听器

Javascript-如何在事件监听器中使用<option>的值触发函数

单击标签元素内的文本时,Javascript事件侦听器将触发两次

Vaadin JavaScript卸载事件侦听器未触发

Javascript事件侦听器

使用 JavaScript 的事件委托设置删除事件侦听器的有效方法是什么

JavaScript-如何根据此函数的结构删除事件侦听器?

在 Javascript 中将对象设置为 null 时是否删除了事件侦听器?

删除后重新添加事件侦听器--Javascript

删除for循环javascript中的事件侦听器

更新或更改或删除/重置Javascript事件侦听器

使用添加事件侦听器创建滚动事件 - Javascript

JavaScript闭包函数传递给事件侦听器

JavaScript函数/事件侦听器无法正常运行

事件侦听器多次调用Javascript函数

调用侦听器事件时,Javascript数据不持久

如何使用传递给 JavaScript 函数的参数添加点击事件侦听器

从数组读取时,JavaScript无法删除侦听器

如何在事件侦听器中使用 <option> 的值触发函数

当我在网页上的输入元素上按 Enter 键时触发的 JavaScript 事件侦听器

使用javascript手动更改表单/文本区域输入,并确保触发所有事件侦听器

Javascript - classList 事件侦听器的问题

JavaScript事件侦听器内存泄漏

类中的 Javascript 事件侦听器

javascript DOMContentLoaded事件侦听器