innerHTML 的些摘记

作者:手气不错 来源:gracecode.com 时间:2009-06-01 15:42:00 

异步 innerHTML

innerHTML 插入节点的性能的问题,通常是我们最关注的。在回答这问题时James Padolsey 给出了他的解决方案,看到上述代码不仅赞叹了下:

function asyncInnerHTML(HTML, callback) {    var temp = document.createElement('div'),        frag = document.createDocumentFragment();    temp.innerHTML = HTML;    (function(){        if(temp.firstChild) {            frag.appendChild(temp.firstChild);            setTimeout(arguments.callee, 0);        } else {            callback(frag);        }    })();}

  1. 充分利用闭包解决 IE6 的内存溢出问题

  2. 使用延时 0 将操作从队列中拉出,防止浏览器假死

  3. Document Fragment 给予我们个相当好的沙盘,只是我们经常忘记了它

  4. 回调的节点可以使用 DOM 标准的手法(appendChild)插入

了解了参数就很容易调用,例如

var htmlStr = '<div><p>...</p><p>...</p><div><div>...</div>';asyncInnerHTML(htmlStr, function(fragment){    document.body.appendChild(fragment);});

再次不禁赞叹下!

组织 innerHTML 字符串

说到 innerHTML ,通常在这操作之前会有大部分的字符串操作用于连接节点。考虑下面的三种做法,有何不同

方式一

var arr = ['item 1', 'item 2', 'item 3', ...];for (var i = 0, l = arr.length, list = ''; i < l; i++) {    list += '<li>' + arr[i] + '</li>';}list = '<ul>' + list + '</ul>';

方式二

var arr = ['item 1', 'item 2', 'item 3', ...];for (var i = 0, l = arr.length, list = []; i < l; i++) {    list[list.length] = '<li>' + arr[i] + '</li>';}list = '<ul>' + list.join('') + '</ul>';

方式三

var arr = ['item 1', 'item 2', 'item 3', ...];var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';

详细的对比测试在这里(没错,还是 James Padolsey 那小子的 Blog)。同时,PPK 也整理了份有关 innerHTML 的速度测试报告

IE 的陷阱

对于 IE,innerHTML 有个不大不小的陷阱(via),就是在 tbody 中插入 innerHTML 时,会报莫名的“未知的运行错误”。

测试地址在这里(经过测试,在 IE8 中仍然如此)。有兴趣的同学可以参看更详细的信息

标签:innerHTML,异步,性能
0
投稿

猜你喜欢

  • 关于 MediaPlayer 播放器参数详解

    2008-08-10 18:33:00
  • ASP生成静态模版技术(带参数的标签)

    2009-03-03 12:29:00
  • 在SQL查询中使用LIKE来代替IN查询的方法

    2011-09-30 11:10:18
  • 记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制

    2010-04-07 22:35:00
  • asp中Access与Sql Server数据库区别总结

    2007-11-18 15:08:00
  • Flash在某些多标签浏览器中的“伪沙箱”问题

    2011-01-06 12:37:00
  • 5 个简单实用的 CSS 属性

    2010-03-10 11:00:00
  • 讲解SQL Server2005数据项的分拆与合并

    2009-01-04 14:40:00
  • 安装了Office2003补丁之后,access不能用,打不开了

    2011-05-12 12:19:00
  • 重命名SQLServer数据库的方法

    2012-07-11 15:39:37
  • DHTML中重要的属性方法

    2008-06-21 17:13:00
  • 建立合理的索引提高SQL Server的性能

    2009-01-23 14:44:00
  • ORACLE 数据库RMAN备份恢复

    2009-04-24 12:23:00
  • sqlserver索引的原理及索引建立的注意事项小结

    2012-08-21 10:54:34
  • oracle 存储过程和触发器复制数据

    2009-11-17 09:12:00
  • Oracle与MySQL删除字段时对索引和约束的处理

    2008-12-26 16:41:00
  • JS中实现JAVA的hashCode算法

    2008-08-03 17:00:00
  • 如何判断JavaScript变量的类型

    2009-02-25 12:28:00
  • Insert into与AddNew哪一个更好?

    2009-10-28 18:30:00
  • 网站通过W3C标准注意点

    2010-01-14 20:15:00
  • asp之家 网络编程 m.aspxhome.com