我正在使用来自facebook的Javascript连接器,我按照他们的说明实现了一切,一切顺利,直到facebook被公司政策阻止。然后你这样做会失败:
ref.parentNode.insertBefore(js, ref);
我在它周围添加了try / catch但它仍然失败。
我也试过添加<script id=...
没有好处。
我尝试过不同的方式,我可以看到问题,我写了这个函数:
jQuery.cachedFacebookScript = function(url, options) {
// Allow user to set any option except for dataType, cache, and url
// Use $.ajax() since it is more flexible than $.getScript
// Return the jqXHR object so we can chain callbacks
return jQuery.ajax({
dataType : "script",
//cache : true,
url : url,
error : function(XMLHttpRequest, textStatus, exception) {
logger("Ajax failure: " + exception);
}});
};
然后添加
$.cachedFacebookScript('//connect.facebook.net/en_UK/all.js')
.done(function() {console.log("Done");})
.error(function() {console.log("Error");})
;
没有调用任何回调,所以我无法捕获错误。
如果删除dataType : "script",
行,则会调用两个错误回调。
所以它对我来说闻起来像JQuery的bug,所以单向循环可能是eval()我在成功回调中得到的javascript ...但是我没有达到上述目标,当我有权访问Facebook我收到此错误:
XMLHttpRequest cannot load http://connect.facebook.net/en_UK/all.js. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9080' is therefore not allowed access.
这里的其他问题似乎是服务器的事情......那么$ .getScript()如何获取javascript? doco说它是一个围绕$ .ajax的包装器,所以我写了一个新的包装器:
jQuery.myGetScript = function(url, success, error) {
$.ajax({
url: url,
success: function(response) {
eval(response);
success();
},
error: function (response) {
error();
}
});
}
我得到了相同的Origin错误。
JQuery文档说,从JQuery 1.5开始,你可以添加一个fail()......不,你不能这样做不行:
jQuery.myGetScript = function(url, success, error) {
logger("Calling getScript()");
ret = $.getScript(url)
.done(function( script, textStatus ) {
console.log("Successfully loaded script");
success();
})
.fail(function( jqxhr, settings, exception ) {
console.log("Failed to load script");
error();
});
};
有没有办法让这个优雅地失败,或者至少抛出一些我可以陷阱和处理/忽略的东西?