今天在看京东网页代码的时候,发现了X-UA-Compatibles 这个元信息属性,不是很清楚,百度了一下,做下记录

X-UA-Compatible 属性是 IE 浏览器在 IE8 版本开始提供的一个特性,允许开发者通过设置 meta 标记来规定 IE 浏览器在解析网页时使用的文档模式。

通俗点说,这个标签可以实现 IE 浏览器版本模拟。

首先,我们要了解,通过 X-UA-Compatible 属性只能模拟比当前版本更低的版本,并不能模拟高版本。

其次,我们要了解 IE 的文档模式分几种。

  • Quirks Mode
  • IE7 mode
  • IE8 mode
  • IE9 mode
  • IE10 mode
  • IE11 mode

IE7 以上版本都有一个同名的文档模式,而 IE6 和 IE6 以下则只有一个模式,叫“Quirks Mode”。有人翻译成怪异模式,叫什么不重要,我们知道这基本上等同于模拟 IE6 即可,因为 IE5 是比 IE6 更加史前的浏览器,现代人类基本上找不到还有人在使用。

X-UA-Compatible 标记语法

第一种,直接指定某个IE版本的标准文档模式。

以下是要求模拟 IE8 的例子:

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

(注意:这在IE7、IE6中无效,因为 X-UA-Compatible 是 IE8 才开始支持的)

以下是要求模拟 IE9 的例子:

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

(注意:这不仅在IE7、IE6中无效,在 IE8 中也无效,因为不能模拟高于当前的版本)

第二种,指定某个IE版本,但也允许例外。

在IE版本号前面加上 Emulate ,代表,如果网页开头有 <!DOCTYPE> 标记就使用该IE版本的标准文档模式,否则使用怪异模式(即等同于 IE=IE5)

以下是要求模拟 IE8 的例子:

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

根据例子代码,如果你的网页开头带有 <!DOCTYPE> 标记,则模拟 IE8, 等同于:

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

如果你的网页开头没有 <!DOCTYPE> 标记,则模拟 IE6, 等同于:

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

不建议使用这个语法。

第三种,总是使用最新版本文档模式。

以下是例子:

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

根据例子代码,IE浏览器将总是使用最新版本的文档模式,如用 IE8 访问就是 IE8 文档模式,用 IE9 访问就是 IE9 模式,用 IE10 访问就是 IE10 模式,用 IE11 访问就是 IE11 模式。

注意:此声明并不是多此一举,如果你不使用 IE=edge 标记,IE浏览器会根据你的网页内容采用兼容视图,可能采用更低版本。

除非不准备兼容所有旧版IE,否则也不建议使用这个语法。

除了标准用法之外,还有一些特殊用法,如:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>

这段代码的意思是,如果安装了 Google Chrome Frame (谷歌浏览器內嵌框架)则使用谷歌浏览器内核模式,否则使用最新的IE模式。

IE跨版本兼容思路

如上所述,X-UA-Compatible 只能模拟比当前安装版本更低的版本,不能模拟更高版本。根据这个特性,兼容思路如下。

如果我们要往下兼容到 IE8 ,那么我们网页则应该提前添加好标记:

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

网页HTML/CSS/JS代码按 IE8 浏览器文档模式进行兼容性处理,不使用超过 IE8 文档模式的特性。

那么,我们就只需要维护一份 IE8 兼容代码,而用户无论是在 IE9 / IE10 / IE11 访问都是如同 IE8 访问一样。(要往下兼容到 IE9 或者 IE10 都以此类推。)

然后为 IE8 以下版本添加旧版IE浏览器升级提示,或跳转到IE浏览器升级提示页,如 X-UA-Compatible 代码下添加:

<!--[if lte IE 7]><script>window.location.href='http://support.dmeng.net/upgrade-your-browser.html?referrer='+encodeURIComponent(window.location.href);</script><![endif]-->

如无特殊情况,由于 IE11 以下版本都已停止更新,无论是从代码工作量还是从用户安全的角度来讲,我们都不应该再兼容 IE11 以下版本。

在这种情况下,我们可以使用如下标记:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>

然后为 IE11 以下版本添加旧版IE浏览器升级提示,或跳转到IE浏览器升级提示页,在 X-UA-Compatible 代码下添加:

<script>/*@cc_on window.location.href="http://support.dmeng.net/upgrade-your-browser.html?referrer="+encodeURIComponent(window.location.href); @*/</script>

