javascript 异步的innerHTML使用分析

当然,这个分时加载技术只是一个辅助技术,本身没有添加节点的能力。如今,另一种更奇特的技术Asynchronous innerHTML又被开发出来了,不能不赞一下外国人在这方面研究是非常超前的。


代码如下:

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);//利用异步调用自身拼凑文档碎片,直到div的节点被搬空
} else {
callback(frag);//这里才是真正执行插入节点的操作
}
})();
}

此技术的优点:
1. 利用闭包解决 IE6 的内存溢出问题
2. 利用setTimeout(fn,0) 这个hack将操作从队列中拖出,防止浏览器假死
3. 利用Document Fragment减少对页面的渲染次数
4. 回调的节点可以使用 DOM 标准的手法(appendChild)插入(如IE的table,tbody,tr,td等标签的innerHTML是只读的)
使用方法:


代码如下:

var htmlStr = '<div><p>...</p><p>...</p><div><div>...</div>';
asyncInnerHTML(htmlStr, function(fragment){
// You can treat 'fragment' as a regular node.
document.body.appendChild(fragment);
});

不过,这个方法在table中添加节点时并不是个个浏览器都行得通,不得不说是一大败笔。经测试IE8,IE6,FF3.5渲染出现差错,chrome,safari4,opera10等能完好地把表格渲染出来。估计是IE8等在把节点转移到文档碎片时发生节点丢失现象。

.filament_table {
border-collapse:collapse !important;
border-top:1px solid #A9EA00;
border-left:1px solid #C1DAD7;
table-layout:fixed;
width:400px;
}
.filament_table thead th {
background:#A9EA00;
color:#FCDE6A;
border-bottom:1px solid #C1DAD7;
border-right:1px solid #C1DAD7;
padding:2px 5px;
}
.filament_table tbody td,.filament_table tbody th {
border-bottom:1px solid #C1DAD7;
border-right:1px solid #C1DAD7;
padding:2px 5px;
color:#76C2C3;
}
.filament_table tfoot td {
border-bottom:1px solid #C1DAD7;
border-right:1px solid #C1DAD7;
background:#A9EA00;
color:#FCDE6A;
font-size:12px;
padding:0;
}
.filament_table tbody td a{
text-decoration:none;
color:#76C2C3;
}
.filament_table tbody tr:nth-child(even) {
background:#F7FBFF;
}

var getData = function(){
var builder = [];
for(var i=0;i

目录");
builder.push(i);
builder.push(" 商品");
builder.push(i);
builder.push(" 商品");
builder.push(i);
builder.push("

");
}
return builder.join('');
}

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);//这里才是真正执行插入节点的操作
}
})();
}
addData = function(){
asyncInnerHTML(getData(),function(flag){
var tbody = document.getElementById("test");
tbody.appendChild(flag);
})
}

异步的innerHTML

开始

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

在FF3.5的firebug显示下,table新添加的节点,标签都丢失了。


在IE8的开发人员工具中,我们发现table新添加节点出错严重,见于IE一惯的表现,这是很正常的事!


相关演示可见无忧的贴子,发现这种方法不是最佳的插入动态内容的方法。

