为什么基金会全球有时未定义?

问题描述:

林开发HTML应用程序结构如下:为什么基金会全球有时未定义?

<html> 
<head> 
    <!-- other head elements --> 
    <script src="jquery.js?_v=3736f12"></script> 
    <script src="error.js?_v=291bb66"></script> 
</head> 

<body> 
    <!-- other body elements --> 
    <script src="foundation.js?_v=880a16f"></script> 
    <script src="my_lib.js?_v=1c3b21e"></script> 
</body> 
</html> 

什么error.js做的是,它侦听window.onerror事件被触发时,它通过AJAX发送错误信息到服务器给我们通知开发商。这种方式我们知道当用户对某事的javascript投诉。

my_lib.js是一个相当大的库,它执行大量任务,它通常建立在Foundation框架及其在JavaScript结构中的my_lib.js之前包含的JavaScript库中。

现在我可以让我的问题。这些天来,我们越来越相似的错误:

  • 类型错误:window.Foundation未定义
  • 类型错误:不确定是不是(评估“window.Foundation.Abide”)
  • 遗漏的类型错误的对象:不能读取未定义的属性“下拉”(代码Foundation.Dropdown)

这些错误通常来自基金会全球Foundation内my_lib.js的用途和各种userAgents,但更多的是移动设备,但不完全。错误的发生时间通常是在准备好事件之前,或者有时在就绪事件和加载事件之间。疯狂的事情是,这些错误并不总是来自同一用户(即使他们在同一页面上两次也是如此),他们有时会来,而我们无法重现单一的错误。

我很确定,我们从来没有将Foundation明确地定义为未定义的,如果我们是这样,那么在每个打火机中都将是一个负载问题。

这使我的问题,如果foundation.js正在评估my_lib.js之前始终评估。从我阅读帖子到所以我明白,标签是按顺序评估的,并且正在等待对方(我们从不使用异步或延期)。

只有另一条线索是,我能够从服务器日志,得到的是发生这些错误通常,当用户正在输入/闲置一段时间后重装我们的网站。例如,在或刷新后登录电子长期闲置后,同时还登录。

没有任何人有一个想法,为什么是这个hapenning?

非常感谢。

+0

我认为库加载 – madalinivascu

+0

之前更好地启动所有的插件,当所有的渲染完成 – madalinivascu

+0

我会建议你给属性'defer'到脚本元素插件被启动。它将在解析HTML的同时下载JS(这可以提高页面加载速度),并保证按照它们出现在文档中的顺序执行脚本。顺便说一句:为什么不把'script'放在文档的末尾,比如foundation或my_lib? – debute

听起来像是一个经典的比赛条件,在执行你的代码库可能会或可能不会被加载,如果不是你找回不确定。

为了避免这种情况,你执行这依赖于库中的任何代码之前确保例如这个事件是triggerd。

(document.readyState === 'complete') { 
    // good to go! 
} 
+0

所以你在说,当我有两个带有不同js文件的脚本标签时,不能保证当第二个脚本开始执行时第一个脚本已经准备好了吗? – Walkerr47

+0

严格地讲,这不应该发生脚本标签一个接一个地顺序加载,只要你不给他们任何异步标签或类似。依靠用户连接和其他因素,这仍然不是很可靠。你不知道你的图书馆发生了什么。这就是为什么等待document.readyState更节省的原因 –