前言

本文主要研究的是angularJS框架在IE8下兼容性的问题,分析了导致angularjs框架在ie8下不能使用的各个因素,并逐个分析、解决它,并提出angularjs在IE8下统一的解决方案。

本文目的

1.提供angularJS在IE8下兼容性的统一解决方案。

兼容性说明 

编号

标题名称

描述

1

angularJS

angularJs从1.3版本开始已经放弃对IE8的支持

2

jquery

Jquery 1.9是最后支持IE6/7/8的版本,且jquery1.9中包含很多html5方法

3

bootstrap

Bootstrap css3的特性完全不支持ie8,且bootstrap3需要jquery版本至少为1.9.1

4

Html5

IE8不支持H5的特性和方法

5

ECMAScript

IE8仅支持一点ECMAScript5,ECMAScript6完全不支持

解决思路

根据上面表格中提出的兼容性问题,可以概括解决angularjs在ie8下兼容性问题的思路如下:

1.降低版本 使用angularjs-1.2.30,使用jquery-1.9.1,使用bootstrap3.3

2.加入补丁 :  加入ECMASCRIPT5补丁让IE8支持html5的特性与方法

3.手写补丁 :  es5补丁中没有或者无效的方法,需要手写补丁去支持

4.修改源码: 修改控件源码,替换,修改IE8不支持的方法,这是一个复杂、工程量大的问题,只能做到具体问题具体分析。 

运用思路1、2可以在IE8中搭建起angularjs前端MVC模式 ,运用思路3、4可以把不支持IE8的控件手动改造成支持IE8的控件,思路全部应用能够搭建支持IE8的angularjs前端框架!

解决版本问题

降低jquery到1.9.1版本,angularjs至少到1.2.30版本,bootstrap到3.3版本,这只是前提,此时并不能搭建好angularjs MVC模式,可以使用ui-router,但是ui-router实现的样式依赖bootstrap3,而bootstrap3不支持IE8,样式全部失效,整个页面布局乱七八糟,要想搭建好angularjs MVC必须解决bootstrap的IE8兼容性问题!

解决Bootstrap兼容性问题

1.使用html5文档声明

<!DOCTYPE html>

2.加入meta标签

前者定义媒体查询,后者确定显示此网页的IE版本。

<meta name="viewport"content="width=device-width, initial-scale=1">

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

3.引入respond.js和html5.js

respond.js是用于媒体查询,html5shiv : html5.js是让不支持或不全支持html5的浏览器“支持”html5标签,两者均需要到github中去下载,注:两者需要在head中加入,且要在jquery和bootstrap之前引入。

<script language="JavaScript" src="bower_components/bootstrap/html5shiv.js"></script>

<script language="JavaScript" src="bower_components/bootstrap/respond.js"></script>

完整代码

<!DOCTYPE html>

<html ng-controller="appCtrl">

<head>

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

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

<meta charset="UTF-8">

<script language="JavaScript" src="bower_components/bootstrap/html5shiv.js"></script>

<scriptlanguage="JavaScript" src="bower_components/bootstrap/respond.js"></script>

</head>

<scriptlanguage="JavaScript" src="bower_components/jquery/dist/jquery.js"></script>

<scriptsrc="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>

解决H5兼容性问题

经过上一步bootstrap的兼容性调整,现在我们已经可以让angular跑起来了!但仅仅这样是不够的,html5shiv.js只是让IE8支持h5的标签,我们还需让它支持H5的特性和方法,所以需要引入es5shim和es5sham,两者均需要在github下载,如下所示。

<script src="bower_components/es5-shim/es5-shim.js"></script>

<scriptsrc="bower_components/es5-shim/es5-sham.js"></script>

另外ie8不支持foreach,我们需要额外写补丁去修复它,代码如下。

