0

我正在加载一个 Javascript 文件,其中包含我想调用的函数。这是不可能的,因为在“启动”加载和实际调用函数之间,JS 尚未加载。当然,我可以做类似的事情setTimeout('functionCall();',5000);,但我认为这不是一个非常有效的方法,而且对我来说似乎真的很不稳定。这就是为什么我想知道是否有更好的方法来做到这一点。

这是我正在使用的代码。有问题的函数被调用controllerStart。如果我在这里注释掉最后一行,并将其输入到 Javascript 终端(如在 Chrome 开发人员工具上),一切正常。

    function loadController(name){
        clearAll();
        scriptContainer.innerHTML = '';
        var scriptElement = document.createElement('script');
        scriptElement.setAttribute('src','controllers/' + name + '.js');
        scriptElement.setAttribute('type','text/javascript');
        scriptContainer.appendChild(scriptElement);
        controllerStart();// <-- Doesn't work from here, but works on a terminal
    }

谢谢参观!

4

3 回答 3

0

从它的声音来看,您正在异步加载 JavaScript。在较新的浏览器中,标签上有一个 onload 事件,该事件在完成加载时触发。但是,如果您需要跨浏览器支持,唯一的方法是:

(a) 如果它是从与您的页面相同的服务器加载的,请使用 AJAX 加载您的 javascript,然后在加载时使用 eval() 执行它(而不是使用<script>标签),

(b) 如果您控制该文件,请在其末尾添加一个事件触发器,然后在您的主 JavaScript 文件中进行监听。JQuery 的 bind() 和 trigger() 函数很方便。

(c) 如果它是从其他地方加载的并且您无法控制它(但有权重新分发它),请将其重新定位到您的服务器并遵循 (a)。

您也可以取消异步加载,只需将<script>标签流放在标题中,这是老式的方式。这保证了每个脚本在前一个脚本完成之前不会运行。

于 2012-04-24T22:32:59.980 回答
0

引用 Javascript 后调用该函数。

JS 加载是同步的。

所以.....

---- js库调用-----

----- 在这里调用函数 -----

利润!

编辑:具体来说:

function loadController(name){
        clearAll();
        scriptContainer.innerHTML = '';
        var scriptElement = document.createElement('script');
        scriptElement.setAttribute('src','controllers/' + name + '.js');
        scriptElement.setAttribute('type','text/javascript');
        scriptContainer.appendChild(scriptElement);
        scriptElement.onload = new function(){controllerStart();}; 
       //something like that.
    }

编辑 2:我的错 - 使用“onload”而不是“load” - 大脑上有太多 jquery

更多关于“onload”的信息:http ://www.onlinetools.org/articles/unobtrusivejavascript/chapter4.html

于 2012-04-24T22:11:35.387 回答
0

Nicholas C. Zackas 有一篇关于它的好帖子,您可以在此处阅读,其中仅包含您想要使用的代码。

基本上它只是一个函数,其中包含要加载的 JS 文件的 URL,以及加载时要执行的回调。然后它创建<script>标签,在加载后附加要执行的回调(通过 onreadystatechange 或 onload 事件)并将其插入到 DOM 中。

然后,您需要做的就是这样称呼它:

loadScript('controllers/' + name + '.js', controllerStart);
于 2012-04-24T22:19:54.000 回答