停用JavaScript页面级事件处理程序

时间:2014-02-06 13:47:07

标签: javascript jquery

我有一个课程,我打电话来:

this.infiniteScroll = new gd.InfiniteScroll();

在此课程中,它会检查用户是否在窗口底部。

稍后在我的脚本中,我没有使用这个无限滚动脚本(因为所有数据都已加载)。我该如何删除它?或者阻止它检查用户是否在窗口底部?

这是无限滚动类:

(function(){
"use strict";

var InfiniteScroll = function() {
    this.init();
};

var p = InfiniteScroll.prototype = gd.BaseClass.extend(gd.BaseClass);
p.BaseClass_init = p.init;

/*
 * Public properties
 */
p.canLoad = true;
p.cog;

/* 
 * Public methods
 */
p.init = function() {
    // Super
    this.BaseClass_init();

    // Init
    this.ready();

};

p.ready = function() {

    this._initInfiniteScroll();
};

p.loadRequested = function(){

    p.canLoad = false;
    console.log('show cog');
    $.event.trigger('loadRequested');

}

p.loadComplete = function(){

    p.canLoad = true;
    console.log('hide cog');
    console.log(p.canLoad);
}

p._initInfiniteScroll = function() {

    $(window).scroll(function(){  
        console.log('scroll!');
        if(($(window).scrollTop() == ($(document).height() - $(window).height())) && p.canLoad){

            p.loadRequested();

        }  
    });   

}


gd.InfiniteScroll = InfiniteScroll;
}(window));

3 个答案:

答案 0 :(得分:2)

通常你可以delete this.infiniteScroll。但我认为在这种情况下它实际上附加了一些事件处理程序,这意味着这还不够。

如果库写得很好,您可能会有一个方法来分离所有事件处理程序,析构函数或类似的东西。

答案 1 :(得分:0)

只需为您的课程提供一个“停用”方法,您可以根据需要调用该方法:

p.deactivate = function() {
    $(window).off('scroll');
};

如果你完全使用了对象,你也可以delete this.infiniteScroll允许垃圾收集器回收内存,但考虑到这个类占用的内存很少,这样做几乎没有什么好处。

注意:理想情况下,您应该“命名”事件处理程序,以便您可以独立于其他处理程序停用处理程序,例如:

$(window).on('scroll.infinite', ...);

然后随后:

$(window).off('scroll.infinite');

答案 2 :(得分:0)

如果不修改插件代码,您可以这样做:

this.infiniteScroll.canLoad = false;

编辑:

现在我知道这是你自己的代码,你可以简单地跟踪你的监听器功能,并提供一个删除监听器的破坏机制。

p._initInfiniteScroll = function() {

    $(window).scroll(this._scrollHandler = function(){  
        console.log('scroll!');
        if(($(window).scrollTop() == ($(document).height() - $(window).height())) && p.canLoad){

            p.loadRequested();

        }  
    });   

}

p.destroy = function () {
    $(window).off('scroll', this._scrollHandler);
    //you should probably call the destruction function of the parent class
    //if there's any.
};

然后只需致电this.infiniteScroll.destroy();