我试着在以前的问题中找到解决方案,但我不能。我有一个使用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的实例正在工作,因为bootstrap工作正常。任何想法?
Shilly已经在评论中指出,你不应该将ES6结构传递给IE9。要么写ES5,要么用工具编译。
现在,您在libEvents
中得到的错误是奇怪的,因为libCommon
根本不应该加载,因此libEvents
的工厂不应该运行,因为其中一个依赖项没有加载。有可能让模块加载和之后给出错误。但是我不记得曾经在模块的立即解释代码中看到过语法错误,这不仅会导致加载失败。(您所显示的代码是立即解释,即使它是稍后执行。如果你有一个eval(string_of_code)
在那里或Function(string_of_code)
然后string_of_code
将被解释,但这不是发生在你的代码。)我怀疑RequireJS继续为libEvents
执行工厂的原因与在IE9和更低版本中捕获加载失败的问题有关。文档建议打开enforceDefine
。我会为你的代码这样做。这并不能解决所有问题,但它可以帮助RequireJS更好地检测问题。
console.log
也可能会给你带来麻烦,正如这个问题和答案所解释的。