#myTable{height:300px;overflow:auto;border:1px solid #39F;width:600px; }
table,td,th{font-size:12px;border-collapse:collapse;height:100%;border:1px solid #39F; }
tr.odd{background:#B1E4F3; }
td.index{background:#B1E4F3;color:#000066;text-align:center; }

1 姓名1 20 1987-12-7 这个人很懒,什么都没有留下

freeFor=function(i,to,fn){
(function(){
fn(i);
i++

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • javascript innerHTML、outerHTML、innerText、outerText的区别

    1.功能讲解: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取位于对象起始和结束标签内的文本 outerText 设置(包括标签)或获取(不包括标签)对象的文本 2.示例 <html> <head> <title>Demo</title> <style><!-- body {font-family:"宋体";

  • js innerHTML 的一些问题的解决方法

    然而,你需要知道 innerHTML 有一些自身的问题: 1.当 HTML 字符串包含一个标记为 defer 的 script 标签(<script defer>-</script>)时,如 innerHTML 属性处理不当,在 Internet Explorer 上会引起脚本注入攻击.  2.设置 innerHTML 将会破坏现有的已注册了事件处理函数的 HTML 元素,会在某些浏览器上引起内存泄露的潜在危险. 还有几个其他次要的缺点,也值得一提的: 1.你不能得到刚刚创建的元素

  • javascript innerHTML使用分析

    空格处理 当在DIV中输入"a[任意个空格]a" HTML呈现在Chrome和IE下是一样的:只显示一个空格. innerHTML属性 IE还是两个a加一个空格, Chrome则是原始输入的样子. 回车 当在DIV中输入"a[回车][任意个空格]a"时,HTML呈现Chrome和IE是一样的. innerHTML属性 IE是3个字符,在两个a中间加了个空格. Chrome则是原始输入的样子,将回车解析为\n. HTML标记 当在DIV中输入"a<Br

  • js innerHTML 改变div内容的方法

    改变文字innerHTML每个HTML元素具有InnerHtml属性定义的HTML代码和文字之间发生的元素的开幕式和闭幕式标记.通过改变一个元素的innerHTML后,一些用户交互,您可以更互动网页.但是,使用innerHTML需要一些准备,如果你希望能够利用它轻松,可靠.首先,你必须给予部分要更改身份证.与标识到位,你将能够使用getElementById功能,适用于所有的浏览器.在您认为建立您现在就可以操纵文字的要素.要开始了,让我们尝试改变文字一个大胆的标记.下面我们来看一个用js的inn

  • JS中innerHTML和pasteHTML的区别实例分析

    本文实例讲述了JS中innerHTML和pasteHTML的区别.分享给大家供大家参考,具体如下: innerHTML 是一个属性,可以取得或者设定该元素内的 HTML 内容,可以是任意能包含 HTML 子节点的元素都使用它 pasteHTML()是一个方法,在指定的文字区域内替换该区域内的文本或者HTML,该方法必须应用于一个 createTextRange() 或者 document.selection.createRange() 创建的区域上 例: <Script Language="

  • JavaScript中innerHTML,innerText,outerHTML的用法及区别

    不废话了,请看下文示例介绍. 用法: <div id="test"> <span style="color:red">test1</span> test2 </div> 在JS中可以使用: test.innerHTML: 也就是从对象的起始位置到终止位置的全部内容,包括Html标签. 上例中的test.innerHTML的值也就是"<span style="color:red">

  • JS实现pasteHTML兼容ie,firefox,chrome的方法

    本文实例讲述了JS实现pasteHTML兼容ie,firefox,chrome的方法.分享给大家供大家参考,具体如下: <html> <body> <script language="JavaScript"> function test() { if (document.selection && document.selection.createRange) { var myRange = document.selection.cre

  • javascript 异步的innerHTML使用分析

    当然,这个分时加载技术只是一个辅助技术,本身没有添加节点的能力.如今,另一种更奇特的技术Asynchronous innerHTML又被开发出来了,不能不赞一下外国人在这方面研究是非常超前的. 复制代码 代码如下: function asyncInnerHTML(HTML, callback) { var temp = document.createElement('div'), frag = document.createDocumentFragment(); temp.innerHTML =

  • Javascript中innerHTML用法实例分析

    本文实例讲述了Javascript中innerHTML用法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: <html> <head> <script type="text/javascript"> function t(){  var cont = document.getElementById('container');  var htmlcode = "<p>哈哈哈哈</p>";  

  • JavaScript数组方法总结分析

    由于最近都在freecodecamp上刷代码,运用了很多JavaScript数组的方法,因此做了一份关于JavaScript教程的整理,具体内容如下: 一.普通方法 1.join() 将数组元素连接在一起,并以字符串形式返回 参数:可选,指定元素之间的分隔符,没有参数则默认为逗号 返回值:字符串 对原数组的影响:无 2.reverse()将数组的元素顺序变成倒序返回 参数:无 返回值:数组 对原数组的影响:原数组被修改为倒序排列之后的数组 3.sort()对数组元素进行排序并返回 参数:可选,排

  • javascript中innerHTML 获取或替换html内容的实现代码

    innerHTML 属性用于获取或替换 HTML 元素的内容,语法为Object.innerHTML 其中1.Object是获取的元素对象,如通过document.getElementById("ID")获取的元素:2.注意书写,innerHTML区分大小写. 我们通过id="light"获取<div> 元素,并将元素的内容输出和改变元素内容,代码如下: <!DOCTYPE html> <html> <head> &l

  • JavaScript实例 ODO List分析

    目录 一.实例代码 HTML CSS JavaScript 二.实例演示 三.实例剖析 一.实例代码 HTML <!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <meta http-equiv="X-UA-Compatible" content="IE=edge">   <me

  • JavaScript实例 ODO List分析

    目录 一.实例代码 HTML CSS JavaScript 二.实例演示 三.实例剖析 一.实例代码 HTML <!DOCTYPE html> <html lang="en"> <head>   <meta charset="UTF-8">   <meta http-equiv="X-UA-Compatible" content="IE=edge">   <me

  • JavaScript中innerHTML使用方法实例

    目录 innerHTML innerHTML的写法 总结 innerHTML innerHTML属性允许更改html元素的内容,可以设置或返回表格行的开始和结束标签之间的HTML,本篇文章就来给大家介绍关于innerHTML的用法 innerHTML的写法 对于element,设置innerHTML指定的元素名称 element.innerHTML; 将指定元素的html代码分配给变量 var sample1 = element.innerHTML 用指定元素替换变量的值 通过如下编写,可以在删

  • Javascript this关键字使用分析

    关于js中的this关键字的文章已经不少了,我看过几篇,我写这篇文章的目的是从实例中分析出this的工作原理,希望对大家有所帮助. 一.基本的: 复制代码 代码如下: function doSomething(){ alert(this.id); } alert(window.doSomething);//证明了doSomething是属于window的 doSomething();//undefined window.onload = function(){ document.getEleme

随机推荐