你如何动态加载来自不同域的JavaScript文件?

我发现这个优秀的代码,由aemkei发布为这个问题的答案:

  • 你如何动态加载一个JavaScript文件? (想想C的#include)
  • 使用JavaScript来根据需要注入脚本引用?
  • 您可以编写动态脚本标记(使用Prototype):

    new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"});
    

    这里的问题是,我们不知道外部脚本文件何时被完全加载。

    我们经常希望我们的代码在下一行,并且喜欢写下如下内容:

    if (iNeedSomeMore){
      Script.load("myBigCodeLibrary.js");  // includes code for myFancyMethod();
      myFancyMethod();                     // cool, no need for callbacks!
    }
    

    有一种聪明的方式可以在不需要回调的情况下注入脚本依赖关系。 您只需通过同步AJAX请求来提取脚本并在全局级别上评估脚本。

    如果您使用Prototype,则Script.load方法如下所示:

    var Script = {
      _loadedScripts: [],
      include: function(script){
        // include script only once
        if (this._loadedScripts.include(script)){
          return false;
        }
        // request file synchronous
        var code = new Ajax.Request(script, {
          asynchronous: false, method: "GET",
          evalJS: false, evalJSON: false
        }).transport.responseText;
        // eval code on global level
        if (Prototype.Browser.IE) {
          window.execScript(code);
        } else if (Prototype.Browser.WebKit){
          $$("head").first().insert(Object.extend(
            new Element("script", {type: "text/javascript"}), {text: code}
          ));
        } else {
          window.eval(code);
        }
        // remember included script
        this._loadedScripts.push(script);
      }
    };
    

    我发现,如果所有代码都在'file://'协议中执行,那么这些代码在IE上不起作用,但是,由于它的用例涉及真正的Web应用程序,因此它不是问题。

    我试过一次,包括谷歌http://www.google-analytics.com/urchin.js ,但从一个网页,但它看起来不能从不同的域请求JavaScript文件。

    我们如何动态地添加JavaScript,就像上面的脚本一样,但是来自另一个域?


    现代浏览器中的安全模型可防止JavaScript发出跨域请求。 这有漏洞(参见互联网开始以来的每个网站漏洞利用),但使用它们不仅仅是一点阴影,它们只是一个时间问题,它们需要打补丁。


    您可以使用onloadonreadystatechange事件来了解何时加载了<script>标记。

    var script = new Element("script", {src: "myBigCodeLibrary.js", type: "text/javascript"});
    
    script.onload = script.onreadystatechange = function(){
        if (!this.readyState ||
            this.readyState == "loaded" || this.readyState == "complete") {
            //script is loaded
        }
    };
    

    雷克斯说的是正确的,尽管HTML5增加了跨域消息传递和xhr,这就需要你做一些工作,但应该可以实现这一点。 唉,它们还没有出现在所有发布的浏览器中(我认为safari,firefox和IE的最新测试版支持这些功能中的一部分,但我不确定哪些浏览器支持哪个apis)

    链接地址: http://www.djcxy.com/p/42465.html

    上一篇: How do you dynamically load a javascript file from different domain?

    下一篇: Load jQuery with Javascript and use jQuery