我有一个特殊的情况,我只能控制文档 <body> 的内容。我假设为了保持灵活性,主机并没有声明会立即将 IE 置于怪异模式的 doctype。由于我对文档的控制有限,我可以做些什么来强制 IE 以标准模式呈现页面?
3 回答
我相信你不能做任何事情,除非你说,用JS动态重写页面的内容并强制插入一个doctype。
您能否详细说明您对<body>
. 你可以做JS/脚本吗?
编辑:这是一个尝试,但我没有在 IE 中测试它。它可能会给你一些想法。我document.write()
的outerHTML
,document.documentElement
它把 compatMode 变成 CSS1Compat。
您可能需要在重写时删除脚本块。就像我说的,我真的不建议尝试这个......
http://medero.org/first-line.html
编辑#2:它似乎在 IE6 中出人意料地工作。但是在刷新时,IE 会以某种方式对其进行缓存,并永久保持其.document.write()
ed 形式。为了解决这个问题,请在其后面附加一个查询字符串,例如?203984234
.
同样,我不确定你的情况是什么,但我希望这能给你一些想法或帮助。
编辑#3:我重写了它并将其绑定document.write
到window.onload
. 每次访问它时都需要附加一个唯一的查询字符串才能看到效果,因为它会在它之后缓存它.write
。
http://medero.org/rewrite.html?f30324433322111
如果你需要更即时的东西,你可以在窗口加载之前插入 jQuery 的 DOM 就绪函数来重写它。
杂项说明:
- 如果在视觉上很重要,您可能可以通过 CSS 隐藏整个 html 文档,直到
document.write
调用 - 您可能应该
<script>
在保存之前剥离 document.write,outerHTML
以便新写入的页面没有script
块。
查看MSDN 上的定义文档兼容性文章。也许写出X-UA-Compatible
元标记会起作用。
根据 meder 的回答,这是我设法解决的方法。
我首先尝试写出X-UA-Compatible
元数据,但没有奏效。
在文档的末尾(或在头部,但我也无权访问):
<script type="text/javascript">
if (navigator.appName == 'Microsoft Internet Explorer'){
window.onload=function(){
if (document.documentMode == 5){
contents = document.documentElement.outerHTML;
newdoc = document.open("text/html", "replace");
newdoc.writeln('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">');
newdoc.write(contents);
newdoc.close();
}
};
}
</script>
内层if
是为了防止死循环。剥离代码本身可能会更好,比如把它放在一个函数中并用 删除函数调用string.replace()
,但我无法让它工作,所以不得不解决这个问题。