if ( !Array.prototype.forEach ) {

Array.prototype.forEach = function forEach( callback, thisArg ) {

var T, k;

if ( this == null ) {

throw new TypeError("this is null or not defined" );

}

var O = Object(this);

var len = O.length >>> 0;

if ( typeof callback !== "function" ) {

throw new TypeError( callback +" is not a function" );

}

if ( arguments.length > 1 ) {

T = thisArg;

}

k = 0;

while( k < len ) {

var kValue;

if ( k in O ) {

kValue = O[ k ];

callback.call( T, kValue, k, O );

}

k++;

}

};

}

整合修复bootstrap完整代码如下,jquery和bootstrap一定要在之后引入.

至此angularjs在ie8下已经搭建成功了,现在我们要着手解决控件的问题,由于很多控件使用了不同的h5特性与方法,补丁不能够完全覆盖,我们要具体问题具体分析,这里以angular-ui-tree、ui-grid、ng-dialog、jquery-fileupload-angular为例。

其他细节:css上,bootstrap的col-sm、col-md无效,请使用col-xs系列 ,另外要额外修改bootstrap的from-control为

.form-control{
width:auto !important;
display:inline-block !important;
}

在指令的使用上不要把指定名称当做标签使用,因为采用了css3的东西,ie8是不识别的,这一点要额外注意


angular-ui-tree

ie8下启动angularjs成功后,发现树控件已经挂了,分析原因发现是ie8不支持catch和finally的写法

修改为

问题解决

解决了try catch问题后 发现树不能拖拽了,分析原因发现

问题出在this.originalEvent这段代码上,this.originalEvent为鼠标事件,在ie9中才支持,ie8中无法支持,必须写补丁,方法太多,补丁无法写出,所以树的拖拽功能暂时放弃,之后用其他形式替代

Grid控件

ie8下启动angularjs成功后,发现Grid已经挂了,分析原因发现Object.defineProperty出现了问题,原因在于在IE8下只支持对DOM元素定义property,无法对对象定义property

修改为:

问题解决。

ngDialog控件

ie8下启动angularjs成功后,发现Grid已经挂了,分析原因发现

querySelectorAll的问题,那么首先要观察focusableElementSelector的值,发现

focusableElementSelector="a[href],area[href],input:not([disabled]),select:not([disabled]), textarea:not([disabled]),button:not([disabled]),iframe,object,embed,*[tabindex],*[contenteditable]"

仔细分析发现IE8中的querySelector不支持input:not[(disabled)]这类css3的写法,去掉这种形式,牺牲了控件的一点功能,修改后解决。

dialogEl.querySelectorAll("a[href],area[href],iframe,object,embed,*[tabindex],*[contenteditable]");

jquery-fileupload 控件

ie8下启动angularjs成功后,发现fileupload控件已经挂了,分析原因发现

Ie8下不支持$applyAsync这个属性,$applyAsyncscope中的一个异步方法,跟他有同样作用的是$evalAsync,不同之处在于$evalAsync每次都会触发$digest循环,多了一些性能负担,但不影响控件的使用,把控件源码中所有$applyAsync修改为$evalAsync,问题解决。

最后,还要修改upload的后台

Application/json变为text/plain或text/html,这样返回的json信息IE才不会把它当做文件去下载。

总结

IE8属于旧时代的产物,被时代所淘汰已经是必然的趋势。然而,在实际工作中,由于业务和需求的限制我们有的时候不得不用IE8,处理它复杂的兼容性问题,angularjs是互联网时代的前端MVC框架,它与IE8配合就好比在奔腾4上玩LOL,就算可以运行,也会牺牲LOL的很多性能,本文虽然提出了一个IE8与angularjs配合的可行方案,但在实际工作中希望大家远离IE8,即使要用的话,相关的控件请使用纯jquery或javascript控件,新的控件多多少少都涉及到了H5,在IE8上多数是不可行的。

