这是前两天解决的一个故障,准确的说它不是一个SharePoint的问题,而是IE8浏览器或者说是HTML代码的问题,但我感觉还是挺有意思的,所以贴上来分享一下。

基础知识

简单的讲,就是IE浏览器中有两个模式设定,一个是“浏览器模式”(Browsers Mode),一个是“文档模式”(Document Mode)。

浏览器模式”用于切换IE针对该网页的默认文档模式、对不同版本浏览器的条件备注解析、发送给网站服务器的用户代理(User-Agent)字符串的值。网站可以根据浏览器返回的不同用户代理字符串判断浏览器的版本和安装的功能,这样就可以向不同的浏览器返回不同的页面内容。

文档模式”用于指定IE的页面排版引擎(Trident)以哪个版本的方式来解析并渲染网页代码。切换文档模式会导致网页被刷新,但不会更改用户代理字符串中的版本号,也不会从服务器重新下载网页。切换浏览器模式的同时,浏览器也会自动切换到相应的文档模式。

一般来讲,用户可以通过F12工具自行调整这两种模式。但通常来讲,开发人员会通过在HTML代码里写入下面这行<meta>标签来直接指定最适合该页面的模式以防止出现不必要的异常, 比如js错误.

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

故障描述

这次的故障是我们的站点虽然都统一通过<meta>指定了文档模式为IE8 Standards, 但在有些页面却不起作用, 文档模式变成了IE7Standards, 于是这些页面报出了JavaScript Error.

JS Error的原因我顺便提一句, 是因为我们的js代码中用了JSON.parse()语句,这句话在IE7Standards中却不能识别。一个临时的解决方法是把这句话用jQuery.parseJSON替换,但显然这等于是用了更旧的方法,不是个好主意。最好的解决方法还是找到为什么<meta>不起作用了。

经过排查源代码,发现了共性。

凡是出问题的页面,<meta http-equiv="X-UA-Compatible" content="IE=8"/>这句话都不是紧随<title>标签之后的第一句话,前面被莫名其妙插入了很多javascript引用。

而相反的, 在没有问题的页面里,<meta http-equiv="X-UA-Compatible" content="IE=8"/>都是紧随在<title>标签后的。

解决方法

然后经过搜索发现了这篇帖子http://stackoverflow.com/questions/13519696/mvc-app-causing-ie9-to-use-older-standards/13524518#13524518 里面提到<meta http-equiv="X-UA-Compatible" content="IE=8"/>必须紧随<title>才可以生效。那么换句话说,你只有想办法把<meta>之前的那些引用去掉才可以。在我环境中,那些引用是因为一个新安装的插件导致的,卸载掉之后这个问题就解决了。

但很可能在你的SharePoint里这个问题不能这样解决的话,还有一个方法也可以起到作用,那就是在SharePoint的web.config里面来指定文档模式和浏览器模式,这样等于有了双保险,万一页面上的<meta>不起作用,web.config就会起作用。做法如下图:

