jQuery – 差异.remove()vs .html(”)

在以下示例中,.remove()和.html(“”)之间是否存在差异? 我在哪里可以找到引用的JS代码?

HTML

...

JS

 $('.content').remove(); //vs $('.wrap').html(''); 

“基本上”他们一样,

但实际上(如果你对某些东西很挑剔)这就是区别:

 $('.wrap').html(''); console.log( $('body').html() ); // see below // 

VS:

 $('.content').remove(); console.log( $('body').html() ); // see below // 
// //

所以.remove()方法删除元素,而使用.html("")你实际上是格式化HTML Element只包含一个空字符串。

为什么.remove() 有很好的部分 ,这里有解释: http : //api.jquery.com/remove/

与.empty()类似,.remove()方法从DOM中获取元素。 如果要删除元素本身以及其中的所有内容,请使用.remove()。 除了元素本身之外,还删除了与元素关联的所有绑定事件和jQuery数据。 要删除元素而不删除数据和事件,请改用.detach()

所以基本上如果你有一些与你刚刚删除的元素相关的复杂内容,你的所有事件,数据,动作,引用等都将被垃圾收集,并且无法访问内存并获得一些性能。 .detach()你不需要重置ie,即你计划在将来某个时候将它们再次包含在DOM中的相同选择器的事件处理程序。

为什么上面有趣(因为它提到.empty() )是什么.html() 方法 ,当一个"string"用作参数时,它循环通过所有元素的选择器清理内部节点和数据( 以防止内存泄漏 ):

 jQuery.cleanData(getAll(elem, false)); elem.innerHTML = value; 

稍后在该循环内部,您可以看到如果使用innerHTML的值包含成功,则设置: elem = 0 // the innerHTML was successful!! YEY elem = 0 // the innerHTML was successful!! YEY

所以,是的,它使用elem.innerHTML来分配传递的参数值( 如果可能的话 )。

如果还有一个要匹配的eleminnerHTML是错误的或者是错误的错误),它的作用就是: this.empty().append( value );

所以让我们看看.empty()方法的作用( jQ源代码行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. } } 

现在是时候看看drem做了什么.remove() jQ源代码行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...) } 

在以下示例中,.remove()和.html(“”)之间是否存在差异?

没有显着差异,不,因为在您的示例中,唯一的.wrap元素包含唯一的.content元素。 这只是因为元素的关系才是真的。

在这两种情况下,jQuery将确保释放.content及其后代(如果有)引用的任何数据和事件处理程序,然后删除有问题的元素。 如果您对速度感到疑惑,那么答案几乎总是有所不同,所以如果重要的话请测试目标浏览器 ,但这个答案涉及删除节点和设置innerHTML之间的速度差异(答案让我感到惊讶)。

我在哪里可以找到引用的JS代码?

在jQuery源代码中 。


你的评论:

对于jQuery链接thx,当然我看了一下lib,但我找不到定义.html()函数的位置(sry,我是js的新手)

如果你是JavaScript的新手,我不建议你尝试理解jQuery源代码 – 它非常复杂,并且使用了很多技巧来保持大小,同时具有很多实用性。

但我要注意,因为在这一点上存在混淆,jQuery的html函数只是在有问题的元素上设置innerHTML 。 它做的远不止这些,以防止内存泄漏并释放不再需要的数据。 血腥的细节是在当前从第407行开始的manip.js中(虽然当然这个行号会随着时间的推移而改变),但同样,它是我在JavaScript教育中不会跃进的高级内容。

是的,你的例子中两者之间存在差异。

.remove() ;

如果要删除元素本身以及其中的所有内容,请使用.remove()。 因此,在您的情况下,只从DOM中删除

。 它会变成:

 
...

html的( ”);

用于设置元素的内容。 在你的情况下, .wrap中的所有div都被''替换。 它会变成: