2011-05-18 93 views
1

我遇到类似问题this guy,除了我的问题与脚本有关而不是图像。

我使用$.getScript()$(window).load()的组合来动态加载JavaScript,并使用脚本加载完成后正在加载的函数。

它在Chrome中运行良好,但Safari似乎总是过早地触发onload事件。我想知道是否有某种方法可以强制Safari等待所有脚本的加载类似于document.body.offsetWidth块。根据我的理解(以及我在测试时看到的结果),document.body.offsetWidth会阻塞,直到样式和图像加载,但显然不是脚本。

编辑:它可能值得一提,它确实有时在Safari中工作,但我没有看到一个模式。有时事件在脚本完全加载并执行之前触发,并且处理程序通过$(window).load()失败,因为函数缺失。

+0

为什么你不能在'.getScript()'中使用'success'处理程序?一旦脚本完成加载,这将运行。 – 2011-05-18 18:12:11

+0

我想这里真正的问题是为什么你动态加载所需的脚本。 – 2011-05-18 18:13:08

+0

@Kevin Peno:我需要其余的脚本来加载,而不仅仅是一个脚本。有几个脚本正在加载。根据它们的功能,它们全部被分成自己的脚本。 – alexcoco 2011-05-18 18:16:53

回答

1

根据您所提出的意见,特别是那些依赖周围,我会用一个库像RequireJS。这将为您提供您需要导入脚本及其依赖项的方法,并且还可以在满足依赖关系时调用函数和代码。

+0

谢谢,我也在某个时间看着Namespace.js。我也会看看这个,并与同事一起评估。我会尽快回复你。 – alexcoco 2011-05-18 20:57:20

+0

这很可能会起作用,但我认为我无法在工作中获得批准。我仍然将其标记为正确,因为这是迄今为止我遇到的最好的解决方案。我还应该提及[LABjs](http://labjs.com/),因为它看起来像另一个体面的解决方案。谢谢你的帮助。 – alexcoco 2011-05-24 11:49:34

0

您是否尝试过准备好旧文档?

$(document).ready(function() { 
    //code here 
}) 

我从来没有使用过任何问题。在最坏的情况下,您可以在包含您所需的代码的所有其他脚本标记之后放置脚本标记。

+0

这不会帮助,我不认为,因为问题在于“就绪”机制不知道要等待动态加载的脚本。 – Pointy 2011-05-18 18:09:52

+0

这是行不通的,因为'$(document).ready()'把一个处理程序绑定到DOM准备完成之后但在脚本/图像/ css准备好之前触发的DOMContentLoaded事件。就像我所说的,我的代码每次都在Chrome中运行。 – alexcoco 2011-05-18 18:12:48

0

在这个例子中,我告诉加载的脚本,我需要做一些事情来报告加载到一个函数。一旦我需要的所有东西都加载完毕,我就可以运行任何我需要的代码。

// Simplified callback to check for all scrips loaded. 
var numDynScriptsReady = 0, 
    numDynScriptsNeeded = 4; 

function dynScriptsReady() 
{ 
    numDynScriptsReady++; 

    if(numDynScriptsLoaded == numDynScriptsNeeded) 
    { 
     // Run functions you need after loaded.... 
    } 
} 

// Example script get 
$.getScript("http://example.com/script.js", dynScriptsReady); 
// etc.... 
+0

这很有趣,但这意味着我每次编写处理程序/添加另一个导入时都必须计算脚本的数量。主要问题是我将有一个脚本来执行非常具体的操作,而脚本将依次在其内部导入自己的依赖关系。所以在导入的脚本中有导入,并且在需要对它们进行计数时使事情复杂化。 – alexcoco 2011-05-18 18:36:38

+0

@alexcoco,那么请扩展它。您可以使用'.data'来存储特定'脚本'的依赖项数量,类似于全局'var'。您可以在新添加的脚本元素上使用该函数作为'$ .bind',然后使用$ .trigger作为该特定'$ .getScript'的'success'回调。作为一名实习生,我希望你能搞清楚它是否有趣! – 2011-05-18 18:42:27

+0

存储值并不是问题所在。问题是知道需要导入多少个脚本。如果我必须每次都要计算它们,那么我不妨将所有内容存储在一个大文件中。 – alexcoco 2011-05-18 18:54:28

相关问题