使用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是脚本时有智能使用代理。
答案 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();