当前位置: 首页 > 面试题库 >

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

邹海超
2023-03-14
问题内容

我经常需要通过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函数而不是假设成功来从代码本身获取更多信息:

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=未定义。很奇怪。是否 相同的
脚本工作,如果你移动它,所以它不是一个子路径?我想知道子路径是否是红色鲱鱼,而真正的问题是脚本中的语法错误。

离题真的 需要同步吗?您不能只轮询显示一个符号吗?只是同步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'
});


 类似资料:
  • 问题内容: 我有一个div标签,该标签通过ajax调用填充了脚本,但是脚本未执行。 有没有办法使脚本执行? 问题答案: 如果您使用jQuery的方法,它将解析出脚本标签并对其进行评估: 如果没有jQuery,则可以使用(1)正则表达式或(2)解析DOM树并查找脚本标签来自己编写。(#2是jQuery的执行方式)

  • 问题内容: 表: 有了答案,我在这里得到了利用$ compile的这种方式 现在,当单击按钮时,我什至调用一个模态,并命令对象使用ng-model 感谢您的帮助,它运作良好。 问题答案: 编辑 :添加了用于演示 $ compile 用法的代码段 在html中,只有一个用于初始化应用程序的标签和一个用于初始化控制器的div。 在controller中,两个链接被创建为简单字符串,但分别具有两个,然后

  • 问题内容: 我正在尝试通过ajax和php调用一些数据库数据。但是ajax调用不起作用,我无法在网络上找到解决方案。 所以这是我的代码: test.php 如果我在浏览器中键入该网址: 通过jsonEncode返回的数据是正确的,但是当我使用jquery将其加载到html页面时,他无法读取数据。 test.html 提前致谢。 问题答案: 您的 变量 没有价值。您想使用 字符串 。也许您也希望能够

  • 问题内容: 如果一个同步方法调用另一个同步方法,那么线程安全吗? 问题答案: 是的,将方法标记为时,您实际上是在这样做: 当线程调用从method1进入method2时,它将确保它持有对的锁定,该锁定已经存在,然后可以通过。 当线程直接进入method1或method2时,它将阻塞直到获得锁(),然后进入。 正如詹姆斯·布莱克(James Black)在评论中指出的那样,您必须了解方法主体内部的操

  • 问题内容: 我有一个示例Java项目包 打包com.example.testing; 用这样的文件树 和gradle脚本: 现在我想向该项目中添加一些模块,我的文件夹将是这样的 如何在gradle脚本中添加新的源代码? 问题答案: 我同意@JB Nizet关于遵守标准约定的意见。如果您仍然坚持要成为无政府主义者: 您已经在源集中声明了,为什么不还要添加并且呢?您可以将它们添加到相同的源集,也可以根

  • 我有一个java项目包示例 程序包com。实例测试; 使用这样的文件树 和一个gradle脚本: 现在,我想添加一些模块到这个项目和我的文件夹将是这样的东西 如何向gradle脚本添加新的源代码?