等待动态加载的 Javascript 文件完成加载的有效方法是什么?
What is an efficient way of waiting for a dynamically loaded Javascript file to finish loading?
我正在加载一个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
}
感谢您的观看!
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:我的错 - 使用"加载"而不是"加载" - 大脑上的jQuery太多
有关"加载"的更多信息,请点击此处:http://www.onlinetools.org/articles/unobtrusivejavascript/chapter4.html
Nicholas C. Zackas 有一篇关于它的好文章,你可以在这里阅读,它只包括你要使用的代码。
基本上,它只是一个函数,既包含要加载的JS文件的URL,也包含加载时要执行的回调。然后,它创建 <script>
标记,附加回调以在加载后执行(通过 onreadystatechange 或 onload 事件),并将其插入到 DOM 中。
然后,您需要做的就是这样称呼它:
loadScript('controllers/' + name + '.js', controllerStart);
从它的声音来看,你正在异步加载你的JavaScript。在较新的浏览器中,代码上有一个 onload 事件,该事件在完成加载时触发。但是,如果您需要跨浏览器支持,唯一的方法是:
(a)如果它从与页面相同的服务器加载,请使用AJAX加载javascript,然后在加载时使用eval()执行它(而不是使用<script>
标签),
(b) 如果您控制文件,请在其末尾添加一个事件触发器,然后在主 JavaScript 文件中侦听该触发器。JQuery 的 bind() 和 trigger() 函数对此非常方便。
(c) 如果它是从其他地方加载的,而你不控制它(但确实有权重新分发它),请将其重新定位到你的服务器并遵循 (a)。
您也可以取消异步加载,只需在标头中放置一串<script>
标签,这是老式的方式。这保证了在上一个脚本完成之前不会运行每个脚本。
- 数组在手动写入时有效,但从文本文件加载时无效
- I'我在页面加载时将整个$_SESSION变量放入一个json对象中.虽然这对我有效,但这是一个好的做法吗
- Fine Uploader-未收到来自已加载iframe的有效消息
- 在层中加载多个图像,哪种方法更有效(资源方面)?-加载并编译PHP或将其堆叠
- jQuery加载在Dreamweaver上有效,但在浏览器中无效
- 我如何在Capybara中测试页面是否未重新加载(JavaScript onClick拦截有效)
- jQuery 帖子在加载时有效,但在点击时不起作用
- Javascript窗口/图像加载时间 - 这应该不起作用,但它确实有效
- 正确有效地实现后台加载
- 这是在网页中存储和使用从数据库加载的数据的最有效方法
- jQuery Click - 在页面 1st 加载时不起作用,但如果页面重新加载则有效
- 加载20MB +网页的最有效方法
- 是否应将此文件加载为有效的.js文件
- 砌体在移动浏览器(chrome)上不起作用,并且仅在Chrome桌面版本上有效,如果我重新加载(ctrl + f5)页面
- JQuery Mobile - 关闭对话框后加载错误的页面,并且Javascript并不总是有效
- 如何有效地加载1000 +谷歌地球标记
- Ajax 脚本仅在收到的 XML 足够大/需要足够长的时间来加载时才有效
- 有效的 Adobe Scene7 URL 生成“加载播放器时出错:找不到可播放的源”
- Facebook共享对话框打开空白弹出窗口 - 但在重新加载时有效
- 为什么第一次加载失败,但后续加载有效