Javascript document.write的替代方案有哪些?

Javascript document.write的替代方案有哪些?,javascript,document.write,Javascript,Document.write,在教程中,我学会了使用document.write。现在我明白很多人都不赞成这样做。我试过打印,但它确实会将它发送到打印机 那么,我应该使用哪些替代方案,为什么不应该使用document.write?W3和MDN都使用document.write。作为document.write的推荐替代方案,您可以使用它直接查询节点元素并将其添加到DOM。尝试使用getElementById或getElementsByName访问特定元素,然后使用innerHTML属性: <html> &

在教程中,我学会了使用document.write。现在我明白很多人都不赞成这样做。我试过打印,但它确实会将它发送到打印机


那么,我应该使用哪些替代方案,为什么不应该使用document.write?W3和MDN都使用document.write。

作为document.write的推荐替代方案,您可以使用它直接查询节点元素并将其添加到DOM。

尝试使用getElementById或getElementsByName访问特定元素,然后使用innerHTML属性:

<html>
    <body>
        <div id="myDiv1"></div>
        <div id="myDiv2"></div>
    </body>

    <script type="text/javascript">
        var myDiv1 = document.getElementById("myDiv1");
        var myDiv2 = document.getElementById("myDiv2");

        myDiv1.innerHTML = "<b>Content of 1st DIV</b>";
        myDiv2.innerHTML = "<i>Content of second DIV element</i>";
    </script>
</html>

这个问题取决于你实际上想做什么

通常,您可以使用someElement.innerHTML或更好的document.createElement和someElement.appendChild来代替document.write


您还可以考虑使用jQuery等库,并使用其中的修改函数:

< P> >在这里写下一个注释,尽管使用Doopt.Wrrad由于同步DOM注入和评估而高度皱眉,如果使用document.write按需注入脚本标记,则也没有实际的1:1替代方案


有很多很好的方法可以避免这样做,例如,像这样的脚本加载程序可以管理您的依赖关系链,但它们更具侵入性,因此最好在整个站点/应用程序中使用。

这可能是最正确、最直接的替换:。

以下是应该替换文档的代码。就地写入:

document.write=function(s){
    var scripts = document.getElementsByTagName('script');
    var lastScript = scripts[scripts.length-1];
    lastScript.insertAdjacentHTML("beforebegin", s);
}

替换HTML的原因是因为一个邪恶的JavaScript函数:

这绝对是一种糟糕的形式。它只适用于网页,如果你使用它的网页加载;如果您在运行时使用它,它将用输入替换整个文档。如果您将其作为严格的XHTML结构应用,那么它甚至不是有效的代码

问题是: 写入文档流。调用已关闭或已加载的文档会自动调用,这将清除文档

-

他有两个心腹,还有。加载HTML文档时,文档处于打开状态。文档加载完成后,文档已关闭。此时使用将删除整个已关闭的HTML文档,并将其替换为新打开的文档。这意味着你的网页已经删除了自己,并开始写一个新的页面-从零开始

我相信这会导致浏览器性能下降,如果我错了,请纠正我

例如: 此示例在加载页面后将输出写入HTML文档。当您按下“清除”按钮时,Watch的邪恶力量会清除整个文档:

我是一个普通的HTML页面。我是无辜的,纯粹是为了提供信息。请不要
我 我看不出document.write的问题。例如,如果您在onload事件触发之前使用它(据推测是这样),以从结构化数据构建元素,那么它是合适的工具。使用insertAdjacentHTML或在DOM构建后显式地向DOM添加节点没有性能优势。我刚刚用一个旧脚本测试了三种不同的方法,我曾经用这个脚本在一个由4个调制解调器组成的银行上安排24/7服务的传入调制解调器呼叫

当它完成时,这个脚本创建了3000多个DOM节点,大部分是表单元。在一台7年前运行Firefox的Vista电脑上,使用document.write从本地12kb源文件和三个1px GIF(可重复使用约2000次)进行此小练习只需不到2秒钟。页面完全成形,随时可以处理事件

使用insertAdjacentHTML并不是一个直接的替代品,因为浏览器关闭了脚本所需的标记,而这些标记保持打开状态,并且最终创建一个损坏的页面需要两倍的时间。将所有片段写入一个字符串,然后将其传递给insertAdjacentHTML需要更长的时间,但至少可以按照设计得到页面。其他选项,比如一次一个节点手动重新构建DOM,都太荒谬了,我甚至都不打算去那里

