【问题标题】:Why use document.write?为什么使用 document.write?
【发布时间】:2010-10-08 01:34:10
【问题描述】:

我想知道为什么广告仍然使用 document.write 方法将添加插入页面

<script language="javascript" type="text/javascript">
    document.write("<script type='text/javascript' src='http://addomain/someadd.js'><\/sc" + "ript>");
</script>

为什么我放不下

<script type='text/javascript' src='http://addomain/someadd.js'></script>

代替广告?

【问题讨论】:

  • 你在这里玩的有趣的重复圈子。

标签: javascript document.write


【解决方案1】:

传统的脚本标签会在页面加载和执行时阻塞页面。使用 document.write 加载的脚本将异步工作。这就是为什么您会在广告或分析中看到这一点,因为此类脚本不会直接影响页面内容。

【讨论】:

  • 这不是真的,你可以立即访问添加了document.write的脚本标签的内容,只要它来自一个新的脚本标签,除非你指定defer=true Here's the proof这就是为什么当您需要向脚本添加一些动态参数但又不想处理创建脚本节点的异步加载时,您可以使用document.write
  • 那么
【解决方案2】:

我在一家网络广告公司工作,据我所知,某些浏览器(不知道哪些浏览器)允许您将脚本标签放入页面,但不允许您自动执行它们的内容。

因此,要实现这一点,您需要将脚本标记分解为多个片段,这样浏览器就不会将其视为脚本标记,而是将其视为任何旧的 HTML 数据。然后,随着 DOM 被串行处理,在写出 script 标签之后,它评估的下一个东西是……嘿,你刚刚写出的那个 script 标签。

此时脚本标签被评估并执行。

【讨论】:

  • 不确定我是否掌握了这个。我看不出它会如何被区别对待。
  • 我们公司从一家广告公司收到了类似的代码。我同意 Paul - 这基本上是一种减少脚本被过滤/忽略的可能性的方法。
  • 我还应该补充一点,我们收到的代码进一步被连接混淆了......“”...... 很明显这就是他们正在做的事情。
【解决方案3】:

这些 document.write 注入脚本通常会附加动态字符串,以摆脱缓存,或将有关客户端的一些信息发送到广告服务器。我怀疑你的例子是这样开始的

document.write("<script type='text/javascript' src='http://addomain/someadd.js?"+extrastuff+"'><\/sc" + "ript>");

但随着时间的推移进行了调整,或者被不了解额外内容的人复制和修改。但是正如您所写的那样,没有区别:您在问题中引用的两种方式在功能上是相同的。

【讨论】:

    【解决方案4】:

    我的立场是正确的,doc.write 创建的脚本 阻塞的 - 虽然比我更糟糕,呵呵 :) - 但作为一个 adblock 避免者,它 真的 很弱,所以我只能得出结论,这是一种 SOP 机制,用于为过度使用的脚本请求动态添加参数。

    在避免脚本块孩子时使用 DOM 插入技术。

    【讨论】:

    • 这是我的想法,但考虑到它在我的所有测试中使页面呈现速度变慢,我不敢相信这是真的。内联脚本,甚至手动将其附加到 DOM 都会产生更快的渲染(实际上 document.write 与其余的相比是一个重要的块)。
    • @annakata:你有一个链接可以更详细地解释这一点吗?我对“规避阻塞”也有疑问。
    • 不,这是我专业参与的事情 - 我见过竞争对手调用 doc.write 技术并认为它是阻塞解决方案的一部分(因为其余代码符合常见模式)。原来 doc.write 只是 真的 很糟糕,而且我给了竞争对手太多的信任 :)
    【解决方案5】:

    如果禁用活动脚本,此方法可避免加载外部脚本。

    【讨论】:

    • 如果禁用脚本,则无论如何都不会加载任何脚本 - 至少在 FF 中,尚未在其他地方测试过,但我相信这是真的
    • 至少一些旧浏览器做到了。
    • 所以你的意思是如果禁用活动脚本,它会阻止文件加载?好像它会在哪里加载(但不执行)脚本标签?
    • 我不太清楚。但我认为有一些浏览器会加载外部脚本文件,尽管禁用了活动脚本。所以使用前一种变体会阻止那些浏览器加载外部脚本文件。
    • 这似乎使事情变得复杂,只是为了防止某些(可能)旧版浏览器下载单个广告。我无法想象这是唯一的原因!
    【解决方案6】:

    我不确定,但他们可能会使用它,以便首先加载网站上的所有内容并显示给用户,然后加载并显示广告。

    【讨论】:

    • 不 - 我一开始也这么认为,但是 doc.write 创建的脚本阻塞了
    【解决方案7】:

    将其与正则表达式匹配并删除很容易:

    <script type='text/javascript' src='http://addomain/someadd.js'></script>
    

    但另一个更复杂,可以写成不同的格式。

    我认为是这个原因。

    【讨论】:

      【解决方案8】:

      恕我直言,这不仅毫无意义,甚至不正确。尖括号不会被转义,这将呈现技术上无效的 HTML 文档(即使它适用于所有主流浏览器,因为它们试图从编码人员的错误中恢复)。如果一个人使用 XHMTL 页面为他的网站提供application/xml+xhtmldocument.write() 根本不起作用。

      【讨论】:

      • 尖括号不需要在&lt;script&gt; 块中转义——事实上,这样做会使它们非常失败。一个考虑因素是&lt;/script&gt;,通常在字符串中转义为&lt;\/script&gt;&lt;/scr" + "ipt&gt; 等。另外,因为document.write 什么时候不能在XHTML 中工作?
      • @minitech:你在这两点上都错了。在 XHTML 中 script 元素是 defined 在 DTD 中是 &lt;!ELEMENT script (#PCDATA)&gt; - 看看你自己,它是 PCDATA, not CDATA。不过,通常使用&lt;![CDATA[...]]&gt; 而不是手动实体编码。而document.write 不存在于XMLDocuments,所以它@98​​7654323@ 除非你错误地将XHTML 服务为text/html,指示浏览器将其视为HTML。
      • 浏览器曾经以不同的方式处理 XHTML 文档吗? (即作为 XML 文档?)这对我来说是个新闻。无论如何,“尖括号不需要在&lt;script&gt; 块中转义”是正确的。我不是在谈论 XHTML。 (你似乎也没有在你的答案中。)
      • 是的,如果使用正确的 MIME 类型,文档将使用 XML 进行解析。您是否曾在 Firefox 中看到黄色的“XML 解析错误”页面? xhtml.com/en/xhtml/serving-xhtml-as-xml 就我个人而言,当 XHTML 很流行并且每个人都尝试使用它时,我已经看过十几次了。
      【解决方案9】:

      write() 方法主要用于测试:如果在一个 HTML 文档完全加载后使用,它将删除所有现有的 HTML

      【讨论】:

        【解决方案10】:

        一种降低他们的添加被阻止的可能性的方法。

        【讨论】:

        • 是吗?因为执行最终会通过广告拦截器仍会拦截的相同机制导致对同一端点的调用。
        猜你喜欢
        • 1970-01-01
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        • 2018-05-18
        相关资源
        最近更新 更多