我经常需要通过ajax加载其他javascript文件,因此一开始我使用jQuery提供的标准功能来加载脚本:
$.getScript('script_name.js',callback_function());
但这并没有解决,因为$ .getScript是异步的($ .ajax的jQuery API默认将’async’设置为true;在$ .getScript的API注释中讨论了主题:http:/ /api.jquery.com/jQuery.getScript/)。因此,我编写了此功能,该功能由某人在上面链接的API页面的注释中提供:
load:function(script,callback){ jQuery.ajax({ async:false, type:'GET', url:script, data:null, success:callback, dataType:'script' }); },
这似乎工作良好,所以我继续,但是最近我注意到,这仅适用于同一目录中的脚本,例如。调用myObj.load(’test.js’)效果很好,但调用myObj.load(’test / test.js’)则根本不起作用。
感觉好像我遗漏了一些明显的东西,但是我没有设法找到问题所在。任何想法?
更新:请参阅下面的评论流,与jQuery无关,这是服务器上的文件权限问题。
原始答案 :
您是否从浏览器中得到任何错误?例如,在Chrome或Safari中,如果打开开发工具并查看“控制台”选项卡,是否显示错误?或者在Firefox中,安装Firebug并检入Firebug的控制台。或者在IE中,使用VS.Net的免费版本…某些事情应该向您抱怨。
您还可以通过提供error函数而不是假设成功来从代码本身获取更多信息:
error
jQuery.ajax({ async:false, type:'GET', url:script, data:null, success:callback, dataType:'script', error: function(xhr, textStatus, errorThrown) { // Look at the `textStatus` and/or `errorThrown` properties. } });
更新 :您说过您看到textStatus=’错误’和errorThrown=未定义。很奇怪。是否 相同的 脚本工作,如果你移动它,所以它不是一个子路径?我想知道子路径是否是红色鲱鱼,而真正的问题是脚本中的语法错误。
textStatus
errorThrown
离题 : 真的 需要同步吗?您不能只轮询显示一个符号吗?只是同步ajax请求 确实 浪费了用户体验。在许多浏览器中,不仅您自己的页面而且 所有 页面在请求期间 都被 锁定。
这就是轮询的意思:假设我想从JavaScript异步加载jQuery:
function loadScript(url, symbol, callback) { var script, expire; // Already there? if (window[symbol]) { setTimeout(function() { callback('already loaded'); }, 0); } // Determine when to give up expire = new Date().getTime() + 20000; // 20 seconds // Load the script script = document.createElement('script'); script.type = 'text/javascript'; script.src = url; document.body.appendChild(script); // Start looking for the symbol to appear, yielding as // briefly as the browser will let us. setTimeout(lookForSymbol, 0); // Our symbol-checking function function lookForSymbol() { if (window[symbol]) { // There's the symbol, we're done callback('success'); } else if (new Date().getTime() > expire) { // Timed out, tell the callback callback('timeout'); } else { // Schedule the next check setTimeout(lookForSymbol, 100); } } }
用法:
// Load jQuery: loadScript("path/to/jquery.min.js", "jQuery", function(result) { // Look at 'result' });