javascript-如果删除了元素,是否必须清除DOM中的事件?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-如果删除了元素,是否必须清除DOM中的事件?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2922字,纯文字阅读大概需要5分钟。
内容图文
![javascript-如果删除了元素,是否必须清除DOM中的事件?](/upload/InfoBanner/zyjiaocheng/654/099bade5390043338030ade70ba01eb8.jpg)
假设我有一个页面可以动态加载页面.当每个页面加载到DOM中时,该页面中元素的事件都会添加.
如果用户加载另一个页面,则先前加载的元素将从DOM中删除.自然地,由于元素本身不再存在,因此映射到这些元素的所有事件都将停止运行.
但是,它们也被移除了吗?还是它们坐在用户的内存中,占用了空间?
跟进:
是这样定义的函数:
var event = $('foobar').addEvent('click', function() {
alert(1);
});
可以很容易地用event = null删除事件(或者我可以假设是!)…
但是如果事件未保存到本地变量怎么办?
$('foobar').addEvent('click', function() {
alert(1);
});
谢谢!
解决方法:
首先.什么?这没有任何意义:
var event = $('foobar').addEvent('click', function() {
alert(1);
});
它不会像您认为的那样将事件保存到局部变量中.它将对foobar元素对象的引用保存到事件变量中-大多数mootools元素方法将返回该值以进行链接,这是元素本身,而不是方法的结果(除非它是类似“ .getStyle”的吸气剂).
然后,这取决于您如何摆脱元素,接下来会发生什么.首先,element.destroy,在这里找到:https://github.com/mootools/mootools-core/blob/master/Source/Element/Element.js#L728
它将从dom和内存中删除该元素,并以安全的方式将其清空.一旦消失,它将依赖于浏览器的GC进行清理,mootools不会为您为元素本身做任何壮观的GC,但它也会在子节点上运行特殊的clean函数:var children = clean(this ).getElementsByTagName(‘*’);.
clean方法还摆脱了附加到div的子元素的任何事件处理程序和存储.
然后. mootools添加的事件进入元素存储.元素存储在元素原型使用的闭包后面的对象中.为了对其进行测试,我们将重新实现它并使它可打孔(称为存储的全局对象),以便我们可以检查父项消失后引用发生了什么:
http://jsfiddle.net/dimitar/DQ8JU/
(function() {
var storage = this.storage = {}; // make it puncturable
var get = function(uid){
return (storage[uid] || (storage[uid] = {}));
};
Element.implement({
retrieve: function(property, dflt){
var storage = get($uid(this)), prop = storage[property];
if (dflt != null && prop == null) prop = storage[property] = dflt;
return prop != null ? prop : null;
},
store: function(property, value){
var storage = get($uid(this));
storage[property] = value;
return this;
},
eliminate: function(property){
var storage = get($uid(this));
delete storage[property];
return this;
}
});
})();
// read it.
var link = document.getElement("a");
var uid = link.uid; // will reference the mootools unique id for it
// add an event handler
link.addEvent("click", function(e) {
console.log("hi");
this.destroy();
// see what's left in storage for that element.
console.log(storage[uid]);
// storage should be empty.
console.log(storage);
});
link.getFirst().addEvent("mouseenter", function() {
console.log("over");
});
// check to see if it is there via element storage API.
console.log(link.retrieve("events").click);
// check to see if it's there via our puncture
console.log(this.storage[uid]);
// see all events in storage, inc child element:
console.info(this.storage);
这一切证明的是,mootools会清理您需要清理的所有东西.只要您在所使用的元素上不使用任何内联onclick =东西,就可以了.在mootools的垃圾回收和浏览器之间,您可以轻松找到自己.请注意,如果回调是匿名的,则可以在单个元素上堆叠多个事件.
内容总结
以上是互联网集市为您收集整理的javascript-如果删除了元素,是否必须清除DOM中的事件?全部内容,希望文章能够帮你解决javascript-如果删除了元素,是否必须清除DOM中的事件?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。