“基本上”他们是一样的,
但实际上(如果你对东西很挑剔的话)这里有区别:
$('.wrap').html('');
console.log( $('body').html() ); // see below
// <div class="wrap"></div>
对比:
$('.content').remove();
console.log( $('body').html() ); // see below
// <div class="wrap">
//
// </div>
所以.remove() 方法会删除元素,而使用.html("") 您实际上是在将HTML Element 格式化为仅包含一个空字符串。
为什么.remove() 有它的优点在这里解释:http://api.jquery.com/remove/
与 .empty() 类似,.remove() 方法将元素从 DOM 中取出。当您想要删除元素本身以及其中的所有内容时,请使用 .remove()。除了元素本身,所有与元素关联的绑定事件和 jQuery 数据都将被删除。要删除元素而不删除数据和事件,请改用 .detach()
所以基本上,如果您有一些与刚刚删除的元素相关的复杂内容,那么您的所有事件、数据、操作、引用等都将被垃圾收集,并且无法利用内存访问并获得一些性能。 .detach()-ing 他们你不需要重置,即你计划在未来某个时候将它们再次包含到 DOM 中的相同选择器的事件处理程序。
为什么上述有趣(因为它提到了.empty())是.html()method does,当"string"用作参数时,它循环通过所有元素的选择器清理内部节点和数据( 为了防止内存泄漏):
jQuery.cleanData(getAll(elem, false));
elem.innerHTML = value;
稍后在该循环中,您可以看到如果使用 innerHTML 的值包含成功,它会设置:elem = 0 // the innerHTML was successful!! YEY
是的,它使用elem.innerHTML 来分配传递的参数值(如果可能)。
如果仍然有一个 elem 匹配(innerHTML 是错误的或捕获的错误),它的作用很简单:this.empty().append( value );
那么让我们看看.empty() 方法到底做了什么(jQ source line 309)
for ( ; (elem = this[i]) != null; i++ ) { // Loops the selectors
if ( elem.nodeType === 1 ) { // If it's an Element node
jQuery.cleanData( getAll( elem, false ) ); // Prevent memory leaks
elem.textContent = ""; // Remove any remaining nodes
// using the native textContent
// which is from jQ v2 I think.
}
}
现在是时候看看 .remove()jQ source line 359 做了什么:
remove: function (selector, keepData /* Internal Use Only */ ) {
// the .detach() method uses keepData, but not we,
// we're only using .remove() as a bound Method to our selector
// so `elems>>>this` in the code below will be our fella.
var elem,
elems = selector ? jQuery.filter(selector, this) : this,
i = 0;
for (;
(elem = elems[i]) != null; i++) {
if (!keepData && elem.nodeType === 1) { // yes, no keepData!
jQuery.cleanData(getAll(elem)); // remove all data stored
}
if (elem.parentNode) { // Yes, our element has a parentNode
if (keepData && jQuery.contains(elem.ownerDocument, elem)) { //no..
setGlobalEval(getAll(elem, "script")); // not our case...
}
elem.parentNode.removeChild(elem); // jQ data are removed now go with
// the native way of doing things!
}
}
return this; // (maintains Methods chainability...)
}