6

我有两个非常不同的网站。两者在“Internet explorer 8”浏览器模式下显示时出现不同的错误!

单击地址栏旁边的“兼容性视图”按钮时,两个站点看起来都很棒。当我之后使用内置的“开发者工具”查看“浏览器模式”和“文档节点”时,我还注意到“浏览器模式”是“IE8 兼容视图”,“文档模式”是“IE7 标准” ”。正如我所期望的那样。

然后我想强制“Internet Explorer 8”进入“浏览器模式”:“IE8 Compat view”,这样我的用户就不必点击地址栏旁边的“Compatibility view”按钮来获得他们真正需要的东西查看。

我能想到的唯一方法是在标题内的标题下方插入一个元标记,如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head>
        <title>Test</title>
        <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
        <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
        <link ... />
        <script ...></script>
    </head>
    <body>
        ...
    </body>
</html>

然后我重新加载网站,地址栏旁边的“兼容性视图”按钮消失。正如预期的那样。当我之后使用内置的“开发者工具”查看“浏览器模式”和“文档节点”时,我突然看到了一些我真的没想到的东西。我希望“浏览器模式”是“IE8 兼容视图”,“文档节点”是“IE7 标准”,但“浏览器模式”是“IE8”,“文档模式”是“IE7 标准”,而与在“Internet Explorer 8”浏览器模式下查看相比,网站突然出现一组新错误!

非常令人沮丧,为什么我不能强制“IE8 Compat view”浏览器模式而不是“Internet explore 7”或“Internet explore 8”浏览器模式?

4

8 回答 8

5

引用IEBlog :

“浏览器模式”会影响用户代理字符串、评估条件注释时使用的版本向量和呈现模式。

在http://msdn.microsoft.com/en-us/library/dd565624(VS.85).aspx上有更多详细信息。

正如您可以清楚地看到的那样,无论如何您都无法影响所有这些事情:当您告诉浏览器像 IE7 一样工作时,它已经像 IE8 一样工作了。

也许真正的问题是:为什么浏览器模式对您来说那么重要?文档模式是您最应该关心的 - 浏览器模式的所有变化就渲染而言与排除/包含但版本检查的内容有关,并且用户无论如何都不会查看开发人员工具,所以他们不会在意。

与其浪费大量时间让它看起来像开发人员工具中的纯兼容模式,不如去确保用户代理字符串检查和条件注释使它成为,以便 IE7 和 IE8 获得相同的材料可以使用,然后将 EmulateIE7 留在里面。

编辑:

问题是您的版本检查,正如我在下面承诺的那样,我将告诉您问题出在哪里。

如果你使用开发者工具调试菜单放置脚本,你可以深挖一下,当浏览器自报为IE7或IE8时get_x_position的执行路径不同:is_ie5upIE7模式设置为true,IE8模式设置为false。这会导致返回非常不同的值。

此时,我们必须回到设置此变量的位置:

var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));

如您所见,这取决于 的值is_ie6up,所以让我们看看周围的代码......

var is_ie8up    = (is_ie8   ||  is_ie9up);
var is_ie7up    = (is_ie7   ||  is_ie8up);
var is_ie7up    = (is_ie7);
var is_ie6up    = (is_ie6   || is_ie7);
var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));
var is_ie5_5up  = (is_ie6up || (is_ie && !is_ie3 && !is_ie4 && !is_ie5));

...您发现缺陷了吗(提示:比较该片段的第 2 行和第 4 行)?

没错:is_ie6up除非浏览器完全是 IE6 或 IE7,否则不设置为 true。正确的行当然应该阅读

var is_ie6up    = (is_ie6   || is_ie7up);

...可是等等。这也不好,因为片段的第 3 行更改is_ie7up为仅当浏览器完全是 IE7 时才为真!因此,您需要删除 的覆盖is_ie7up,并修复 的设置is_ie6up

我的猜测是您在另一个站点上遇到了完全相同的问题:您以几乎相同的方式搞砸了浏览器检查。

于 2009-08-03T21:51:49.697 回答
2

您已正确设置元标记,但 IE8 似乎使用以前的呈现模式,直到您重新启动浏览器。

告诉您的用户将看到什么:

  1. 单击Document Mode开发人员工具栏中的 并查看标记的值(Page Default)
  2. 重新启动 IE8 并查看您的文档 - IE 现在应该使用默认页面。
于 2009-08-10T02:47:55.257 回答
1

xmlns="http://www.w3.org/1999/xhtml" 属性取消了元标记。将元标记移动到 html 标记上方。是的,没错,在 html 标签之上。然后它将在 javascript 运行之前执行 emulateIE7。我在 IE7、IE8 和 Firefox 中对此进行了测试。

于 2009-10-09T04:11:23.493 回答
1

在我的特殊情况下,我的网站无法在 Compat View 中正确呈现。我终于了解到浏览器模式会影响用户代理字符串。我的站点样式规则基于用户代理,因此某些样式根本没有在 Compat 视图中应用。

我正在使用

document.documentElement.setAttribute('data-useragent', navigator.userAgent);

这样以后我就可以使用 css 属性选择器,例如

html[data-useragent*='MSIE 8.0'] p {}

我通过添加解决了:

html[data-useragent*='MSIE 7.0'] p {}

(不关心真正的 IE7,因为无论如何都不支持真正的 IE7)

根据我的经验,开发人员无法强制 IE8 从“浏览器模式:IE8 兼容视图”进入“浏览器模式:IE8”。同样,我说的是 BrowserModes 而不是 DocumentModes(可以由元标记、响应标头等控制)。

于 2014-04-25T16:36:14.583 回答
0

使用 HML5 Boilerplate 为 asp 经典站点强制 IE8 进入文档模式 IE8 标准时遇到问题。将这个问题和其他问题的答案拼凑在一起,在<doctype>声明上方添加这段代码似乎已经解决了问题,并将文档模式从 IE7 强制返回到 IE8。<%= response.AddHeader("X-UA-Compatible", "IE=edge") %>

于 2012-01-06T18:15:55.157 回答
0

问题不是您使用了错误的文档类型吗?

也许:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

有关详细信息,请参阅http://htmlhelp.com/tools/validator/doctype.html

于 2009-08-03T21:35:53.020 回答
0

我正在转换 XML 文档,因此无法正确设置 DOCTYPE。我没有将其移至 XML 无效的上方<html>,而是将其放在标题中。

在 PHP 中:

header("X-UA-Compatible: IE=7");
于 2011-06-09T17:27:05.943 回答
0

如果您的页面包含 ASP.NET Ajax 内容,您可能需要使用此更新站点

http://support.microsoft.com/kb/2600088

于 2012-12-11T20:14:08.890 回答