测试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 相关文章推荐
原生javascript获取元素样式属性值的方法
Dec 25 Javascript
js 字符串转换成数字的三种方法
Mar 23 Javascript
javascript判断非数字的简单例子
Jul 18 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
Nov 19 Javascript
使用Plupload实现直接上传附件至七牛云存储
Dec 26 Javascript
JQuery遍历DOM节点的方法
Jun 11 Javascript
json+jQuery实现的无限级树形菜单效果代码
Aug 27 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
May 02 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
Jun 04 jQuery
详解mpvue实现对苹果X安全区域的适配
Jul 31 Javascript
详解vue中多个有顺序要求的异步操作处理
Oct 29 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生成txt文件标题及内容的方法
2014/01/16 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
js实现无缝滚动特效
2015/12/20 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
jquery 手势密码插件
2017/03/17 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
解决Python安装cryptography报错问题
2020/09/03 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
中学生在校期间的自我评价分享
2013/11/13 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
中央空调节能方案
2014/06/15 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
2015年社区工作总结
2015/04/08 职场文书
创业计划之特色精品店
2019/08/12 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
《宝可梦》动画制作25周年到来 官方发布特别纪念视频
2022/04/01 日漫
vue动态绑定style样式
2022/04/20 Vue.js
台积电称即便经济低迷也没有降价的计划
2022/04/21 数码科技