看起来有经验的Web开发人员在编写动态HTML时使用JavaScript中的document.write()
不太好。
为什么呢?正确的方法是什么?
看起来有经验的Web开发人员在编写动态HTML时使用JavaScript中的document.write()
不太好。
为什么呢?正确的方法是什么?
document.write()
只能在页面最初解析和创建DOM时使用。一旦浏览器到达关闭的</body>
标签并且DOM准备就绪,就不能再使用document.write()
了。
我不会说使用document.write()
是正确或不正确的,这取决于您的情况。在某些情况下,您只需要使用document.write()
来完成任务。看看Google分析如何注入到大多数网站中。
在DOM准备就绪后,您有两种方法插入动态HTML(假设我们将插入新的HTML到<div id="node-id"></div>
):
在节点上使用innerHTML:
var node = document.getElementById('node-id');
node.innerHTML('<p>some dynamic html</p>');
使用 DOM 方法: var node = document.getElementById('node-id');
var newNode = document.createElement('p');
newNode.appendChild(document.createTextNode('some dynamic html'));
node.appendChild(newNode);
使用DOM API方法可能是最纯粹的方法,但已被证明innerHTML
要快得多,并在JavaScript库(如jQuery)中作为底层使用。<script>
必须放在<body>
标签内部。node.innerHTML = '<p>some dynamic html</p>';
在 Android 上的 WebView 上 innerHTML 不是一个函数。 - domendocument.write()
在 XHTML 中无法使用。它在页面完成加载后被执行,只能输出一系列 HTML 字符串。
由于 HTML 的实际内存表示是 DOM,直接操作 DOM 是更新页面的最佳方式。
实现此目的的方法是以编程方式创建节点,然后将它们附加到 DOM 中的现有位置。例如,假设我有一个具有“header”ID
属性的 div
元素,则可以通过以下方式引入一些动态文本:
// create my text
var sHeader = document.createTextNode('Hello world!');
// create an element for the text and append it
var spanHeader = document.createElement('span');
spanHeader.appendChild(sHeader);
// grab a reference to the div header
var divHeader = document.getElementById('header');
// append the new element to the header
divHeader.appendChild(spanHeader);
document.write
д»Қ然жҳҜдёҖдёӘжңүз”Ёзҡ„е·Ҙе…·гҖӮ - Tim Down根据Tom所述的DOM方法。
如iHunger所提到的innerHTML。
相对于字符串设置属性和内容而言,DOM方法更为可取。如果你发现自己写了 innerHTML= '<a href="'+path+'">'+text+'</a>'
,实际上就是在客户端创建了新的跨站脚本安全漏洞,如果你花费了时间来保护服务器端就有些可惜了。
传统上说,与innerHTML相比,DOM方法被描述为“缓慢”的。但这并不是整个故事的全部。缓慢的是插入大量子节点:
for (var i= 0; i<1000; i++)
div.parentNode.insertBefore(document.createElement('div'), div);
这会导致DOM在其节点列表中查找正确插入元素的位置,移动其他子节点,插入新节点,更新指针等等,工作量很大。
另一方面,设置现有属性的值或文本节点的数据非常快速;您只需更改一个字符串指针,就完成了操作。这比使用innerHTML序列化父节点,然后进行更改并解析回来要快得多(而且不会丢失不可序列化的数据,如事件处理程序、JS引用和表单值)。
有一些技巧可以在不使用childNodes遍历的情况下进行DOM操作。特别是要注意cloneNode
和使用DocumentFragment
的可能性。但是有时innerHTML确实更快。您仍然可以兼顾两个世界,使用innerHTML编写具有属性值和文本内容占位符的基本结构,然后使用DOM稍后填充它们。这样可以避免编写自己的escapehtml()
函数以解决上述转义/安全问题。
$('div').html('<b>Test</b>');
innerHTML
或outerHTML
。element.InnerHtml = allmycontent
: 这会重写元素内的所有内容。您必须使用变量 let allmycontent="this is what I want to print inside this element"
来存储您想要放置在此元素内的整个内容。如果不这样做,每次调用此函数时,您的元素内容都将被擦除并替换为上一次调用它时的内容。
document.write()
: 可以多次使用,每次都会在页面上调用时打印内容。
但要注意:document.write() 方法仅适用于在页面创建时插入内容。因此,在有大量数据需要编写时,例如产品或图像目录,请勿重复使用。
以下是一个简单的示例:您的侧边栏菜单中的所有 li 都存储在一个名为 "tab" 的数组中,您可以直接在 HTML 页面中使用脚本标记创建 JS 脚本,然后在迭代函数中使用 write 方法来插入这些 li 到页面中。
<script type="text/javascript">
document.write("<ul>");
for (var i=0; i<=tab.length; i++){
document.write(tab[i]);
}document.write("</ul>");
</script>`
element.innerHTML=("Myfullcontent");
要了解更多关于文档方法的内容:打开您的控制台:document;
然后打开:__proto__: HTMLDocumentPrototype
您会在文档对象中看到函数属性"write"。
您还可以使用document.writeln,它会在每个语句后添加一个新行。
要了解有关函数/方法的更多信息,请将其名称写入控制台,不带括号:document.write;
控制台将返回描述而不是调用它。
我不是特别擅长JavaScript或其最佳实践,但document.write()
以及innerHtml()
基本上允许您编写字符串,这些字符串可能是有效的HTML,也可能无效;它只是字符。通过使用DOM,您可以确保符合标准的HTML,这将通过明显的错误HTML使您的页面不会崩溃。
而且,正如Tom所提到的,JavaScript在页面加载后执行;最好的做法可能是通过标准HTML(通过.html文件或服务器所做的任何操作[i.e. php])完成页面的初始设置。
使用JavaScript编写HTML有很多种方法。
当您想要在页面实际加载之前写入页面时,document.write仅在此时有用。如果您在页面加载后(在onload事件中)使用document.write(),它将创建新页面并覆盖旧内容。此外,它不适用于XML,包括XHTML。
另一方面,其他方法不能在DOM创建之前(页面加载)使用,因为它们直接与DOM一起工作。
这些方法包括:
在大多数情况下,node.innerHTML更好,因为它比DOM函数更快。大多数情况下,它还可以使代码更易读和更小。
最好的方法无疑是尽量避免在JavaScript中进行任何繁重的HTML 创建。从服务器发送下来的标记应该包含大部分内容,您可以使用CSS进行操作,而不是强制删除/替换元素(如果可能的话)。
如果您正在模拟小部件系统等“聪明”的操作,则不适用此方法。