兼容ie8


### 一、招商盾新页面登录失效

#### 1.问题描述

现有两个PC系统,分别是招I宝、优智保,两个系统共用同一后端服务。
由于项目特殊,招I宝前端部署在金科服务器,优智保前端部署在第三方服务器,后端服务部署在金科服务。
前端采用cookie存储用户信息,前端两个系统的用户信息通过cookie key来作区分,不同系统通过不同key来获取用户信息,后端用户session未作区分。
在招商盾浏览器中登录招I宝,在登录成功的前提下新标签页打开招I宝任意页面,弹窗提示用户登录已失效或未登录。该问题只能在招商盾中复现,在其他浏览器均无此问题。

#### 2.解决方案

由于招商盾无法进行程序调试,该问题无法准确定位,只能怀疑是与招商盾浏览器设置有关。
为解决该问题,前端不在本地使用cookie存储用户信息,用户信息只通过接口获取,依靠后端利用session进行登录状态控制。同时,后端设置同一域名下只允许登录一个系统,前端表现为:同一浏览器下同时登录两个系统时将自动踢出较早登录的账户。这样保证了后端session只允许一用户一值,避免两个系统用户信息混淆、串单。

### 二、IE8跨域兼容

#### 1.问题描述

由于前后端分离部署,接口存在跨域问题。

#### 2.解决方案

前端使用的jquery(v1.9)和jquery.xdr.js(xDomainRequest),一共三个设置。

前端设置

```
$.support.cors=true; //ie8,9下xDomainRequest携带第三方cookie
```

```
$.ajax({
crossDomain:true,
xhrFields:{withCredentials:true} //xmlHttpRequest携带第三方cookie
})
```

后台设置

```
res.header('Access-Control-Allow-Origin', '前端使用的域名');
res.header('Access-Control-Allow-Methods', 'OPTIONS,GET,PUT,POST,DELETE');
res.header('P3P', 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header("Access-Control-Allow-Credentials", "true");
```

注意点:

IE8、9使用xDomainRequest来发起请求,无法设置request.header 'application/json',默认发送的数据格式为application/oct-stream,后端统一使用流接收数据,再解析成需要的格式。

### 三、PDF招商盾预览兼容

#### 1.问题描述

通过直接打开pdf会触发浏览器的预览行为,可能是招商盾中可能是adobe被禁用了,所以预览不出来,也无法下载。
ie浏览器中不支持a标签中的download属性,会使用直接打开文件的方式来触发下载,但是也可能触发浏览器的预览行为。

#### 2.解决方案

- 使用pdf.js阅览pdf;
- 使用nginx代理一层路径作为下载路径,并添加返回头信息add_header Content-Disposition "attachment",主动触发浏览器的下载动作。

### 四、保单下载浏览器兼容

#### 1.问题描述

在开发对接仁和、华泰、国寿三大保险公司进行投保并生成保单下载过程中,由于每一个保险公司给出的电子保单下载形式皆不同。如国寿保险提供了文件流的形式、华泰保险提供了下载URL的形式,不同浏览器会有不同的兼容问题,如qq、360浏览器会误把请求电子保单接口的URL认为是下载链接、IE浏览器不支持a.download方法。

#### 2.解决方案

针对这种情况和考虑到浏览器兼容的问题,需要对不同情况作出判断:

- qq、360等浏览器把请求电子保单的接口设置成伪文件链接的形式:如https:xxxx.com/api/dl?id=123.pdf,然后后端配合,对请求参数进行截断处理,结果回归正常。
- IE、IE内核的浏览器不支持a.download,针对这种情况,进行兼容性判断,并使用window.open()打开电子保单URL让用户在浏览器中保存PDF或者直接下载(招商盾)。

### 五、轮播插件IE8兼容

#### 1.问题描述

轮播容器自适应窗口宽度,为保证图片不被拉升,使用背景图,但是IE8不支持background-size属性。

#### 2.解决方案

使用filter来替代

```
filter: progid: DXImageTransform.Microsoft.AlphaImageLoader(src='图片地址', sizingMethod='scale')
```

### 六、IE、Firefox浏览器缓存击穿

#### 1.问题描述

测试中发现,在IE、Firefox浏览器中(IE尤为严重),常常出现缓存命中:请求只读取浏览器缓存的情况(尽管使用浏览器自带的缓存清理后仍存在,估计与内存释放不及时有关)。

#### 2.解决方案

为了击穿浏览器缓存,我们采用了比较常见的做法,对全局的ajax网络请求进行URL特殊标识,如URL后添加随机数,让URL请求不再变成`HTTP 304 Not Modified`,而是每次都是一次新的请求。可以持续优化之处:可以针对不需要击穿缓存的URL设置白名单,让浏览器自行读取管理资源缓存。

### 七、IE unselectable影响事件响应顺序问题

#### 1.问题描述

输入证件信息后,日期输入框需锁定;日期输入框使用input来响应点击事件,触发选择器;为阻止获取焦点IE在不支持readonly属性时使用unselectable='no',该属性造成事件响应顺序混乱,添加该属性的元素的input框的点击事件会比其他输入框的change/blur事件先执行。

#### 2.解决方案

使用div来替代input框,input[type='hidden']来存储数据
原文地址:https://www.cnblogs.com/gudun/p/11207214.html