removeEventListener不删除函数

时间:2014-02-22 11:58:59

标签: javascript javascript-events html5-video event-listener

这样做,每次都会移除timeListener

var timeListener;
var setPause = function (time) {
    var video = $("video").get(0);
    timeListener = function (){
        if (video.currentTime >= time && video.currentTime < (time + 0.3)) {
            video.pause();
        }
    }
    video.addEventListener('timeupdate', timeListener);
    video.removeEventListener('timeupdate', timeListener, false);
};

只有它不是我想要的,因为我显然不想立即删除事件监听器。我希望它能够完成它的工作,然后在下一个视频加载时删除旧的监听器。

但是,当我这样做时

var timeListener;
var setPause = function (time) {
    var video = $("video").get(0);
    timeListener = function (){
        if (video.currentTime >= time && video.currentTime < (time + 0.3)) {
            video.pause();
        }
    }
    video.removeEventListener('timeupdate', timeListener, false);
    video.addEventListener('timeupdate', timeListener);
 };

removeEventListener不起作用,我最终得到了一个附有多个侦听器的视频标签。

我的理解是你必须存储对该函数的引用,以便完全删除与添加的函数相同的函数。我认为,这两个代码之间的唯一区别在于,在后者中,time的值在第二次调用setPause时已经改变,因为第一个实例具有闭包访问权限对于time的不同值,它被认为是不同的并且没有被删除。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:0)

对于任何有兴趣的人,我通过在removeEvenetListener调用的onClick调用问题来解决问题(实际上ng-click但同样的事情)之前 time已更改。所以问题,正如我所怀疑的那样,当timeListener函数通过闭包访问不同的变量值时,它被认为是一个不同的函数。

几个星期以来一直坚持这个问题所以这已经成了我的一天!