Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停用JavaScript页面级事件处理程序_Javascript_Jquery - Fatal编程技术网

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

停用JavaScript页面级事件处理程序,javascript,jquery,Javascript,Jquery,我有一门课,我通过以下途径称之为: this.infiniteScroll = new gd.InfiniteScroll(); 在这个类中,它检查用户是否在窗口的底部 稍后在我的脚本中,我不再使用这个无限滚动脚本(因为所有数据都已加载)。如何删除它?或者阻止它检查用户是否在窗口底部 下面是无限滚动类: (function(){ "use strict"; var InfiniteScroll = function() { this.init(); }; var p = Infin

我有一门课,我通过以下途径称之为:

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));

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

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

只要给你的类一个“deactivate”方法,你可以根据需要调用它:

p.deactivate = function() {
    $(window).off('scroll');
};
如果您完全完成了对象,您也可以
删除此.infiniteScroll
,以允许垃圾收集器回收内存,但是考虑到此类占用的内存太少,这样做没有什么好处

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

$(window).on('scroll.infinite', ...);
随后:

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

无需修改插件代码,您可能只需执行以下操作:

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()

答案将取决于
gd.InfiniteScroll
类是否能够将自身从页面分离。库是否支持它?检查api。@哎呀,不是远程的duplicate@Alnitak他正在对一个对象进行新的引用,并希望稍后将其删除。听起来一模一样。不,他正在创建一个对象,然后自动将自己连接到DOM。“删除”将要求该对象删除其事件处理程序和对它的任何其他引用,此时它将获得GCed。是的,但每次用户滚动时它仍会检查此项。@panthro True,但没有其他方法不修改插件。它不是插件。它是我写的代码,所以我可以随心所欲地修改它。@plalx我不相信这是
.off
-您必须指定事件名称和(可选)事件处理程序引用的有效语法。@Alnitak是的,我已经纠正了它,粗心的错误。这当然不值得投否决票……谢谢,这起作用了。你能更详细地介绍一下名称空间吗。我试图将它与我的代码集成,但它无法工作。它在jQuery文档中-downvoter,请解释?