有时使用document.write。事实上,它是JavaScript中最古老的方法之一,这并不是反对它的观点,而是对它有利的一点——它是高度优化的代码,完全符合它的意图,并且从一开始就一直如此

很高兴知道有其他可用的加载后方法,但必须理解,这些方法的目的完全不同;即在创建DOM并为其分配内存后修改DOM。如果您的脚本打算编写HTML,浏览器首先从中创建DOM,那么使用这些方法本质上是资源密集型的

只需编写它,让浏览器和解释器完成工作。这就是他们在那里的目的

PS:我刚刚在body标签中使用onload参数进行了测试,即使在这一点上,文档仍然是打开的,document.write的功能与预期的一样。此外,没有per
在最新版本的Firefox中,各种方法之间存在令人难以置信的性能差异。当然,在硬件/软件堆栈中可能有大量的缓存,但这才是真正的重点——让机器来完成工作。不过,在便宜的智能手机上可能会有所不同。干杯

我不确定这是否会奏效,但我想到了

var docwrite = function(doc) {               
    document.write(doc);          
};
这为我解决了错误消息的问题。

您可以将方法和属性结合起来

元素接口的insertAdjacentHTML方法将指定的文本解析为HTML或XML,并将生成的节点插入DOM树中的指定位置:

“beforebeagin”:在元素本身之前。 “afterbegin”:就在元素内部,在其第一个子元素之前。 “beforeend”:就在元素内部,在其最后一个子元素之后。 “afterend”:在元素本身之后。 document.currentScript属性返回当前正在处理其脚本的元素。最佳位置将在开始之前-新HTML将在开始之前插入。要匹配document.write的本机行为,可以将文本放在末尾,但随后对函数的连续调用中的节点不会像document.write那样按调用顺序放置,而是按相反顺序放置。HTML的显示顺序可能比它们相对于标记的位置更重要,因此使用beforebeagin

document.currentScript.insertAdjacentHTML “开始之前”, '这是一个文档。编写备选方案'
不太管用。您不需要在脚本中添加标记和吗?@DarkLightA:您输入的默认源与上面的源不同。另一方面,它在javascript窗口中!源代码有两种源类型:html和javascript。使用该源代码在桌面上创建html文件并将其打开。print解析为window.print。JavaScript打印的可能副本与PHP打印的可能副本不同。JS直接将页面发送到打印机,PHP只输出code.nice提示。是交叉划船吗?我已经在Chrome上测试过了,效果很好。如果页面上没有脚本,这难道不起作用吗?好吧,至少在页面上,你可以在任何地方放置该功能,但是如果唯一的脚本位于页面中呢?他提到的关键是insertAdjacentHTML函数。奇怪的是,直到今天我才收到有人评论的电子邮件。LOL.@Pons-应该是跨浏览器的,但我不知道IE。@Noyo-通常你使用的是文档。在页面上写下内部内容,就像Github GISTs:虽然这可以回答问题,请提供您能提供的任何解释,以确保人们理解这里发生的事情。由于这里的评论,我的问题得到了解决。我已经解释了什么是问题以及什么对我有用:如果它解决了document.write为什么有问题的问题,这将是一个更好的答案,那么邪恶只有在文档关闭后才会开始?除了不流行之外,使用document.write还有什么缺点吗?文档何时关闭是否存在任何实际不确定性?@BobStein VisiBone,是的,在页面加载期间,当浏览器解析页面时,可以调用document.write。解析/加载页面后,调用此函数还将调用document.open,它将擦除页面并从头开始。我想不出任何理由在页面加载期间不使用该功能,除了与您在其他时间向页面添加内容的方式保持一致。浏览器解析完文档后,文档就会关闭。document.write似乎仍然是解决此问题的最佳解决方案。我还没有尝试getElementById/innerHTML,但结果是createElement/insertBefore解决方案。@Godisgood,document.write不可能出现性能问题,因为它与浏览器加载初始HTTP响应时使用的函数完全相同。@Pacerier是,但我的意思是在页面加载后使用document.write会比较慢,因为每次调用函数时都必须清除文档,然后重新打开。innerHTML并没有做到这一点,所以我很确定我读到它毕竟更快。我将寻找一个来源来支持这一点。我相信document.write如果在页面打开时使用它,速度会很快。