备注:AngularJS 1.3抛弃了对IE8的支持。可以在我们的博客上了解更多内容。AngularJS 1.2将继续支持IE8,但核心团队已经不打算在解决IE8及之前版本的问题上花时间。
本文档介绍了互联网浏览器(IE)在处理自定义HTML标签及属性时的特点。如果你正计划在IE8或更早的浏览器上部署Angular应用请阅读本文。
项目目前支持且将尝试修复IE9以上的bug 。持续集成服务器在IE9,IE10和IE11上运行所有的测试。详细内容参加Travis CI及ci.angularjs.org。
我们不在IE8及之前的浏览器上运行测试。一些AngularJS的功能子集也许能够在在这些浏览器上工作,但这将由你来测试并决定它在你的特定应用上是否工作。
带你走近AngularJS系列:
AngularJS 之 Factory vs Service vs Provider
短版本为确保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="https://www.linuxidc.com/path/to/json2.js"></script>
<![endif]-->
</head>
<body>
...
</body>
</html>
2. 在连接处将id="ng-app"添加到根元素,使用ng-app属性
<!doctype html>
<html xmlns:ng="http://angularjs.org" ng-app="optionalModuleName">
...
</html>
3. 你不能使用自定义的元素标记,像<ng:view>(使用属性版本<div ng-view>来代替),或
4. 如果你必需要用自定义元素标记,然后你必须采取以下步骤以确保IE8及之前版本都能用:
<!doctype html>
<html xmlns:ng="http://angularjs.org" 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>