<meta>指定浏览器模式(browser mode)或文档模式(document mode)无效的更多相关文章

  1. 网站文档模式总是以Quirks文档模式解析网站

    <meta name="renderer" content="webkit"/> <meta http-equiv="X-UA-Co ...

  2. 浏览器默认解析文档模式IE7

    背景:实习期间开发了一套页面,兼容到IE8+,可是在给产品体验时,他的QQ浏览器默认解析到了文档模式IE7,出现了页面的兼容性问题.问题排查:QQ浏览器目前有两个模式,极速模式和兼容模式,其中极速模式 ...

  3. IE的文档模式, 及Textarea呈现bug一例

    做了个非常简单的页面, 仅有几行html代码, 内容如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtm ...

  4. DOCTYPE是什么鬼?文档模式又是什么鬼?

    !DOCTYPE !DOCTYPE是什么: 在所有 HTML 文档中规定 DOCTYPE 是非常重要的,这样浏览器就能了解预期的文档类型, 告诉浏览器要通过哪一种规范(文档类型定义 DTD)解析文档( ...

  5. 全栈JavaScript之路( 二十二 )IE 专有扩展——文档模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/hatmore/article/details/37611911 ie8 引入了一个新的概念.&quo ...

  6. 通过<meta>标签指定IE的文档模式实现CSS3兼容

    今天发现之前做好的一个页面在IE中打开显示的效果不正常,本地和服务器上显示的是两种不同的样式. 经过确认文档内容和CSS都是一样的. 通过IE F12(开发人员工具)发现不正常的样式 浏览器文档模式自 ...

  7. <JavaScript>“浏览器模式”和“文档模式”之间的区别

    只有IE浏览器中才会有“浏览器模式”和“文档模式”,兼容性视图涉及两个重要的功能便是“浏览器模式[browser mode]”和“文档模式[document mode]”,在IE8/IE9中按F12键 ...

  8. 【IE】浏览器模式与文档模式 及其开发中处理方式

    原文:http://blog.csdn.net/neo_liu0000/article/details/7589731 什么是浏览器模式和文本模式? 经常使用IE开发者工具的同学,肯定见过浏览器模式和 ...

  9. 设置IE浏览器文档模式版本

    浏览器版本问题是所有开发web的程序员共同的诟病,尤其是IE浏览器,笔者上次修改公司的一个项目中出现项目是在IE9没有出来之前,而现在修改时,则发现页面上出现的表格的错乱(因为表格是通过js动态生成的 ...

随机推荐

  1. Linux 下测试网卡性能命令iperf 的用法

    很多文件系统都自带iperf 命令,所以不用作多的移植工作. 如下查看他的帮助信息. Qt@aplex:~$ iperf -h Usage: iperf [-s|-c host] [options] ...

  2. python运算符

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAHCCAIAAADzel4SAAAgAElEQVR4Aey9+bMcSXLnV1dmna/ejR

  3. PHP PDO的FETCH_NUM、FETCH_BOTH、FETCH_ASSOC

    不容易混淆的有:FETCH_CLASS,FETCH_COLUMN,FETCH_OBJ... 数据库的连接准备部分 $dsn = 'mysql:host=127.0.0.1;port=3306;dbna ...

  4. PowerDesigner使用

    首先我们需要创建一个测试数据库,为了简单,我们在这个数据库中只创建一个Student表和一个Major表.其表结构和关系如下所示. 看看怎样用PowerDesigner快速的创建出这个数据库吧. 1. ...

  5. windows7 安装PHP7 本地网站搭建

    2016年5月21日 18:21:12 星期六 PHP7用了vc14编译的, 因此windows要下载安装一个vc14的发行包, 只有16M 2016年6月1日 23:23:52 星期三 利用PHP自 ...

  6. video.js使用教程API

    videojs就提供了这样一套解决方案,他是一个兼容html5的视频播放工具,早期版本兼容所有浏览器,方法是:提供三个后缀名的视频,并在不支持html5的浏览器下生成一个flash的版本. 最新的3. ...

  7. iOS App禁止横屏

    修改Info.plist文件Supported interface orientations的项目 该项目是字典 把Landscape相关的键值删除即可

  8. css中background背景属性概

    css中background背景属性概 background:url(背景图片路径)  no-repeat;/*不重复默认在左上方*/background:url(背景图片路径)  no-repeat ...

  9. 让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库

    获取Sqlite 1.可以用NuGet程序包来获取,它也会自动下载EF6 2.在Sqlite官网上下载对应的版本:http://system.data.sqlite.org/index.html/do ...

  10. 【XLL 框架库函数】 TempMissing/TempMissing12

    创建一个xltypeMissing 类型的 XLOPER/XLOPER12 原型 LPXLOPER TempMissing(void); LPXLOPER12 TempMissing12(void); ...