(IE10不支持 if IE 语句,但 @cc_on 是 IE10 及更旧版IE特有的条件编译语句,因此可以用来判断是否除 IE11 的其他IE版本。)

双核浏览器兼容思路

国产浏览器大多带有 Chromium 内核和 IE 内核,在用户访问网页时双核浏览器根据网页内容自动选择内核。不过,双核浏览器也提供了类似 X-UA-Compatible 特性的 meta 标记,允许网页开发者通过标记选择内核。

一、使用 Chromium 内核(极速模式)

<meta name="renderer" content="webkit"/>

二、使用 IE 8/9/10/10 内核(IE标准模式,部分支持 HTML5)

<meta name="renderer" content="ie-stand"/>

三、使用 IE 6/7 内核(IE兼容模式,不支持 HTML5)

<meta name="renderer" content="ie-comp"/>

如果网站采用最新CSS3/HTML5编写,那么,我们应该令其使用 Chromium 内核(也就是 Webkit 内核)渲染。

代码如下:

<meta name="renderer" content="webkit"/>

<meta name="force-rendering" content="webkit"/>

第一行作用于360浏览器、QQ浏览器等国产双核浏览器,第二行作用于其他双核浏览器。

如果网站在 IE 浏览器效果更好,那么,我们可以要求其使用IE标准内核渲染。

代码如下:

<meta name="renderer" content="ie-stand"/>

实际上,由于 IE11 以下版本都已经停止更新,绝大部分前端开源项目都已经不再兼容 IE11 以下的旧版IE。往下兼容到 IE8 版本的网站已经寥寥无几,兼容 IE7/IE6 更是近乎绝迹。

但是,即使每天只有稀稀拉拉几个旧版IE用户访问网站,我们也不应该让他看到一屏乱码。面对依然使用旧版IE的用户,我们可以友好地提示其升级浏览器后再访问。

通过以下代码,当用户使用已经停止更新的IE10或旧版IE访问网站将会自动跳转到浏览器升级页:

<script>/*@cc_on window.location.href="http://support.dmeng.net/upgrade-your-browser.html?referrer="+encodeURIComponent(window.location.href); @*/</script>

综上所述,下面我们提供三个代码示例。

示例一:适合针对特定IE版本进行过优化的网站。

示例场景:网站针对 IE9 做了优化,IE10 / IE11 和双核浏览器访问时默认采用 IE9 标准文档模式。而 IE8 及以下IE浏览器访问则跳转至升级提示页。

代码如下:

<meta name="renderer" content="ie-stand"/>

<meta name="force-rendering" content="ie-stand"/>

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

<!--[if lte IE 8]><script>window.location.href='http://support.dmeng.net/upgrade-your-browser.html?referrer='+encodeURIComponent(window.location.href);</script><![endif]-->

示例二:适合针对特定IE版本进行过优化但对HTML5更加友好的网站。

示例场景:网站针对 IE9 做了优化,但 Chrome 访问效果更佳,双核浏览器访问时默认采用 Chrome 内核,IE10 / IE11 访问时优先采用 IE9 标准文档模式。而 IE8 及以下IE浏览器访问则跳转至升级提示页。

代码如下:

<meta name="renderer" content="webkit"/>

<meta name="force-rendering" content="webkit"/>

<meta http-equiv="X-UA-Compatible" content="IE=IE9,chrome=1"/>

<!--[if lte IE 8]><script>window.location.href='http://support.dmeng.net/upgrade-your-browser.html?referrer='+encodeURIComponent(window.location.href);</script><![endif]-->

示例三:只支持微软仍然支持和更新的IE11浏览器。

示例场景:考虑到微软已经停止更新IE10以及更低版本的IE,为了用户使用安全和更好的使用体验,不再支持旧版IE。双核浏览器访问时默认采用 Chrome 内核,IE11 以下旧版IE访问时跳转到升级提示页。

(@cc_on 是 IE10 及更旧版IE特有的条件编译语句,因此可以用来判断是否除 IE11 的其他IE版本。)

代码如下:

<meta name="renderer" content="webkit"/>

<meta name="force-rendering" content="webkit"/>

<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"/>

<script>/*@cc_on window.location.href="http://support.dmeng.net/upgrade-your-browser.html?referrer="+encodeURIComponent(window.location.href); @*/</script>

