Internet Explorer 9 无法识别 servlet 从 weblogic 服务器发送并以文档模式 IE7 呈现的 doctype - 启动前的额外字符?
Internet explorer 9 will not recognize doctype sent by servlet from weblogic server and renders in document mode IE7 - extra characters before start?
问题
当我在本地或服务器上拥有我的页面时,Internet Explorer 9 不会以同样的方式考虑 <!DOCTYPE html>
。我做了一个简单的测试页面来突出问题:
编辑: 更新了带有元标记和 css link
的简单测试页面
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="css/environmentinfo.css" />
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
</head>
<body>
<script>
document.write(document.compatMode);
document.write('<br/>');
document.write(document.documentMode);
</script>
</body>
</html>
当我在 IE9 中打开本地系统上的文件时,它显示:
CSS1Compat
9
当我在服务器上部署它时,它显示:
CSS1Compat
7
服务器
所以我从 weblogic 服务器提供文件。它部署在一个简单的 war 存档中,并由默认的 servlet 提供服务。
本地文件仅由文件系统提供(url 栏中的 C:...\test.html)。
调试信息
我查看了编码(两者相同)和存在的有效字符(通过记事本++和通过 wireshark)。
本地文件:
<!DOCTYPE html>\r\n
<html lang="en">\r\n
<head>\r\n
</head>\r\n
<body>\r\n
<script>\r\n
document.write(document.compatMode);\r\n
document.write('<br/>');\r\n
document.write(document.documentMode);\r\n
</script>\r\n
</body>\r\n
</html>
服务器响应:
HTTP/1.1 200 OK\r\n
Date: Fri, 13 Mar 2015 12:34:26 GTM\r\n
Accept-Ranges: bytes\r\n
Content-Length: 427\r\n
Content-Type: text/html\r\n
Last-Modified: Fri, 13 Mar 2015 12:29:30 GMT\r\n
X-Powered-By: Servlet/3.0 JSP/2.2\r\n
\r\n
<!DOCTYPE html>\r\n
<html lang="en">\r\n
<head>\r\n
</head>\r\n
<body>\r\n
<script>\r\n
document.write(document.compatMode);\r\n
document.write('<br/>');\r\n
document.write(document.documentMode);\r\n
</script>\r\n
</body>\r\n
</html>
我看过其他一些类似的问题,发现 IE 会忽略 <!DOCTYPE html>
如果前面有任何字符。我检查了 html 规范,它指出 headers,然后是一个换行符,然后是文档的开头。所以似乎没有多余的字符。使用 wireshark,我可以看到实际的字节并且似乎没有任何额外的字符。答案、提示甚至其他要看的东西都将不胜感激。
IE 可能有一些配置设置覆盖了标记中的 <!doctype html>
。根据 https://msdn.microsoft.com/en-us/library/ie/jj676914(v=vs.85).aspx:
Pages opened in the Intranet zone might be treated differently, depending on the configuration of the browser, the presence of group policy options, and other factors.
尝试检查上面文章中列出的地方。
除此之外,您可以根据 https://msdn.microsoft.com/en-us/library/ie/jj676913(v=vs.85).aspx
使用 X-UA-Compatible
HTTP header 或 <meta>
标签尝试强制文档兼容模式
在一些恶劣的情况下,当符合标准的页面加载到由怪癖页面托管的 iframe 中时,可能需要重新加载 iframe 以强制其进入正确的文档模式。
请注意,一旦 IE 开始呈现页面,文档模式就确定下来,无法即时更改。因此,文档模式的每条指令都必须尽可能早地出现。例如,正如您已经提到的,<!doctype html>
必须是第一行,<meta>
和 X-UA-Compatible
必须是 <head>
中的第一个标记。我会说,如果您可以控制服务器端,请使用 HTTP header 而不是 <meta>
来确保它在任何渲染发生之前切换文档模式。
问题
当我在本地或服务器上拥有我的页面时,Internet Explorer 9 不会以同样的方式考虑 <!DOCTYPE html>
。我做了一个简单的测试页面来突出问题:
编辑: 更新了带有元标记和 css link
的简单测试页面<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="css/environmentinfo.css" />
<meta http-equiv="x-ua-compatible" content="IE=edge"/>
</head>
<body>
<script>
document.write(document.compatMode);
document.write('<br/>');
document.write(document.documentMode);
</script>
</body>
</html>
当我在 IE9 中打开本地系统上的文件时,它显示:
CSS1Compat
9
当我在服务器上部署它时,它显示:
CSS1Compat
7
服务器
所以我从 weblogic 服务器提供文件。它部署在一个简单的 war 存档中,并由默认的 servlet 提供服务。 本地文件仅由文件系统提供(url 栏中的 C:...\test.html)。
调试信息
我查看了编码(两者相同)和存在的有效字符(通过记事本++和通过 wireshark)。
本地文件:
<!DOCTYPE html>\r\n
<html lang="en">\r\n
<head>\r\n
</head>\r\n
<body>\r\n
<script>\r\n
document.write(document.compatMode);\r\n
document.write('<br/>');\r\n
document.write(document.documentMode);\r\n
</script>\r\n
</body>\r\n
</html>
服务器响应:
HTTP/1.1 200 OK\r\n
Date: Fri, 13 Mar 2015 12:34:26 GTM\r\n
Accept-Ranges: bytes\r\n
Content-Length: 427\r\n
Content-Type: text/html\r\n
Last-Modified: Fri, 13 Mar 2015 12:29:30 GMT\r\n
X-Powered-By: Servlet/3.0 JSP/2.2\r\n
\r\n
<!DOCTYPE html>\r\n
<html lang="en">\r\n
<head>\r\n
</head>\r\n
<body>\r\n
<script>\r\n
document.write(document.compatMode);\r\n
document.write('<br/>');\r\n
document.write(document.documentMode);\r\n
</script>\r\n
</body>\r\n
</html>
我看过其他一些类似的问题,发现 IE 会忽略 <!DOCTYPE html>
如果前面有任何字符。我检查了 html 规范,它指出 headers,然后是一个换行符,然后是文档的开头。所以似乎没有多余的字符。使用 wireshark,我可以看到实际的字节并且似乎没有任何额外的字符。答案、提示甚至其他要看的东西都将不胜感激。
IE 可能有一些配置设置覆盖了标记中的 <!doctype html>
。根据 https://msdn.microsoft.com/en-us/library/ie/jj676914(v=vs.85).aspx:
Pages opened in the Intranet zone might be treated differently, depending on the configuration of the browser, the presence of group policy options, and other factors.
尝试检查上面文章中列出的地方。
除此之外,您可以根据 https://msdn.microsoft.com/en-us/library/ie/jj676913(v=vs.85).aspx
使用X-UA-Compatible
HTTP header 或 <meta>
标签尝试强制文档兼容模式
在一些恶劣的情况下,当符合标准的页面加载到由怪癖页面托管的 iframe 中时,可能需要重新加载 iframe 以强制其进入正确的文档模式。
请注意,一旦 IE 开始呈现页面,文档模式就确定下来,无法即时更改。因此,文档模式的每条指令都必须尽可能早地出现。例如,正如您已经提到的,<!doctype html>
必须是第一行,<meta>
和 X-UA-Compatible
必须是 <head>
中的第一个标记。我会说,如果您可以控制服务器端,请使用 HTTP header 而不是 <meta>
来确保它在任何渲染发生之前切换文档模式。