angular1.2针对ie8的兼容问题

AngularJS 1.3抛弃了对IE8的支持,但AngularJS 1.2将继续支持IE8,但核心团队已经不打算在解决IE8及以前版本的问题上花时间。本文档介绍了互联网浏览器(IE)在处理自定义HTML标签及属性 时的特色。若是你正计划在IE8或更早的浏览器上部署Angular应用请阅读本文。html

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

咱们不在IE8及以前的浏览器上运行测试。一些AngularJS的功能子集也许可以在在这些浏览器上工做,但这将由你来测试并决定它在你的特定应用上是否工做。Angular应用在IE上可以工做请确认:json

短版本

为确保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>app

2. 在链接处将id="ng-app"添加到根元素,使用ng-app属性ide

<!doctype html>
  <html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
    ...
  </html>测试

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

4. 若是你必须要用自定义元素标记,而后你必须采起如下步骤以确保IE8及以前版本都能用:.net

<!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')建立。
  • I若是你计划用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>

相关文章
相关标签/搜索