$().html(value) vs $().empty().append(value)
当需要清空某个dom结点内容时,我所知道的有两种方法:
1.Element.removeChild(child)
// Removing all children from an element
var element = document.getElementById("test");
while (element.firstChild) {
element.removeChild(element.firstChild);
}
2.Element.innerHTML=""
第一种方式虽然可读性较好,但显然不如第二种方法简洁。
理论上方式2会比方式1快很多,从代码上来分析也是如此,至少方式二不用做while循环,也不用判断属性。事实上也的确如此,但只限于子结点较少的情况下。
在子结点个数多过的情况下,方式1是优于方式2的。性能测试之killing a lots of kids
jquery提供了两个类似的接口与之相对应:
1.$().empty()
2.$().html('')
所以,替换dom内容也同样有两种方式:
1.$().empty().append(HTMLString|HTMLElement|jQueryElement)
2.$().html(HTMLString)
jQuery 1.9.1 empty方法实现如下,与方式1相似
empty: function() {
var elem,
i = 0;
for ( ; (elem = this[i]) != null; i++ ) {
// Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem, false ) );
}
// Remove any remaining nodes
while ( elem.firstChild ) {
elem.removeChild( elem.firstChild );
}
// If this is a select, ensure that it displays empty (#12336)
// Support: IE<9
if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
elem.options.length = 0;
}
}
return this;
}
jQuery 1.9.1 html方法的实现:
html: function( value ) {
return jQuery.access( this, function( value ) {
var elem = this[0] || {},
i = 0,
l = this.length;
if ( value === undefined ) {
return elem.nodeType === 1 ?
elem.innerHTML.replace( rinlinejQuery, "" ) :
undefined;
}
// See if we can take a shortcut and just use innerHTML
if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
value = value.replace( rxhtmlTag, "<$1></$2>" );
try {
for (; i < l; i++ ) {
// Remove element nodes and prevent memory leaks
elem = this[i] || {};
if ( elem.nodeType === 1 ) {
jQuery.cleanData( getAll( elem, false ) );
elem.innerHTML = value;
}
}
elem = 0;
// If using innerHTML throws an exception, use the fallback method
} catch(e) {}
}
if ( elem ) {
this.empty().append( value );
}
}, null, value, arguments.length );
},
可以看到,当传入的参数不为html字符串时,会执行这样的语句:
if ( elem ) {
this.empty().append( value );
}
不言而喻,当传入的参数不为html字符串或html字符串较长时,$().empty().append(value)的性能会优于$().html(value),性能测试之jquery html vs empty append;
同时,基于代码可读性也建议优先使用$().empty().append(value)
refs :
jquery-html-vs-empty-append
kill-lots-kids
deleting-child-nodes-of-a-div-node
Element.innerHTML
随机推荐
- 使用HttpClient操作ASP.NET Web API 2.1增删改查
使用NuGet包安装Microsoft ASP.NET Web API 2.1 Client Libraries, 调用方式代码如下: HttpClient client = new HttpClie ...
- 完美搞定《DOCKER IN ACTION》第二章示例
起来!!!命令如下: 建立第一个web docker docker run --detach --name web nginx:latest 建立第二个web_test docker docker r ...
- HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)
Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...
- poj 2486( 树形dp)
题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...
- QUnit使用笔记-3测试用户操作
模拟操作: elem.trigger(event); elem.triggerHandler(event); triggerHandler的不同: 不会引起事件的默认行为 .trigger() 会操作 ...
- oracle处理考勤时间,拆分考勤时间段的sql语句
最近一直在用mysql数据库做云项目,有段时间没有接触oracle了,昨天有朋友叫我帮忙用oracle处理一个考勤记录的需求,我在考虑如何尽量精简实现上面花了一些时间.于是把这个实现做个总结. 需求如 ...
- win 7 普通家庭版 装IIS
每当一个程序员入职的时候,几乎都会干一件事情,就是重装操作系统,这是一场不易之战: 1)耗时太长: 2)容易遇到怪异的系统行为. 1.win7为毛装不上VS2012 先装一个win7 x64 旗舰版, ...
- KVM切换器
所谓KVM,就是Keyboard.Video.Mouse的缩写,正式的名称为多计算机切换器.简单的说,就是一组键盘.显示器和鼠标,控制2台.4 台.8台.16台甚至到4096台以上的计算机主机. KV ...
- 如何把car中的模块导入adams/view中
在你的adams安装目录下的acar文件夹下找到acar.cfg文件,将里面的 MDI_ACAR_PLUS_AVIEW 后面的no改成yes,在car中的tool下面就可以找到进入view环境的命令了 ...
- ZOJ 3911 Prime Query ZOJ Monthly, October 2015 - I
Prime Query Time Limit: 1 Second Memory Limit: 196608 KB You are given a simple task. Given a s ...