Javascript 如何通过ajax调用从另一个目录同步加载脚本?

Javascript 如何通过ajax调用从另一个目录同步加载脚本?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我经常需要通过ajax加载其他javascript文件,所以一开始我使用了jQuery提供的标准函数来加载脚本: $.getScript('script_name.js',callback_function()); 但这并没有奏效,因为$.getScript是异步的(用于$.ajax的jQuery API表示默认情况下“async”设置为true;主题在用于$.getScript:的API的注释中讨论)。因此,我编写了这个函数,正如上面链接的API页面的评论中有人提供的: load:funct

我经常需要通过ajax加载其他javascript文件,所以一开始我使用了jQuery提供的标准函数来加载脚本:

$.getScript('script_name.js',callback_function());
但这并没有奏效,因为$.getScript是异步的(用于$.ajax的jQuery API表示默认情况下“async”设置为true;主题在用于$.getScript:的API的注释中讨论)。因此,我编写了这个函数,正如上面链接的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中,如果打开开发工具并查看Console选项卡,是否会显示错误?或者在Firefox中,安装Firebug并检查Firebug的控制台。或者在IE中,使用免费版本的VS.Net。。。有些事情应该向你抱怨

您还可以通过提供
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
='error'和
errorshown
=未定义。很奇怪。如果移动脚本使其不在子路径上,相同的脚本是否有效?我想知道这个子路径是否是一个转移视线的问题,而真正的问题是脚本中的语法错误


主题外:它真的必须是同步的吗?你不能只是投票让一个符号出现?只是同步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'
});

默认情况下,可以使用将ajax调用设置为同步。这就是它的样子:

$.ajaxSetup({async:false});
$.getScript('script_name.js', callback_function);
如果再次需要异步调用,只需通过以下方式启用:

$.ajaxSetup({async:true});

错误函数没有帮助-textStatus设置为“error”,errorThrown未定义。@Alex:确实很奇怪。顺便说一句,我添加了一个巨大的离题评论。:-)如果您移动脚本使其不在子路径上,那么您的实际问题是相同的脚本是否有效?我想知道这个子路径是否是一个转移视线的问题,而真正的问题是脚本中的语法错误!我在Ubuntu上安装的本地服务器上,我不知道如何解决这个问题?关于离题问题:好的,我想在加载脚本后,使用$.getScript(script_url,function_from_the_loaded_script())从加载的脚本执行函数;没用。@Alex:403听起来像是服务器安装问题;如果在浏览器窗口中键入脚本的完整路径,是否可以看到脚本?不应该有任何路径方面或类似的东西。我刚试过,效果很好。@Alex:啊,好吧,那就是问题所在。您需要查看web服务器运行时的用户身份,并确保该用户对子目录项及其内的文件具有读取权限。将ajax模式设置为“同步”对我很有效,但很重要:如果传递回调函数
callback\u function()
,请省去括号。否则,将传递函数的返回值,并在使用
$执行
getScript()
之前执行
callback\u函数
。不建议使用ajaxSetup
-请参阅。更改ajax调用的“
async
属性default”不是一个好主意
$.Getscript
$.ajax
的缩写,所以您可以执行:
$.ajax({url:url,dataType:“script”,async:true})
-适合我。