停用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,请解释?