测试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 火狐(firefox)不显示本地图片问题解决
Jul 05 Javascript
javascript 贪吃蛇实现代码
Nov 22 Javascript
JavaScript关于select的相关操作说明
Jan 13 Javascript
Javascript判断对象是否相等实现代码
Mar 18 Javascript
如何防止JavaScript自动插入分号
Nov 05 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
自动化测试读写64位操作系统的注册表
Aug 15 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
Mar 03 Javascript
手把手教你使用vue-cli脚手架(图文解析)
Nov 08 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
vue登录页面cookie的使用及页面跳转代码
Jul 10 Javascript
javascript设计模式之迭代器模式
Jan 30 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
PHPUnit安装及使用示例
2014/10/29 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
php生成mysql的数据字典
2016/07/07 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
用js实现下载远程文件并保存在本地的脚本
2008/05/06 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
javascript的push使用指南
2014/12/05 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
python用来获得图片exif信息的库实例分析
2015/03/16 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
婚宴邀请函
2015/01/30 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
Python采集壁纸并实现炫轮播
2022/04/30 Python