修复IE8中的AngularJS问题

时间:2014-03-05 20:52:13

标签: javascript jquery html angularjs internet-explorer-8

我在Firefox上开发了一个带AngularJS 1.2.13(和JQuery 1.11.0)的应用程序。它也适用于Chrome。现在是困难的部分。我已经遵循了几个建议,让它在IE8上运行。

当我加载页面时,我目前在开发工具窗口的JS控制台中获得了非常有用的“[object Error]”(以及其他任何内容)。该页面显示了下载的原始html,因此Angular基本上无能为力。

这是我的index.html的顶部:

<!DOCTYPE html>
<html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="DiagApp">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--[if IE 8]><!--> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <!--<![endif]-->

即使我不处于怪癖模式(在开发工具窗口中,“文档模式”表示“IE7标准”,而不是“Quirks模式”),我仍然会得到以下结果:

  [$sce:iequirks] Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks mode.  You can fix this by adding the text <!doctype html> to the top of your HTML document.  See http://docs.angularjs.org/api/ng.$sce for more information.

http://errors.angularjs.org/1.2.13/ $ sce / iequirks angular.js,line 3689 character 19

所以,我在模块中的配置函数中添加了以下内容,修复了这个问题:

$sceProvider.enabled(false);

当我在“脚本”选项卡中查看HTML时,它看起来都是正确的颜色,这表明我已经正确验证了(我之前发现我的HTML中有一个拼写错误导致它没有正确着色(一个拼写错误)哪个Firefox和Chrome忽略了))。

我设置断点以显示它正在加载我的模块,也在主控制器中。这告诉我它正在加载模块,但它从未击中我的主控制器。我尝试在angularjs代码中设置一些断点,但这导致了各种曲折的段落,没有明显的价值。

我听说过一些我应该用于&lt; = IE8的polyfill,但我只注意到&lt; = IE7的polyfill提到。

我还能尝试其他什么吗?

2 个答案:

答案 0 :(得分:2)

如果您想在IE8中支持Angular应用程序,有几个因素需要考虑,即:

  • 您需要对您的JSON进行polyfil以处理字符串化和解析 旧IE版本本身不支持的功能
  • 您需要显式创建任何自定义HTML元素标记(自定义 IE8或以下版本不支持HTML标记)
  • 你需要摆脱任何误入歧途的文件类型。废话你好吗? 需要使用&#34; ng-app&#34;属性(我注意到你已经照顾过这个)
  • 您需要为IE 8的某些JS函数创建polyfill 并不支持原生,例如&#39; forEach&#39;

从我看过的HTML(上图)中,您似乎需要进一步修改HTML标头。在我的情况下,我有一个共享&#39; _Layout.cshtml&#39;我只进行一次以下更改的页面:

<!--[if lte IE 8]>
        @Styles.Render("~/Content/iecss")
        <script src="~/Scripts/Libs/respond.min.js"></script>
        <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7/html5shiv.js"></script>
    <![endif]-->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    <!--[if lte IE 8]>
      <script>
        document.createElement('ng-include');
        document.createElement('ng-pluralize');
        document.createElement('ng-view');
        document.createElement('ng:include');
        document.createElement('ng:pluralize');
        document.createElement('ng:view');
      </script>
    <![endif]-->
    <!--[if lt IE 8]>
      <script src="~/Scripts/Libs/json2.js"></script>
    <![endif]-->
    <!--[if lte IE 8]>
        <script>
        document.createElement('my-editor');
        </script>
    <![endif]-->

答案 1 :(得分:0)

当我必须支持怪癖模式时,我发现一旦你设置了$sceProvider.enabled(false);并添加了所有垫片,你还需要填充indexOffilter。最近我一直在使用https://github.com/es-shims/es5-shim来解决问题。