X-UA-Compatibles的更多相关文章

  1. pc wap 判断浏览器ua属性

    var ua = navigator.userAgent.toLowerCase(); var Android = String(ua.match(/android/i)) == "andr ...

  2. 移动端设备UA检测

    网上找到的都不全,不是漏这个就是漏那个,有的甚至还把桌面的chrome判断为移动浏览器. 于是自己动手整理,这回算是比较全了.以后发现漏掉的立马加上. if(/AppleWebKit.*Mobile/ ...

  3. 使用inherit属性值继承其父元素样式来覆盖UA自带样式。

    像button.input这样的表单控件,不同的浏览器都会有自己的样式风格(UA样式).我们可以使用inherit继承其父元素样式,从而覆盖浏览器的UA样式. button, input, selec ...

  4. UA模拟

    安卓QQ内置浏览器UA: Mozilla/5.0 (Linux; Android 5.0; SM-N9100 Build/LRX21V) AppleWebKit/537.36 (KHTML, like ...

  5. Browser设置UA值

    SWE Browser中的OptionMenu是Controller通过onKeyDown监听KEYCODE_MENU来显示的 public boolean onKeyDown(int keyCode ...

  6. 360极速浏览器UA怪异以及如何用js判断360浏览器

    本文最后一次更新于7个月前,文章内容可能略有出入.若发现文章中有错误之处,可以留言评论告诉作者. 1.360极速浏览器UA因域名不同而异 今天在写一个判断浏览器.浏览器版本.操作系统.操作系统版本.浏 ...

  7. [小知识] 获取浏览器UA标识

    这个随笔纯粹是小知识的积累,以后都会打上小知识的标签. 经常见的,下载移动app时,只有一个二维码,但扫码后,会根据手机是iphone还是android下载不同app,下面就是这个操作的代码: < ...

  8. YUI的UA检测

    YUI.UA是针对javascript的宿主环境检测的一个检测对象,返回的是一系统关于当前宿主的信息 1.对象相关信息列表及userAgent 检测对象o = { ie: 0, //ie Mozill ...

  9. Android Phone和Pad UA区别

    很多Android开发者或者网站端都可能会困扰关于如何区分Android phone和Android Pad的ua.确实这个问题很困难,我也曾被困扰了一段时间,后来在Stackoverflow中发现了 ...

  10. JsSIP.UA.JsSIP 总是返回错误:422 Session Interval Too Small

    在JsSIP 中 JsSIP.UA.call 总是 返回错误:422 Session Interval Too Small 关于错详情在这篇文章中解释的比较详尽:http://www.cnblogs. ...

随机推荐

  1. ACM之路(15)—— 字典树入门练习

    刷的一套字典树的题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=120748#overview 个人喜欢指针的字典树写法,但是大力 ...

  2. vuex中mutation和action的详细区别

    const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } ...

  3. Android网络编程之——文件断点下载

    一:关于断点下载所涉及到的知识点 1.对SQLite的增删改查(主要用来保存当前任务的一些信息) 2.HttpURLConnection的请求配置 HttpURLConnection connecti ...

  4. apache整合tomcat中的一些注意事项

    1.整合完毕后,需要把项目同时部署在apache和tomcat中,不然会报错找不到资源 2.可以把tomcat和apcahe的项目路径设置为同一个 3.使用java框架时容易出现异常:The requ ...

  5. 07 MySQL之视图

    01-视图的含义 视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表.视图还可以从已经存在的视图的基础上定义. 02-创建视图 # 基本语法格式: CREATE [OR REP ...

  6. Win10设置文件夹权限报错-(提示:无法枚举容器中的对象 访问被拒绝)

    一.右击文件 选择“属性”-“安全”-“高级”,如下图 二.查看哪个用户的权限是:“完全控制”,我这里是“SYSTEM”用户. 三.选择顶部的 “更改-“高级”-“立即查找”,然后选择管理员账户“SY ...

  7. [z]curl使用指南

    https://www.jianshu.com/p/fc0eb6c60816 curl -X POST "http://aa/bb/cc" -H  "accept:*/* ...

  8. [Python]使用pytest进行单元测试

    安装pytest pipenv install pytest 验证安装的版本: pytest --version This , imported /site-packages/pytest.py 接下 ...

  9. Scala中的列表可以添加元素吗?

    列表或许是Scala程序中最常用到的数据结构了,其与数组非常相似,最重要的两点差别为: 1.列表是不可变的: 2.列表具有递归结构,而数组是连续的. 在实际使用中非常容易这样用: val a = Li ...

  10. HBase管理与监控——强制删除表

    在用phoenix创建Hbase表时,有时会提示创建失败,发现Hbase中又已创建成功, 但这些表在进行enable.disable.drop都无效,也无法删除: hbase(main)::> ...