以搜狗高速浏览器、360 安全浏览器、世界之窗浏览器为代表,它们都有两个渲染模式,一个兼容 IE6、另一个比较现代。但它们大都完全依赖白名单策略,完全无视「X-UA-Compatible "IE=Edge,chrome=1"」这样明确的要求。

这有技术障碍吗?还是会带来什么麻烦?还是他们觉得这不重要?


你写的这个X-UA-Compatible的两个值分别代表如下含义:1、如果是IE的话使用最高版本的引擎渲染,2、如果支持chrome frame,则使用chrome frame渲染

双核浏览器中使用IE内核和webkit内核,只有一个IE版本,所以Edge无效,因为没有chrome frame,所以第二个值也无效。

你理想的是根据这个标签来切换内核,但事实的情况是浏览器会先选好一个内核,再去渲染页面。如果一定要达到你想的效果,则需要更改浏览器的逻辑,同时会造成一次页面刷新(使用新内核渲染)。

目前没有这样做的原因,可能是不重视引起的吧,觉得没有什么必要,技术上应该只是逻辑会稍麻烦一点,多一次判断和切换内核,不算太难。
国内的双核模式一般都是这样的:

- 「兼容模式」:调用系统中所安装的 IE 内核;

- 「极速模式」:Chromium 定制 (Webkit + V8)网页中声明的 X-UA-Compatible 只是在高版本浏览器有向前兼容的渲染模式时进行主动选择,比如可以指定 IE9 按 IE7 模式进行渲染。edge 的话就是始终用最新的 IE 模式渲染。但是双核浏览器不会自己捆绑新版本 IE,所以其使用的用户系统中的 IE 版本决定了对于安装了 IE6 的用户,不可能采取新版本的渲染模式。另外,这个声明只是让访客访问时使用的浏览器选择兼容版本的,目前尚没有切换内核的含义。就像你举的那个例子,浏览器能知道你究竟想用哪个内核渲染吗?显然只能在你当前的内核模式下选择合适的兼容版本。双核浏览器本来是个小众的东西,只是因为国内有那么大 IE6 份额,有那么多 IE only 的网站才在国内流行起来。


以产品功能设计的出发点来考虑就很明白了——浏览模式切换功能的设计初衷是:让控制权在用户控制的客户端, 而不是开发者控制的服务端。

我想提问者的意思是为什么国内双核浏览器不自造个类似的声明,供开发者使用。在IE8出来以前没看到过 X-UA-Compatible 这种用法,这句声明是不是微软自造的?这句申明的解读是不是涉及到内核技术,国内的外壳浏览器无能力自造?

当然有两点不好的因素:1、造成页面再次刷新;2、其实是一种hack,对技术发展没什么好处。
我必须来吐槽下国内浏览器这些无节操的行为。完全无视X-UA-Compatible,连自己文档里面写的规则也不遵守,如360的meta定义:360安全浏览器。什么时候切换到什么模式上面渲染完全是由自己来定义(这个问题的所有回答都看了,基本都是抄袭别人的回答,自己都没试过。)。你让我们这些开发者情何以堪。好吧你至少用标准模式吧,冷不丁的来一个兼容模式,你让我还支持IE6,7不成?你要有能力自己开发个内核也好,用别人的呢,你就把规则制定好吧。。。============

补充一下:

切换到某个模式可以通过HTTP Server的HEADER来定义,nginx/apache里面都可以。但是直接在HTML页面里面写的是没啥用的。

在head标签中添加一行代码:

&

&

&

&

&

&

&

content的取值为webkit,ie-comp,ie-stand之一,区分大小写,分别代表用webkit内核,IE兼容内核,IE标准内核。

若页面需默认用极速核,增加标签:&若页面需默认用ie兼容内核,增加标签:&若页面需默认用ie标准内核,增加标签:&
其实这不仅仅是写一句声明就完事的,还需要设置伺服器(IIS、APACHE等),就是在伺服器的某些文件中加入几句代码,各种伺服器的设置又各不相同。

咳咳,做过浏览器,看到各位都说得很动听,来打个酱油。

1. 这个compatible 标签并不是标准,只不过某些浏览器在用而已,我写个浏览器为什么要遵守?凭这一点就来喷国产浏览器,喷错了点。

2. 你知道网路那么大,但真正会动手写这个标签的有多少吗?技术上可行,事实上几乎没有谁会写这个东西。

IE 最流行的领域是企业应用,兼容性的雷区也在企业应用,而我曾经在一个外包公司待过,企业里的做法是,让用户换个浏览器。「IE11?谁让你装IE11了?我们这个系统只能用IE8」,这种情况比比皆是,IE的客户都不鸟这个compatible,网际网路圈也不爱跟IE玩。

3. 国产浏览器目前对解析Dom的过程没有过多参与,基本上就是调用不同核心打开目标网址。

在这个架构上要实现这个功能,就得自己写网页解析,解析遇到这个标签再决定调哪个核心。这会拖慢整个渲染过程,每一次打开网页都要等几十几百毫秒,甚至几十秒(与网路有关),才能确定用什么引擎渲染,这对于用户体验来说不可接受。

另一个简单的做法是,打开之后,假如遇到兼容性标签就换核心,这个过程会让页面重新刷新,会伤害用户体验,同时多打开一次网页,也有可能造成行为异常。

最优雅的做法是,在浏览的过程中,双核心能像单核心那样无缝切换,切换时无需刷新页面。这个技术基本上没可能实现,别多想了。
推荐阅读:
相关文章