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
来分配传递的参数值( 如果可能的话 )。
如果还有一个要匹配的elem
( innerHTML
是错误的或者是错误的错误),它的作用就是: 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
都被''
替换。 它会变成: