测试IE浏览器对JavaScript的AngularJS的兼容性
短版本
为确保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>
相关文章
angular源码学习第一篇 setupModuleLoader方法
这篇文章主要介绍了angular源码学习第一篇,setupModuleLoader方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2016-10-10Angular使用 ng-img-max 调整浏览器中的图片的示例代码
本篇文章主要介绍了Angular使用 ng-img-max 调整浏览器中的图片的示例代码,具有一定的参考价值,有兴趣的可以了解一下2017-08-08基于 angular material theming 机制修改 mat-toolbar 的背景色(示例详解
最近在学习 angular,记录一下昨天的进展,解决的问题是通过 theme 的配置修改 mat-toolbar 的背景色,避免对色彩的硬编码,这篇文章主要介绍了基于 angular material theming 机制修改 mat-toolbar 的背景色,需要的朋友可以参考下2022-10-10AngularJS深入探讨scope,继承结构,事件系统和生命周期
这篇文章主要介绍了AngularJS的scope,继承结构,事件系统和生命周期,较为详细的分析了scope的作用域、层次结构、继承及生命周期相关概念与使用技巧,需要的朋友可以参考下2016-11-11使用angularjs.foreach时return的问题解决
这篇文章主要介绍了使用angularjs.foreach时return的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-09-09AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
今天用angular写table的时候,遇到了一个问题。在ng-repeat中,含有动态的html,而这些html中含有自定义指令,怎么实现呢?下面小编给大家分享AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法,一起看看吧2017-01-01
最新评论