测试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 相关文章推荐
以JSON形式将JS中Array对象数组传至后台的方法
Jan 06 Javascript
js加入收藏以及使用Jquery更改透明度
Jan 26 Javascript
原生javascript实现解析XML文档与字符串
Mar 01 Javascript
理解javascript函数式编程中的闭包(closure)
Mar 08 Javascript
jQuery实现查找最近父节点的方法
Jun 23 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
jQuery ajax仿Google自动提示SearchSuggess功能示例
Mar 28 jQuery
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 Javascript
解决vue中el-tab-pane切换的问题
Jul 19 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
Sep 04 Javascript
vue-video-player视频播放器使用配置详解
Oct 23 Javascript
字节飞书面试promise.all实现示例
Jun 16 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中var_export与var_dump的区别分析
2010/08/21 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
python提取页面内url列表的方法
2015/05/25 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Python 探针的实现原理
2016/04/23 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Python如何发布程序的详细教程
2018/10/09 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
商业街策划方案
2014/05/31 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android