【问题标题】:Using JS to write a noscript tag用JS写一个noscript标签
【发布时间】:2012-05-20 14:03:06
【问题描述】:

你有什么实际的理由用 JavaScript 的 document.write() 写出 <noscript> 标记吗?我们的广告部门多年来一直这样做,并且在我指出之后仍然这样做。我有 99% 的把握这是由于一个古老的广告模板由一个不知道自己在做什么的人编写的,而且没有人想过要更改它,因为“为什么要修复没有损坏的东西?”或者,也许有人错误地阅读了他们的“最佳实践”(“始终包括禁用 JS 的浏览器的替代方案”)。或者也许有一个我不知道的很好的理由。

我能想到的唯一可以想象的事情是,您可以使用它来修改 DOM,而不会使它在页面上显示出来,并且可以将该内容用作模板以供以后使用,但这似乎很牵强。

(编辑)

本例中的标签包含一个标准的<a href="/path/to/advertiser"><img src="/path/to/image" /></a>。因为这是原始的非动态广告代码的样子,这让我觉得这只是复制粘贴的垃圾。

我要说的另一件事是,我不能 100% 确定这是一个过度网站的原因是因为最近将 html 模板放入 <script type="text/x-my-custom-template">...</script> 的模式。我怀疑我们这边的某个人会自己想出这个,但这可能是一个非常聪明的人的标准广告实践。

【问题讨论】:

  • 如果 JavaScript 被禁用,你怎么能创建一个标签 noscript?
  • <noscript>标签的内容是什么?
  • 请告诉我
  • 这不就像用英语对某人说“我不会说英语”吗?
  • @MarkLinus,也许重点是针对启用了 JS 的用户。

标签: javascript dom


【解决方案1】:

你有什么实际理由用 JavaScript 的 document.write() 写出 <noscript> 标记

不。两者(<script><noscript>)是互斥的。就像这样写一段代码:

if (true && false) {
    // do something important
}

如果启用了 JavaScript,浏览器会忽略 <noscript> 标记。另一方面,如果禁用 JavaScript,则永远不会写入 <noscript> 标签,因为 <script> 标签会被忽略。

【讨论】:

  • 完全不一样。在您的示例中,永远无法到达 // do something important。但是如果我在我们的主页document.getElementsByTagName('noscript').length; 上运行它,我会得到“3”。 DOM 正在更新。它正在“运行”。
  • 我认为您误解了伪代码的类比:// do something important 类似于 in <noscript> 标记中的内容。当然,它们是 DOM 的一部分,因此可以像任何其他标记一样使用 JS 进行查询。将它们放在 DOM 中没有意义,因为浏览器在呈现页面时会忽略内容。
  • 不,我明白这一点。我同意<noscript> 的内容就 HTML 渲染引擎而言是死内容,但它对 DOM 来说不是死的,对 JavaScript 来说也不是不可读的。就像我的更新所说,我问这个的原因是直到最近,我还不知道开发人员使用<script> 标签来提供视图模板(例如Handlebars.js)。在我们的例子中,这可能是一个错误,但它实际上可能是一种真正的现代技术。
  • 很抱歉之前没有接受。我希望其他人可能会提出合理的解释。但我想你会同意可能没有。
【解决方案2】:

这用于机器人检测/指纹识别。

例如,如果我使用

document.write('<script src='...'>...</script><noscript><img>....</noscript>');

Chrome 55+ 阻止从 document.write() 编写的不同来源的脚本。这意味着上述&lt;noscript&gt; 实际上将在某些/较新版本的 chrome 上运行,尽管来自“脚本”。

假设的目的是,如果机器人假装是(通过欺骗其用户代理)特定版本的 chrome,并且脚本没有被阻止,它会指出它不是 真的 铬(机器人)。

【讨论】:

  • 感谢您的回复。五年前我问过这个问题,当时 Chrome 是第 18 版,才刚刚与 IE 平起平坐,正如我所说,广告部门多年来一直在这样做。现在我不再和这些人一起工作了,我想我可以肯定地说广告部门不知道他们在做什么,并且在他们的工作中“大肆宣传”。也就是说,我非常感谢您的评论。
【解决方案3】:

您可以在特定的html标签中添加子节点。

var noscript = document.createElement('noscript')
var iframe = document.createElement('iframe')
iframe.setAttribute('src', "<your source>")
iframe.setAttribute("height", "0")
iframe.setAttribute("width", "0")
iframe.setAttribute("style", "display:none;visibility:hidden")
noscript.appendChild(iframe)
document.body.appendChild(noscript)

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 2019-03-21
    • 1970-01-01
    • 2020-03-28
    • 2013-06-18
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多