【问题标题】:Javascript switch from quirksmode to standardJavascript 从 quirksmode 切换到标准
【发布时间】:2011-08-13 08:28:11
【问题描述】:

有没有办法使用 Javascript 将 quirksmode 中的页面切换到标准模式?

例如,假设我有以下页面,其中包含 html。我尝试了以下方法。

<html><script src="js.js"></script></html>

以及js.js中的如下内容

document.open();
document.write('<!doctype html><html></html>');
document.close();

通过查看上面的输出,我基本上是在尝试将 quirksmode 中的页面转换为标准模式,但它不起作用。 (在 iframe 上设置上述页面的内容可以正常工作)

iframe 作品

您可以将document.createElement('iframe') 附加到文档中并在其上调用iframe.contentWindow.document.write('&lt;!doctype html&gt;..');。不幸的是,如果我在当前页面上调用它,同样的技术不会。

有没有人可以将页面从 quirksmode 切换到标准模式?

编辑:创建和附加一个 iframe 并简单地将其高度和宽度设置为 100%,但不是这里的目标;)

【问题讨论】:

  • 现在谁写 HTML 没有文档类型?为什么不能只编辑 HTML 以包含一个?
  • @Ranyos 是的,设置document.write 不起作用,但我觉得有趣的是,如果您创建 iframe,它会起作用。我想知道为什么?
  • @cHao 这是在回避原来的问题 ;)
  • @Lime iframe 内的内容处于标准模式。不是原始页面

标签: javascript quirks-mode


【解决方案1】:

浏览器通常在加载时查找文档类型以确定是否使用“标准模式”,并根据该决定加载/呈现页面。即使您设法通过脚本插入 doctype 声明,它也不会及时出现。

它在 iframe 中工作的原因是内容是一个新文档,在您编写它时正在“加载”。由于存在文档类型,因此该内容以标准模式呈现。

正如another question on this same topic 中提到的,您可能能够摆脱重写整个文档。基本上,(如果页面仍处于 quirks 模式)获取document.documentElement.innerHTML,然后使用正确的文档类型编写一个新文档,并附加原始文档中的 HTML。但这会导致脚本等一系列问题,应该避免。理想的解决方案是修复 HTML 以包含文档类型,而不是用脚本来伪造它。

【讨论】:

  • 您的(链接的)解决方案有效!谢谢老兄,您能否编辑当前答案或发布另一个答案。我可以完全结束这个问题,但你从理论上回答了它。
【解决方案2】:
<script>
document.open();
document.write('<!doctype html><html></html>');
document.close();
</script>

或任何变体都不起作用,因为&lt;SCRIPT&gt; 标签会导致 HTML 解析器创建一个 HTML 元素和一个 HEAD 元素(如果不存在)。当 HTML 元素存在时(甚至是隐式元素),令牌流上的 DOCTYPE 将被忽略。

关闭和重新打开文档只会阻止解析以下任何 HTML 内容。

使用document.write 输出 DOCTYPE 的唯一方法是创建一个可以写入的新空白文档。

只要解决这个服务器端。

【讨论】:

  • 如果它真的摆脱了文档并创建了一个新文档,您的脚本将如何运行?清除文档的一部分是删除脚本...
  • 这是 mozilla 文档says 认为他们值得信赖的内容:|急……我想我必须制定一个新计划……
  • @Lime,重新打开文档会停止 HTML 解析,阻止 HTML 的其余部分加载到新文档中。充其量,您最终会得到一个没有内容的标准模式文档。
  • 在标准模式下没有内容比 quirksmode 更好:D 至少对我来说
  • @Lime,然后用&lt;script&gt;document.write("&lt;noscript&gt;");&lt;/script&gt; 开始你的文件:)
【解决方案3】:

您可以尝试编写 X-UA 兼容的元标记:

<meta http-equiv="X-UA-Compatible" content="IE=9" />

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2021-12-31
    • 2012-10-28
    • 1970-01-01
    相关资源
    最近更新 更多