测试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 相关文章推荐
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
Nov 10 Javascript
js中eval详解
Mar 30 Javascript
js全屏显示显示代码的三种方法
Nov 11 Javascript
提取jquery的ready()方法单独使用示例
Mar 25 Javascript
单元选择合并变色示例代码
May 26 Javascript
用JS实现图片轮播效果代码(一)
Jun 26 Javascript
深入理解JS DOM事件机制
Aug 06 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
May 03 Javascript
jQuery简单绑定单个事件的方法示例
Jun 10 jQuery
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
Vue 子组件与数据传递问题及注意事项
Jul 11 Javascript
JavaScript实现两个数组的交集
Mar 25 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 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
smarty内置函数section的用法
2015/01/22 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
AngularJs Forms详解及简单示例
2016/09/01 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
在Python中COM口的调用方法
2019/07/03 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
某公司C#程序员面试题笔试题
2014/05/26 面试题
行政部工作岗位职责范本
2014/03/05 职场文书
会计岗位职责模板
2014/03/12 职场文书
解除劳动合同证明书
2014/09/26 职场文书
民事上诉状范文
2015/05/22 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python