angularJS与IE8整合简介相关推荐

  1. gulp+webpack工具整合简介

    webpack简介 Webpack 是一个模块打包器.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. webpack特点 Webpack 有两种组织模块依赖的方式 ...

  2. SSM-框架整合(简介+源码)

    SSM-框架整合 SSM简介 1.Spring 2.SpringMVC 3.mybatis 4.简约流程 环境准备 搭建流程 1. 数据库准备 2. 创建maven项目并配置 3.SSM框架简单使用 ...

  3. [AngularJS]Chapter 1 AnjularJS简介

    创建一个完美的Web应用程序是很令人激动的,但是构建这样应用的复杂度也是不可思议的.我们Angular团队的目标就是去减轻构建这样AJAX应用的复杂度.在谷歌我们经历过各种复杂的应用创建工作比如:GM ...

  4. Spring+SpringMVC+mybatis+Quartz整合

    Quartz与SpringMVC的整合 简介 Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调 ...

  5. 再叙AngularJS

    上一篇讲到AngularJS是在三月17号,已经过去整整3个月. 当时我也只是AngularJS的入门程序员,文章涉及的内容也只是针对框架的特性和Backbone进行简单的对比. 在当时,我正在进行内 ...

  6. 单细胞测序数据整合(Seurat V4.0) vignettes

    Introduction to scRNA-seq integration • Seurathttps://satijalab.org/seurat/articles/integration_intr ...

  7. Spring Security 参考手册(一)

    Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...

  8. redis 登录_Redis集群架构+Dubbo开发框架+SSO单点登录+Nginx+ZooKeeper

    Redis集群架构 [课程介绍] Redis是现在使用为广泛的NoSQL数据库技术,其自身不仅拥有着良好的操作性能,也被广泛的应用于各种集群架构的数据整合处理之中,而本课程将通过Redis的核心作用, ...

  9. Reactjs 踏坑指南1: 一些概念

    Reactjs 踏坑指南1: 知识点 什么是React 虚拟DOM JSX 组件 生命周期和状态 事件 单项数据流 Reactjs和Angularjs的对比 React简介 React是一个Faceb ...

  10. Django 优秀资源大全项目资源非 Python 包工具贡献

    Awesome Django 介绍 Awesome-Django 是由 Roberto Rosario 发起和维护的 Django 资源列表.该列表收集了大量 Django 相关的优秀应用.项目等资源 ...

最新文章

  1. 正则 不能有中文逗号_Python爬虫教程-19-数据提取-正则表达式(re)
  2. MM--发票校验 及基于采购订单的MIRO发票校验过程
  3. 约数个数定理约数和定理
  4. 已知三个用不同数制表示的整数_数制的概念与常用的数制之间的转换。大学生必看!...
  5. 解决使用sudo没问题,但是使用su会报错 su: Authentication failure 的问题
  6. 最简单DIY的51蓝牙遥控小车设计方案
  7. 动易 当前服务器不允许上传文件,动易网站详细安说明及常见疑难解答.doc
  8. java swfupload 302_SWFUpload 302
  9. python中将字符变为大写_python3.4.3将汉字转换为大写拼音首字母
  10. 苹果mac电脑如何安装虚拟机?CrossOver Mac2022
  11. VS2019创建基于SDL+ffmpeg的工程
  12. Linux打印服务-CUPS的安装、配置和使用
  13. 你的windows许可证即将过期
  14. wxpython wx.Destroy()和wx.Close()区别
  15. 无线降噪耳机推荐,热销火爆的四款降噪耳机推荐
  16. mysql安装以及安装navicat并且连接
  17. Struts 2 studing
  18. VC学习资料收集(12):VC小知识总结
  19. 在GitHub Students Developer Pack申请DigitalOcean的50刀优惠码
  20. MAC 软件避坑之坚果云

热门文章

  1. stm23f103 usart1串口中断可进入,而stm32f205 usart1的中断进不去解决办法
  2. mini2440裸机之Touchpanel
  3. 手机算通用计算机还是,通用盾是一种u盾。手机和电脑都可以用。问一...
  4. phpStorm下载安装图文教程
  5. 在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)
  6. 《高等代数学》(姚慕生),习题1.2:三阶行列式
  7. oracle查询日志空间大小,ORACLE 管理 日志与空间
  8. 爱立信 电话面试 java_电话面试爱立信
  9. 3D人体重建方法漫谈
  10. 在vs2005中遇到的调试问题以及解决办法