AngularJS 的 IE 兼容性

备注:AngularJS 1.3抛弃了对IE8的支持。可以在我们的博客上了解更多内容。AngularJS 1.2将继续支持IE8,但核心团队已经不打算在解决IE8及之前版本的问题上花时间。

本文档介绍了互联网浏览器(IE)在处理自定义HTML标签及属性时的特点。如果你正计划在IE8或更早的浏览器上部署Angular应用请阅读本文。

项目目前支持且将尝试修复IE9以上的bug 。持续集成服务器在IE9,IE10和IE11上运行所有的测试。详细内容参加Travis CIci.angularjs.org

我们不在IE8及之前的浏览器上运行测试。一些AngularJS的功能子集也许能够在在这些浏览器上工作,但这将由你来测试并决定它在你的特定应用上是否工作。

Garfielt
Garfielt
翻译于 2年前

3人顶

 翻译的不错哦!

短版本

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

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

?
1
2
3
4
5
6
7
8
9
10
11
<! 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属性

?
1
2
3
4
<! doctype  html>
   < html  xmlns:ng = "http://angularjs.org"  id = "ng-app"  ng-app = "optionalModuleName" >
     ...
   </ html >

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<! 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下工作(在撰写本文时的最新版本)。

Garfielt
Garfielt
翻译于 2年前

2人顶

 翻译的不错哦!

重要部分是:

  • xmlns:ng- 命名空间- 你需要为每一个自定义标签指定一个命名空间。

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

版本信息

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

  • 如果标签名以my:开头那么他会被当做XML命名空间并且必须有对应的命名空间声明<html xmlns:my="ignored">

  • 如果标签没有:符号但是不是标准HTML标签,那么必须提前使用document.createElement('my-tag')创建。

  • I如果你计划用CSS选择器改变自定义标签的样式,那么不管有没有命名空间你都得提前用document.createElement('my-tag')创建.

captain-cao
captain-cao
翻译于 2年前

1人顶

 翻译的不错哦!

好消息

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

如果我不这样做,会发生什么?

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

?
1
2
3
4
5
< html >
     < body >
       < mytag >some text</ mytag >
     </ body >
   </ html >

应该解析出如下的DOM:

?
1
2
3
4
5
#document
   +- HTML
      +- BODY
         +- mytag
            +- #text: some text

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

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

?
1
2
3
4
5
6
#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的结构。

地狱星星
地狱星星
翻译于 2年前

1人顶

 翻译的不错哦!

CSS风格的自定义标记命名

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
< 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 >


源引:http://www.oschina.net/translate/angularjs-ie-compatibility

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值