看到一遍文章
When innerHTML isn’t Fast Enough,反应了innerHTML在操作量大了以后的性能下降的问题。
并且给出了一个replaceHTML的函数
function replaceHtml(el, html) {
var oldEl = typeof el === "string" ? document.getElementById(el) : el;
/*@cc_on // Pure innerHTML is slightly faster in IE
oldEl.innerHTML = html;
return oldEl;
@*/
var newEl = oldEl.cloneNode(false);
newEl.innerHTML = html;
oldEl.parentNode.replaceChild(newEl, oldEl);
/* Since we just removed the old element from the DOM, return a reference
to the new element, which can be used to restore variable references. */
return newEl;
};
用这个函数来代替innerHTML后在不同浏览器中的性能表现为:
Safari 3:
5000 elements…
innerHTML (destroy only): 63ms
innerHTML (create only): 390ms
innerHTML (destroy & create): 484ms
replaceHtml (destroy only): 47ms (1.3x faster)
replaceHtml (create only): 15ms (26.0x faster)
replaceHtml (destroy & create): 62ms (7.8x faster)
Done.
10000 elements…
innerHTML (destroy only): 110ms
innerHTML (create only): 3500ms
innerHTML (destroy & create): 4735ms
replaceHtml (destroy only): 110ms (~ same speed)
replaceHtml (create only): 31ms (112.9x faster)
replaceHtml (destroy & create): 141ms (33.6x faster)
Done.
Firefox 3:
5000 elements…
innerHTML (destroy only): 863ms
innerHTML (create only): 522ms
innerHTML (destroy & create): 1421ms
replaceHtml (destroy only): 20ms (43.1x faster)
replaceHtml (create only): 225ms (2.3x faster)
replaceHtml (destroy & create): 239ms (5.9x faster)
Done. 10000 elements…
innerHTML (destroy only): 5521ms
innerHTML (create only): 2626ms
innerHTML (destroy & create): 8528ms
replaceHtml (destroy only): 39ms (141.6x faster)
replaceHtml (create only): 373ms (7.0x faster)
replaceHtml (destroy & create): 422ms (20.2x faster)
Done.
Opera 9.5:
5000 elements…
innerHTML (destroy only): 16ms
innerHTML (create only): 141ms
innerHTML (destroy & create): 94ms
replaceHtml (destroy only): 16ms (~ same speed)
replaceHtml (create only): 78ms (1.8x faster)
replaceHtml (destroy & create): 125ms (1.3x slower)
Done.
10000 elements…
innerHTML (destroy only): 31ms
innerHTML (create only): 156ms
innerHTML (destroy & create): 312ms
replaceHtml (destroy only): 31ms (~ same speed)
replaceHtml (create only): 203ms (1.3x slower)
replaceHtml (destroy & create): 157ms (2.0x faster)
Done.
IE7:
1000 elements…
innerHTML (destroy only): 0ms
innerHTML (create only): 0ms
innerHTML (destroy & create): 0ms
replaceHtml (destroy only): 0ms (~ same speed)
replaceHtml (create only): 0ms (~ same speed)
replaceHtml (destroy & create): 0ms (~ same speed)
Done.
15000 elements…
innerHTML (destroy only): 31ms
innerHTML (create only): 156ms
innerHTML (destroy & create): 172ms
replaceHtml (destroy only): 32ms (~ same speed)
replaceHtml (create only): 157ms (~ same speed)
replaceHtml (destroy & create): 188ms (1.1x slower)
Done.
似乎在IE上没有什么改进,但是在其它浏览器上效果明显。
经常使用的prototype.js里是调用Element.update(element,content)来完成innerHTML操作的,打开prototype.js文件,修改update的部分
update: function(element, content) {
element = $(element);
if (content && content.toElement) content = content.toElement();
if (Object.isElement(content)) return element.update().insert(content);
content = Object.toHTML(content);
element.innerHTML = content.stripScripts();
content.evalScripts.bind(content).defer();
return element;
},
用replaceHTML函数代替element.innerHTML = content.stripScripts();这行就可以了。
update: function(element, content) {
element = $(element);
if (content && content.toElement) content = content.toElement();
if (Object.isElement(content)) return element.update().insert(content);
content = Object.toHTML(content);
element = replaceHtml(element, content.stripScripts());
content.evalScripts.bind(content).defer();
return element;
},
分享到:
相关推荐
3. **安全问题**:使用`innerHTML`设置用户输入的内容时,需要注意XSS(跨站脚本攻击)风险。不适当的使用可能导致恶意代码执行,因此需要进行适当的输入验证和编码。 4. **与innerText的区别**:`innerText`属性与...
在JavaScript中,`innerHTML`属性是一个非常...在进行动态HTML插入时,考虑到性能、安全性和可维护性,建议尽可能避免使用`innerHTML`来插入包含JavaScript的HTML字符串。如果确实需要,可以使用上述提到的替代方法。
然而,在某些情况下,直接使用 `innerHTML` 可能会导致性能下降,特别是在 Firefox 和 Safari 这样的浏览器中。为了提高性能,我们可以采用一种名为 `replaceHtml()` 的 DOM 方法。 `replaceHtml()` 函数的主要目的...
- 在处理大量数据或进行频繁更新时,`innerText`可能比`innerHTML`提供更好的性能。 - 对于需要支持所有浏览器的项目,建议使用`textContent`代替`innerText`。 通过以上介绍,我们可以看出`innerHTML`和`innerText...
在JavaScript中,向DOM(文档对象模型)动态添加元素是常见的操作,这通常...记得在进行性能优化时,应先确保代码的可读性和可维护性,再考虑性能优化,因为性能问题通常只在处理大量数据或者高频率操作时才变得显著。
频繁地改变`innerHTML`可能会导致性能问题,因为浏览器需要解析和重新渲染整个元素的内容。因此,在处理大量数据时,更推荐使用`createDocumentFragment`或`appendChild`等方法,它们可以提高性能。 总结来说,通过...
4. **性能考虑**:innerHTML虽然方便,但其动态更新DOM可能导致性能问题。在大型应用中,这可能不是最佳选择,但对于小规模的项目,尤其是在追求简洁性时,这种牺牲可能是值得的。 5. **安全问题**:使用innerHTML...
此外,现代浏览器优化了`innerHTML`的性能,使得它在处理大量元素时仍然具有竞争力。 总结来说,选择`createElement`还是`innerHTML`应根据具体场景来决定。如果关注性能,需要考虑元素的数量、是否涉及复杂的字符...
本文将探讨如何利用innerHTML实现页面元素的隐藏与显示效果,同时提供两种不同的实现方法。 首先,我们需要理解innerHTML的工作原理。innerHTML允许我们获取或设置一个元素的所有子节点,包括文本、HTML标签等。当...
本文将深入探讨一个特定的问题,即在Internet Explorer 6、7和8(以下简称IE6/7/8)浏览器中使用`innerHTML`属性清空元素时,其子元素也会被一并清空的特性。这个现象在其他现代浏览器中并不常见,因此了解这一问题...
此外,innerText在处理多语言文本(尤其是右到左的文本)时可能会有性能问题,而innerHTML通常表现更好。 总之,innerText和innerHTML是JavaScript中处理HTML元素内容的两个关键属性,它们各自有其优势和适用场景,...
然而,当使用`innerHTML`来替换元素内容时,一个常见的问题就是会丢失之前通过JavaScript动态绑定的事件处理函数。这是因为`innerHTML`在设置新内容时,会重新解析整个HTML字符串,生成新的DOM子树,从而导致所有...
- **性能问题**:频繁地使用`innerHTML`可能会导致性能下降。 - **XSS攻击**:直接插入用户提供的数据可能会导致XSS(Cross-Site Scripting)攻击。 - **浏览器兼容性**:不同浏览器对`innerHTML`的支持程度不同,...
这个功能在处理动态网页内容时非常方便,但同时也可能成为性能瓶颈,尤其是在频繁操作大量数据时。以下是对innerHTML操作进行优化的一些策略: 1. **避免频繁使用innerHTML的“+=”操作**: 当我们使用`innerHTML ...
然而,需要注意的是,频繁使用这两个属性可能会对性能造成影响,因为它们会重新解析和渲染整个HTML片段。因此,对于大量数据的操作,推荐使用创建DOM节点的方法(如 `createElement`、`appendChild` 等)来提高效率...
4. **可编辑表格的性能问题**:当表格允许编辑时,即便数据量不大(如几十条记录),操作也可能变得十分卡顿,尤其是IE浏览器中的表现更差。 #### 加载大数据量时的性能问题及解决方案 **原因分析**: - 不考虑...
本文总结了编写高性能JavaScript代码的最佳实践,讨论了JavaScript代码性能问题的几种设计模式对性能的影响,并提供了一些技巧来提高JavaScript代码的性能。 在研究JavaScript代码性能问题时,需要注意到设计模式对...