使用innerHTML或者insertAdjacentHTML 创建元素的时候能给我们带来很大的方便,为domNode 赋予innerHTML 属性,在插入大量的HTML的时候,使用innerHTML要比多次创建dom效率高的多,这是因为在设置innerHTML 时候,浏览器会创建一个innerHTML解析器,这个解析器是在浏览器级别的代码(通常是C++编写的)基础上运行的,因此执行要比Javascript快得多。

不可避免地,创建和销毁HTML解析器也会带来性能的损失,因而应该将设置innerHTML的次数要尽量少,避免浏览器多次的创建HTML解析器,另外如果innerHTML有用户输入或者来自第三方网站,容易造成脚本的攻击,比如包含<script>的代码。同时如果使用这种方式创建的元素 之后又为之绑定了事件应先移除事件,如果要移除这段HTML的时候,应该先移除事件避免内存泄露。当然在创建的时候自己可以过滤是否包含攻击性的脚本,得到一个无害的文本。安全的创建节点的方式如下

首先在内存中创建一个文档片段,然后将要创建的元素添加到这个片段中,最后将片段添加到相应的位置即可

var docFragment = document.createDocumentFragment();
var greeting = document.createElement('P');
greeting.setAttribute("id", "greeting");
docFragment.appendChild(greeting);
var text = document.createTextNode("Hello ");
greeting.appendChild(text);
var b = document.createElement('B');
greeting.appendChild(b);
var text_0 = document.createTextNode("World");
b.appendChild(text_0);

 对于以上的方式 感觉这么多行代码有些麻烦,我们可以使用一个开源的html2dom 来实现HTML与Dom之间的转换。将HTML 生成如上的创建dom的javascript代码。通过这种的方式浏览器不会启用HTML解析器来解析一个长的字符串,也许会提高网站的性能。

如下两种使用方式

假设我想添加 <p id="greeting">Hello <b>World</b></p>  这段HTML到文档上,可以使用

var h2d = html2dom.parse('<p id="greeting">Hello <b>World</b></p>');
console.log(h2d);

会得到如下 :

var docFragment = document.createDocumentFragment(); // contains all gathered nodes
var greeting = document.createElement('P');
greeting.setAttribute("id", "greeting");
docFragment.appendChild(greeting);
var text = document.createTextNode("Hello ");
greeting.appendChild(text);
var b = document.createElement('B');
greeting.appendChild(b);
var text_0 = document.createTextNode("World");
b.appendChild(text_0);

可以看出,html2dom.parse将创建HTML实际上是通过javascript 创建dom来完成的。与第一个Demo的代码一致,只是html2dom将这个过程进行了封装。

如果想了解,javascript代码创建的是什么样的HTML 可以使用html2dom.dom2html

  

var inp = '<p id="greeting">Hello <b>World</b></p>';
var js = html2dom.parse(inp);
html2dom.dom2html(js, function callback(res) {
console.log("Input:", inp);
console.log("Result:", res);
});

结果

Input: <p id="greeting">Hello <b>World</b></p>
Result: <p id="greeting">Hello <b>World</b></p>

关于innerHTML以及html2dom的更多相关文章

  1. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  2. innerHTML和innerText的区别

    以<p id="example">welcome to <strong>JavaScript</strong> !!!</p>为例: ...

  3. textarea 中的 innerHTML 和 value

    <textarea></textarea> <input type="button" value="click" /> &l ...

  4. innerHTML on ie6-9

    https://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx The innerHTML property is read-only on ...

  5. innerHTML,outerHTML,innerText,outerText区别以及insertAdjacentHTML()方法

    在需要给文档插入大量的新的HTML标记的情况下,通过多次DOM操作先创建节点再指定它们之间的关系会非常麻烦而且效率不高,相对而言插入标记的方法会更加简单,速度也更快. 插入标记中有这四个属性inner ...

  6. innerHTML与innerText的异同

    在一道面试题中看到的. 1.功能讲解: innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 innerText 设置或获取 ...

  7. c#使用正则表达式抓取a标签的链接和innerhtml

    //读取网页html string text = File.ReadAllText(Environment.CurrentDirectory + "//test.txt", Enc ...

  8. innerHTML 与 innerText 的区别

    innerHTML指的是从对象的起始位置到终止位置的全部内容,包括Html标签.innerText 指的是从起始位置到终止位置的内容,但它去除Html标签.同时,innerHTML 是所有浏览器都支持 ...

  9. html()、text()、val()、innerHTML、value()的区分

    以上的方法可用于一般的html标签(div)与input中分别进行讨论 1.html(): jQuery方法,用于一般标签中,可读写,可以获得写入html标签. 2.text(): jQuery方法, ...

随机推荐

  1. css:层叠样式表-网页布局基础

    css:层叠样式表:一.写法分类: 1.内联(行内,写在标签里面,以属性的形式表现,属性名是style) 例:<table style="background-color: aqua& ...

  2. WordSmith2013-7-31

    WordSmith Good Evening Ladies and Gentlemen,I’am Jason,I’m pleasured  to be wordsmith tonight. First ...

  3. Tkinter Toplevel

       Tkinter Toplevel:顶层部件的工作,直接由窗口管理器管理的窗口.他们不必在它们上面的父widget   顶层部件的工作,直接由窗口管理器管理的窗口.他们不必在它们上面的父widge ...

  4. Visual Studio 进行Excel相关开发,Microsoft.Office.Interop.Excel.dll库

    1. Interop.Excel.dll 的查找 本文中将 Microsoft.Office.Interop.Excel.dll库简称为Interop.Excel.dll库 其实在使用Visual S ...

  5. Subversion Self Signed Certificates

    When connecting to Subversion repositories using SSL connections the SVN client checks the server ce ...

  6. Unity协程使用经验

    [Unity协程使用经验] 1.协程的好处是,异步操作发起的地方和结束的地方可以统一在一个方法,这样就不用引入额外的成员变量来进行状态同步. 2.在一个协程中,StartCoroutine()和 yi ...

  7. memcache分布式的高速缓存系统

    http://baike.baidu.com/link?url=8v9IdWg0i_ptrTfz0APh32-SbvNUAWvXrcZM5vuJ8BrjCR2oylrieOXJ3vkSuRAq3kQV ...

  8. cf499B-Lecture 【map】

    http://codeforces.com/problemset/problem/499/B B. Lecture     You have a new professor of graph theo ...

  9. java程序员应该熟悉的20个有用的库(转)

    优秀且经验丰富的Java开发人员的一个特点是API的广泛知识,包括JDK和第三方库.我花了很多时间学习API,特别是在阅读Effective Java 3rd Edition之后,Joshua Blo ...

  10. const&static&extern

    const 结论: 如果const写在指针变量名的旁边, 那么指针的指向不能变, 而指向的内存空间的值可以变 如果const写在数据类型的左边或者右边, 那么指针的指向可以改变, 但是指向的内存空间的 ...