问题代码:
首先看下面一段代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="content-type" />
<script src="jquery-1.3.2.js" type="text/javascript">
</script>
<style type="text/css">
#inner {
margin:0 auto;
width:150px;
height:50px;
border:1px solid green;
}
</style>
<script type="text/javascript">
$(function(){
$("#inner").click(function(){
//错误,引起内存泄露
$("#test")[0].innerHTML="";
//正确做法
//$("#test").empty();
});
});
</script>
<title>测试</title>
</head>
<body>
<div style="height:500px;width:500px;border:1px solid red;padding-top:100px;" id="test">
<div id="inner">click to remove me</div>
</div>
</body>
</html>
场景:
inner div 就是常见的我们可能使用 ajax 从服务器动态构造的元素,或者注入的片断html,效果为点击 inner 后就把它以及它的兄弟清除出去,依照传统的思路,直接 innerHTML =“” 就好了 ,可能你会想到所有删除元素的事件监听器应该清楚掉,但是对于除了 ie6 (引起内存泄露)以外的浏览器,清除事件监听器不是必要的 。
jquery 机制:
但是可以确定的是在 jquery 中用 innerHTML 的方法来清空元素,是必然会导致内存泄露的,由于 jquery 对于同一元素多事件处理没有直接采用浏览器事件模型,而是自己缓存事件,遍历触发,以及便于 trigger 程序触发 :
// Init the element's event structure
var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
jQuery.event.handle.apply(arguments.callee.elem, arguments) :
undefined;
});
采用 data 方法,将一些数据关联到了元素上面,上述事件即是采用该机制缓存事件监听器。
那么就可以知道,直接 innerHTML=“” 而不通知 jquery 清空与将要删除元素关联的数据,那么这部分数据就再也释放不了了,即为内存泄露。
解决:
jquery 已经想到了这一方面,提供了 empty 函数,其思想就是,对节点的所有子,孙,重孙.....节点( $("*",this) ),先清空它们关联的数据,再进行节点的删除:
remove: function( selector ) {
if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
// Prevent memory leaks
jQuery( "*", this ).add([this]).each(function(){
jQuery.event.remove(this);
jQuery.removeData(this);
});
if (this.parentNode)
this.parentNode.removeChild( this );
}
},
empty: function() {
// Remove element nodes and prevent memory leaks
jQuery(this).children().remove();
// Remove any remaining nodes
while ( this.firstChild )
this.removeChild( this.firstChild );
}
分享到:
相关推荐
这意味着你不能直接在这些对象上调用DOM原生的方法,如`innerHTML`,而是需要使用jQuery的方法,如`html()`。 在jQuery对象和DOM对象之间转换是常见的需求。一个DOM对象可以通过`$()`包裹成jQuery对象,例如`$...
DOM对象可以通过`$()`包裹转换为jQuery对象,反之,若需使用DOM对象的方法,如`.innerHTML`或`.style`,则需从jQuery对象中取出DOM对象。例如,`$("#msg")[0]`或`$("#msg").get(0)`可获取第一个DOM元素。 获取...
需要注意的是,jQuery对象与DOM对象不兼容,不能混用它们的方法,否则会导致错误。 将DOM对象转换为jQuery对象很简单,只需使用`$()`包裹DOM对象即可。相反,要将jQuery对象转换回DOM对象,有两种方式:使用索引...
这种转换非常重要,因为某些情况下可能需要使用原生DOM方法(例如`innerHTML`),而其他时候则需要使用jQuery提供的方法(例如`html()`)。 #### 三、获取jQuery集合的某一项 当获取到多个元素的集合时,可以通过...
### Jquery 使用大全 #### 关于页面元素的引用 在网页开发中,通过 jQuery 的 `$()` 方法能够方便地引用页面中的各种元素。这些元素可以基于 ID、类名、元素名称甚至是复杂的 DOM 或 XPath 条件来进行选取。需要...
在这个模板中,使用的是jQuery 1.6.2版本,虽然较旧,但仍然能够提供基本的DOM操作、事件处理和动画功能。 2. **密码键盘实现**:模板的核心功能是点击密码输入框时弹出一个包含字母和数字的小键盘。这通常通过监听...
3. **使用jQuery或其他库**:许多JavaScript库,如jQuery,已经处理了这样的兼容性问题。使用`empty()`方法可以安全地清空元素内容,同时保持子元素的结构。 4. **避免不必要的innerHTML操作**:在可能的情况下,...
在使用FileSaver.js和jquery.wordexport.js时,还需要注意数据的安全性和隐私问题,因为它们允许用户直接下载页面内容。确保用户只能下载他们有权访问的信息,并且避免敏感数据的泄露。此外,对于大型或复杂的数据,...
### jQuery使用技巧详解 #### 一、页面元素的引用 在使用jQuery时,我们通常会通过`$()`函数来选择页面中的元素。这个函数支持多种选择器语法,包括但不限于: - **ID选择器**:例如`$("#id")`用于选取具有特定ID...
您也许已经注意到在我们的实例中的所有 jQuery 函数位于一个 document ready 函数中: $(document).ready(function(){ --- jQuery functions go here ---- }); 这是为了防止文档在完全加载(就绪)之前运行 jQuery...
值得注意的是,jQuery对象不能直接调用DOM对象的方法。 2. jQuery对象与DOM对象的转换: jQuery对象拥有jQuery定义的一系列方法,而DOM对象则适用于原生JavaScript的方法。将DOM对象转换为jQuery对象,可以使用`$...
而使用JQuery这样的JavaScript库可以在客户端快速完成验证工作,从而提高应用性能。 #### 二、JQuery简介 JQuery是一个快速、简洁的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画以及Ajax交互等操作...
在使用jQuery时,还需要注意jQuery对象与原生JavaScript对象(即DOM对象)之间的转换问题。虽然jQuery本质上是JavaScript,但它们在使用时有所区别。如果需要使用jQuery的方法和属性,则必须确保操作的对象是jQuery...
- **注意事项**:`get`和`eq`的区别在于,`eq`返回的是jQuery对象,而`get`返回的是原生DOM对象。因此,对于`$("p").get(1)`,需要使用`innerHTML`方法来获取内容;而对于`$("p").eq(1)`,则应使用`html()`方法。 *...
接下来,需要特别注意的是,在使用jQuery时,即使可以访问底层DOM元素并获取或设置innerHTML,也应该使用jQuery的方法,而不是直接操作DOM属性。比如,获取jQuery对象的值应该用val()方法,而不是直接访问DOM属性。...
值得注意的是,这些选择器返回的是jQuery对象,而不是原生的DOM元素,因此你需要使用jQuery的方法,如`.html()`、`.css()`等,而不是DOM的`.innerHTML`、`.style`属性。 要将DOM对象转换为jQuery对象,可以使用`$...
在使用jQuery.query.js时,确保正确引入jQuery库,并在引入后加载jQuery.query.js。同时,由于其语法与jQuery原生API有所不同,可能需要一些时间适应。在实际项目中,合理地结合使用jQuery.query.js和其他jQuery插件...
在使用选择器时需要注意避免过于复杂的选择器,以免影响性能。同时,合理利用层次关系可以减少查询范围,提高效率。 通过以上内容的学习,我们可以了解到jQuery作为一款优秀的JavaScript库,在网页开发中发挥着...