【发布时间】:2013-12-12 00:26:15
【问题描述】:
谁能解释为什么在 Internet Explorer 中,代码示例 1 不起作用而代码示例 2 起作用?
代码 1(非功能性)
Modernizr.load([
{
load: [
'../includes/css/foo.css',
'../includes/js/foo.js',
'../includes/js/bar.js'
],
complete: function() {
initBar();
}
}
]);
代码 2(功能)
Modernizr.load([
{
load: [
'../includes/css/foo.css',
'../includes/js/foo.js',
'../includes/js/bar.js'
],
complete: function() {
window.initBar();
}
}
]);
bar.js
var initBar = function() {
// code here
};
它在其他浏览器中运行良好。我已经尝试将块移动到头部以及页面下方。我还尝试将回调的内容包装在 $(document).ready() 中,但没有一个与代码 1 一起使用。
我得到的具体错误是:
SCRIPT5009:« initBar » est indéfini
这几乎就像是在资源加载完成之前执行了回调,但如果是这种情况,那么代码示例 2 为什么会起作用?
我还会注意到刷新页面时加载正常(很可能是由于资源被缓存的事实),但在清除缓存后它也可以正常加载。我必须在清除缓存后重新启动浏览器会话才能重现问题。
更新: 这个问题不仅限于功能。在加载的 JS 文件中定义的任何全局变量似乎都无法直接访问。如果我在页面顶部加载 CSS 而不是异步加载其他资源,也会发生这种情况。事实上,我也注意到一些以这种方式加载的 jQuery 插件存在这个问题。
更新 2:
这是根据下面的调试说明输出的console.log()。为了说明这一点,我将 bar 更改为对象而不是函数。
Internet Explorer:
HTML1300: Une navigation s’est produite.
Fichier : test18.php
before .load() called
before bar accessed
typeof bar = undefined
typeof window.bar = undefined
SCRIPT5009: « bar » est indéfini
Fichier : test18.js, ligne : 14, colonne : 13
before bar defined
看来complete 函数在bar 定义之前执行。我觉得奇怪的是 window.bar 也未定义但仍然有效......
火狐
[02:10:46,448] "before .load() called"
[02:10:47,184] "before bar defined"
[02:10:47,184] "before bar accessed"
[02:10:47,184] "typeof bar = object"
[02:10:47,184] "typeof window.bar = object"
铬
before .load() called
before bar defined
before bar accessed
typeof bar = object
typeof window.bar = object
Firefox 和 Chrome 似乎都以正确的顺序加载和执行资源。
【问题讨论】:
标签: javascript internet-explorer global-variables modernizr yepnope