测试IE浏览器对JavaScript的AngularJS的兼容性


Posted in Javascript onJune 19, 2015

短版本

为确保Angular应用在IE上能够工作请确认:

1. 在IE7或更早的版本上polyfill JSON.stringify。你可以使用JSON2或JSON3来polyfills。
 

<!doctype html>
 <html xmlns:ng="http://angularjs.org">
  <head>
   <!--[if lte IE 7]>
    <script src="/path/to/json2.js"></script>
   <![endif]-->
  </head>
  <body>
   ...
  </body>
 </html>

2. 在连接处将id="ng-app"添加到根元素,使用ng-app属性
 

<!doctype html>
 <html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
  ...
 </html>

3. 你不能使用自定义的元素标记,像<ng:view>(使用属性版本<div ng-view>来代替),或

4. 如果你必需要用自定义元素标记,然后你必须采取以下步骤以确保IE8及之前版本都能用:
 

<!doctype html>
 <html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
  <head>
   <!--[if lte IE 8]>
    <script>
     document.createElement('ng-include');
     document.createElement('ng-pluralize');
     document.createElement('ng-view');
 
     // Optionally these for CSS
     document.createElement('ng:include');
     document.createElement('ng:pluralize');
     document.createElement('ng:view');
    </script>
   <![endif]-->
  </head>
  <body>
   ...
  </body>
 </html>

5. 使用ng-style标记来替代style="{{ someCss }}"。后续的版本能够在Chrome和Firefox下工作但不能在IE版本<=11下工作(在撰写本文时的最新版本)。

重要部分是:

  •     xmlns:ng- 命名空间- 你需要为每一个自定义标签指定一个命名空间。
  •     document.createElement(yourTagName)- 创建自定义标签名 - 因为这只是对旧版本IE的问题,所以你需要指定加载条件。对于每一个没有命名空间并且在HTML中没有定义的标签,你需要提前声明以使得IE识别。

版本信息

IE对非标准的标签元素有很多问题。这些问题可以归为两大类别,每一类别都有自己的解决办法。

  •     如果标签名以my:开头那么他会被当做XML命名空间并且必须有对应的命名空间声明<html xmlns:my="ignored">
  •     如果标签没有:符号但是不是标准HTML标签,那么必须提前使用document.createElement('my-tag')创建。
  •     如果你计划用CSS选择器改变自定义标签的样式,那么不管有没有命名空间你都得提前用document.createElement('my-tag')创建.

好消息

好消息是这些限制仅仅适用于元素标记名称并不适用于元素属性名称。因此,在IE中并不需要特别的处理:<div my-tag your:tag></div>
如果我不这样做,会发生什么?

假如你使用HTML的未知标记mytag(my:tag或者my-tag结果是相同的):

<html>
  <body>
   <mytag>some text</mytag>
  </body>
 </html>

 

应该解析出如下的DOM:
 

#document
 +- HTML
   +- BODY
    +- mytag
      +- #text: some text

预期的行为是BODY元素有一个mytag子元素,它带有一些文字。

但是在IE中不是这样的(如果没有包含上面的修订)
 

#document
 +- HTML
   +- BODY
    +- mytag
    +- #text: some text
    +- /mytag

在IE中,BODY元素有三个子元素:

1,一个自关闭的mytag。例如自关闭标签<br/>。/是可选的,但是<br>标签是不允许有子元素的,浏览器将<br>some text</br>视为三个同辈的标签,而some text并不是<br>的子元素。

2,一个文本节点some text。在上面这应该是mytag的子元素,而不是同辈标签

3.一个损坏的自关闭的/mytag。这是一个损坏的元素因为元素名称是不允许带/字符的。另外,这种子关闭的元素并不是DOM的一部分,它仅仅是用于描述DOM的结构。

CSS风格的自定义标记命名

为确保CSS选择器能够在自定义元素上工作,自定义元素的名称必须预先使用document.createElement('my-tag')创建,不需顾虑XML的命名空间。
 

<html xmlns:ng="needed for ng: namespace">
  <head>
   <!--[if lte IE 8]>
    <script>
     // 需要确认ng-include被正常解析
     document.createElement('ng-include');
 
     // 需求启用CSS引用
     document.createElement('ng:view');
    </script>
   <![endif]-->
   <style>
    ng\:view {
     display: block;
     border: 1px solid red;
    }
 
    ng-include {
     display: block;
     border: 1px solid blue;
    }
   </style>
  </head>
  <body>
   <ng:view></ng:view>
   <ng-include></ng-include>
   ...
  </body>
 </html>
Javascript 相关文章推荐
AlertBox 弹出层信息提示框效果实现步骤
Oct 11 Javascript
javascript判断iphone/android手机横竖屏模式的函数
Dec 20 Javascript
使用js获取地址栏中传递的值
Jul 02 Javascript
javascript学习笔记(一)基础知识
Sep 30 Javascript
浅谈javascript 归并方法
Jan 21 Javascript
jQuery实现左右切换焦点图
Apr 03 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
Oct 20 Javascript
JS判断是否手机或pad访问实现方法
Dec 09 Javascript
关于ES6箭头函数中的this问题
Feb 27 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 Javascript
React性能优化系列之减少props改变的实现方法
Jan 17 Javascript
mpvue+vant app搭建微信小程序的方法步骤
Feb 11 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
Jun 19 #Javascript
Backbone.js的Hello World程序实例
Jun 19 #Javascript
使用AngularJS处理单选框和复选框的简单方法
Jun 19 #Javascript
详细分析使用AngularJS编程中提交表单的方式
Jun 19 #Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 #Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 #Javascript
详细解读AngularJS中的表单验证编程
Jun 19 #Javascript
You might like
PHP新手上路(十一)
2006/10/09 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
python 判断自定义对象类型
2009/03/21 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
django2 快速安装指南分享
2018/01/05 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
使用python计算三角形的斜边例子
2020/04/15 Python
python如何操作mysql
2020/08/17 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
自我鉴定思想方面
2013/10/07 职场文书
2014年新生军训方案
2014/05/01 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2014年语文教师工作总结
2014/12/18 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
java调用Restful接口的三种方法
2021/08/23 Java/Android
CentOS安装Nginx并部署vue
2022/04/12 Servers
Vue深入理解插槽slot的使用
2022/08/05 Vue.js