使用Prototype从另一个域加载JavaScript文件

时间:2010-01-22 14:05:10

标签: javascript jquery cross-domain prototypejs same-origin-policy

使用Prototype,任何人都知道如何使用来自其他域的Ajax.Request加载javascript文件?或者如果可能的话?

我相信这可以通过jquery,digg来加载Facebook API:

jQuery.ajax({type:"GET",
url:"http://static.ak.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php",
cache:true, dataType:"script"});

来源:http://cotnet.diggstatic.com/js/loader/370/digg_facebook

在不查看代码的情况下,我猜jquery在url违反相同的原始策略且dataType是脚本时有智能使用代理。

2 个答案:

答案 0 :(得分:0)

检查this ..似乎有一个特定的插件可以启用Prototype库中的功能,作者提到例如jQuery已经支持了很长时间了,但它似乎默认不支持Prototype。

答案 1 :(得分:0)

对托马斯的答案来说,我创建了一个FacebookApiLoader类来做到这一点。这是源代码,目前仅在Firefox 3中测试过。希望这有助于某人。这样做是为了看看页面上是否有任何facebook api依赖元素,如果有,那么它将通过在正文结束标记之前插入来加载facebook api脚本。这依赖于PrototypeJS库。在可能需要facebook api的页面中调用facebookApiLoader.observe()。

var FacebookApiLoader = Class.create({
  initialize: function() {
    this.observer = null
    this.observedElement = null
  },
  apiDependentsVisible: function() {
    if (null == this.observedElement) {
      // $('facebook-login') is a div in my site that
      // is display:none initially.  Once it is made
      // visible then the facebook api is needed.
      // Replace 'facebook-login' with id relevant for your site
      this.observedElement = $('facebook-login')
    }
    return this.observedElement.visible()
  },
  apiLoadCompleted: function() {
    try {
      return !Object.isUndefined(FB) && !Object.isUndefined(FB_RequireFeatures)
    } catch (e) {
    }
    return false
  },
  initAndRequireFeatures: function() {
    FB_RequireFeatures(["XFBML"],
      function() {
        FB.init('secret-put-your-app-value-here','/xd_receiver.html', {})
      }
    );
  },
  initFacebookConnect: function() {
    new PeriodicalExecuter(function(pe) {
      if (this.apiLoadCompleted()) {
        this.initAndRequireFeatures()
        pe.stop()
      }
    }.bind(this), 0.2);
  },
  loadApi: function() {
    // Use body for facebook script as recommended in Facebook
    // docs not to insert in head as some browsers have 
    // trouble with it
    body = $$('body')[0]
    // TODO use https protocol if page is secure
    script = new Element('script', { 'type': 'text/javascript',
      'src': 'http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php' })
    body.appendChild(script)
    this.initFacebookConnect()
  },
  loadApiIfRequired: function() {
    if (this.apiDependentsVisible()) {
      this.observer.stop()
      this.loadApi()
    }
  },
  observe: function() {
    if (null == this.observer) {
      this.observer = new PeriodicalExecuter(this.loadApiIfRequired.bind(this), 0.2)
    }
  }
});
// The FacebookApiLoader attributes are lazily loaded
// so creating a new facebookApiLoader
// is as low resource usage as possible
var facebookApiLoader = new FacebookApiLoader();

然后在任何可能需要Facebook api的页面上,请致电

facebookApiLoader.observe();