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

Ale*_*lex 13 javascript ajax jquery

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

$.getScript('script_name.js',callback_function());
Run Code Online (Sandbox Code Playgroud)

但这没有用,因为$ .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'

    });

},
Run Code Online (Sandbox Code Playgroud)

这似乎运作良好,所以我继续,但我最近注意到,这只适用于同一目录中的脚本,例如.调用myObj.load('test.js')效果很好,但调用myObj.load('test/test.js')根本不起作用.

感觉我错过了一些明显的东西,但我没有设法找到问题.任何的想法?

Ben*_*uer 17

您可以使用ajaxSetup将ajax调用设置为默认同步.这是它的样子:

$.ajaxSetup({async:false});
$.getScript('script_name.js', callback_function);
Run Code Online (Sandbox Code Playgroud)

如果您需要再次进行异步调用,只需启用它:

$.ajaxSetup({async:true});
Run Code Online (Sandbox Code Playgroud)

  • 将ajax模式设置为sync对我来说很有用,但很重要:如果你传递一个回调函数`callback_function()`,请忽略括号.否则,在*`getScript()`之前传递函数的返回值并执行`callback_function` ins* (6认同)
  • 建议不要使用`$ .ajaxSetup` - 请参阅https://api.jquery.com/jquery.ajaxsetup/.更改ajax调用'async`属性默认值并不是一个好主意.`$ .Getscript`是`$ .ajax`的简写,所以你可以这样做:`$ .ajax({url:url,dataType:"script",async:true})` - 适合我. (3认同)

T.J*_*der 13

更新:请参阅下面的评论流,它与jQuery无关,它是服务器上的文件权限问题.


原始答案:

你从浏览器中得到任何错误吗?例如,在Chrome或Safari中,如果您打开开发工具并查看控制台选项卡,它是否显示错误?或者在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.
    }
});
Run Code Online (Sandbox Code Playgroud)

更新:你说你看到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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

// Load jQuery:
loadScript("path/to/jquery.min.js", "jQuery", function(result) {
    // Look at 'result'
});
Run Code Online (Sandbox Code Playgroud)