angularJS与IE8整合简介
前言
本文主要研究的是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这个属性,$applyAsync为scope中的一个异步方法,跟他有同样作用的是$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整合简介相关推荐
- gulp+webpack工具整合简介
webpack简介 Webpack 是一个模块打包器.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. webpack特点 Webpack 有两种组织模块依赖的方式 ...
- SSM-框架整合(简介+源码)
SSM-框架整合 SSM简介 1.Spring 2.SpringMVC 3.mybatis 4.简约流程 环境准备 搭建流程 1. 数据库准备 2. 创建maven项目并配置 3.SSM框架简单使用 ...
- [AngularJS]Chapter 1 AnjularJS简介
创建一个完美的Web应用程序是很令人激动的,但是构建这样应用的复杂度也是不可思议的.我们Angular团队的目标就是去减轻构建这样AJAX应用的复杂度.在谷歌我们经历过各种复杂的应用创建工作比如:GM ...
- Spring+SpringMVC+mybatis+Quartz整合
Quartz与SpringMVC的整合 简介 Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调 ...
- 再叙AngularJS
上一篇讲到AngularJS是在三月17号,已经过去整整3个月. 当时我也只是AngularJS的入门程序员,文章涉及的内容也只是针对框架的特性和Backbone进行简单的对比. 在当时,我正在进行内 ...
- 单细胞测序数据整合(Seurat V4.0) vignettes
Introduction to scRNA-seq integration • Seurathttps://satijalab.org/seurat/articles/integration_intr ...
- Spring Security 参考手册(一)
Spring Security 参考手册 Ben AlexLuke TaylorRob WinchGunnar Hillert Spring security 是一个强大的和高度可定制的身份验证和访问 ...
- redis 登录_Redis集群架构+Dubbo开发框架+SSO单点登录+Nginx+ZooKeeper
Redis集群架构 [课程介绍] Redis是现在使用为广泛的NoSQL数据库技术,其自身不仅拥有着良好的操作性能,也被广泛的应用于各种集群架构的数据整合处理之中,而本课程将通过Redis的核心作用, ...
- Reactjs 踏坑指南1: 一些概念
Reactjs 踏坑指南1: 知识点 什么是React 虚拟DOM JSX 组件 生命周期和状态 事件 单项数据流 Reactjs和Angularjs的对比 React简介 React是一个Faceb ...
- Django 优秀资源大全项目资源非 Python 包工具贡献
Awesome Django 介绍 Awesome-Django 是由 Roberto Rosario 发起和维护的 Django 资源列表.该列表收集了大量 Django 相关的优秀应用.项目等资源 ...
最新文章
- 正则 不能有中文逗号_Python爬虫教程-19-数据提取-正则表达式(re)
- MM--发票校验 及基于采购订单的MIRO发票校验过程
- 约数个数定理约数和定理
- 已知三个用不同数制表示的整数_数制的概念与常用的数制之间的转换。大学生必看!...
- 解决使用sudo没问题,但是使用su会报错 su: Authentication failure 的问题
- 最简单DIY的51蓝牙遥控小车设计方案
- 动易 当前服务器不允许上传文件,动易网站详细安说明及常见疑难解答.doc
- java swfupload 302_SWFUpload 302
- python中将字符变为大写_python3.4.3将汉字转换为大写拼音首字母
- 苹果mac电脑如何安装虚拟机?CrossOver Mac2022
- VS2019创建基于SDL+ffmpeg的工程
- Linux打印服务-CUPS的安装、配置和使用
- 你的windows许可证即将过期
- wxpython wx.Destroy()和wx.Close()区别
- 无线降噪耳机推荐,热销火爆的四款降噪耳机推荐
- mysql安装以及安装navicat并且连接
- Struts 2 studing
- VC学习资料收集(12):VC小知识总结
- 在GitHub Students Developer Pack申请DigitalOcean的50刀优惠码
- MAC 软件避坑之坚果云
热门文章
- stm23f103 usart1串口中断可进入,而stm32f205 usart1的中断进不去解决办法
- mini2440裸机之Touchpanel
- 手机算通用计算机还是,通用盾是一种u盾。手机和电脑都可以用。问一...
- phpStorm下载安装图文教程
- 在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)
- 《高等代数学》(姚慕生),习题1.2:三阶行列式
- oracle查询日志空间大小,ORACLE 管理 日志与空间
- 爱立信 电话面试 java_电话面试爱立信
- 3D人体重建方法漫谈
- 在vs2005中遇到的调试问题以及解决办法