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

时间:2009-02-27 03:36:56

标签: javascript

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

  1. How do you dynamically load a javascript file? (Think C’s #include)
  2. Use javascript to inject script references as needed?
  3.   

    您可以编写动态脚本标记   (使用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 the 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,就像上面的脚本一样,但是来自另一个域?

3 个答案:

答案 0 :(得分:6)

您可以使用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
    }
};

答案 1 :(得分:1)

现代浏览器中的安全模型阻止JavaScript发出跨域请求。这有漏洞(从互联网开始以来看到每个网站的利用),但使用它们不仅仅是一点点阴暗而且它们被修补只是时间问题。

答案 2 :(得分:0)

Rex所说的是正确的,尽管HTML5已经添加了跨域消息传递和xhr,这需要您做一些工作,但应该可以实现这一点。唉他们还没有出现在所有发布的浏览器中(我认为safari,firefox和IE的最新测试版支持其中一些功能,但我不确定哪些浏览器支持哪种apis)