【问题标题】:RequireJS and IE9RequireJS 和 IE9
【发布时间】:2016-08-19 12:03:05
【问题描述】:

我试图在之前的问题中找到解决方案,但我找不到。 我有一个使用 requireJS 在 jquery 中开发的 web 项目。一切似乎都运行良好(在所有现代浏览器中),直到我在没有脚本工作的 IE9 中进行测试。我试图找到原因,但我能得到的只是开发工具控制台的反馈:

SCRIPT1002:语法错误 libCommon.js,第 10 行字符 3

SCRIPT445:对象不支持此操作 libEvents.js,第 5 行 字符 2

这是 libCommon.js 的开始代码:

//generic JS for all views
define(['jquery'], function ($) {
    var LibCommon = function () {};

LibCommon.prototype.hideSubmenu = function() {
    $submenu.removeClass('show');
}

LibCommon.prototype.toggleSubmenu = function(tipo) {
    const $tipoSubmenu = $('#'+tipo);
    this.hideSubmenu();
    if (!$tipoSubmenu.hasClass('show')) {
        $tipoSubmenu.addClass('show');
    } else {
        $tipoSubmenu.removeClass('show');
    }
};

//and other functions...

这是 libEvents.js 的开始代码:

//generic JS for all views
define(['jquery', 'bootstrap', './libCommon', 'modernizr'], function ($, Bootstrap, LibCommon, Modernizr) {


var common = new LibCommon();
/**
 * =================
 * TO EXECUTE WHEN INIT
 * =================
 */
$( document ).ready(function() {
    console.log('initialized all common events');

    var common = new LibCommon();

    // Fixed header  
    var stickyNavTop = $('.topmenu').offset().top;
    common.fixedNav(stickyNavTop);
    $(window).scroll(function() {
        common.fixedNav(stickyNavTop);
    });

// and other functions or events...

在这两个错误中,它是在 requireJS 中定义所有对象/依赖项之后创建对象的变量/实例的第一个字符,因此它不应该是错误。我尝试更改为var common = 0;,但控制台中继续出现错误。似乎 IE9 不喜欢任何脚本。否则,require 的实例正在工作,因为引导程序正常工作。有什么想法吗?

【问题讨论】:

  • IE9 不支持 ES6,所以我认为是 const $tipoSubmenu = $('#'+tipo); 行有问题,因为 IE9 不识别 const。你有modernizr 或不同的shim,所以你可以使用ES6 语法吗?
  • 你是对的。删除 const 行使所有 js 代码加载成功,IE9 解释所有 JS。遗憾的是 IE9 控制台没有给你正确的错误行,所以我找不到它。谢谢@Shilly

标签: javascript jquery requirejs internet-explorer-9


【解决方案1】:

Shilly 已经在评论中指出不应将 ES6 构造传递给 IE9。要么编写 ES5,要么使用工具进行转译。

现在,您在libEvents 中遇到的错误很奇怪,因为libCommon 根本不应该加载,因此libEvents 的工厂不应该运行,因为其中一个依赖项没有加载。有可能加载模块 并且 稍后给出错误。但我不记得曾经在一个模块的立即解释代码中看到一个语法错误,它不仅导致加载失败。 (您显示的代码会立即解释,即使稍后执行。如果您在其中有eval(string_of_code)Function(string_of_code),那么string_of_code 将稍后进行解释,但这不是您的代码中发生的事情。)我怀疑 RequireJS 继续为libEvents 执行工厂的原因与在 IE9 及更低版本中捕获加载失败的问题有关。 documentation 建议开启enforceDefine。我会为您的代码执行此操作。这并不能解决所有问题,但它可能有助于 RequireJS 更好地检测问题。

console.log 也可能会给您带来麻烦,正如this question and answer 所解释的那样。

【讨论】:

  • 由于IE9编译我的JS的方式,我完全迷失了。我无法理解如何在没有 libCommon.js 的情况下加载 libEvents.js,如您所提到的那样正确加载。我阅读了requirejs文档并尝试打开enforceDefine,但我没有得到解决我的问题的解决方案。感谢您的时间@Louis
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2014-08-04
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多