看看facebook SDK,看起来像通过将脚本元素插入头部来异步注入。这意味着你所要做的就是创建回调处理程序,如果Facebook被封锁,那么永远不会被调用。你不应该得到任何浏览器脚本错误。所以,你应该能够做这样的事情:
<div id="fb-root"></div>
<script>
var FACEBOOK_BLOCKED = true;
window.fbAsyncInit = function() {
FACEBOOK_BLOCKED = false;
FB.init({
appId : 'YOUR_APP_ID', // App ID
channelURL : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
oauth : true, // enable OAuth 2.0
xfbml : true // parse XFBML
});
// Additional initialization code here
};
// Load the SDK Asynchronously
(function(d){
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
</script>
对于更广泛的使用案例,类似的做法将与您可以调用使用JSON-P的方法的任何脚本工作。这当然需要服务器需要一个回调函数作为参数(或自动调用预先命名的功能):
// Load some SDK Asynchronously
(function(d){
var js = d.createElement('script');
js.src = "http://www.example.com?callback=myfunc";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
var SCRIPT_LOADED = false;
var myfunc = function() {
SCRIPT_LOADED = true;
}
UPDATE
跨越this方法就来了,你可能想给它一个镜头:
function loadScript(sScriptSrc, oCallback) {
var oHead = document.getElementById('head')[0];
var oScript = document.createElement('script');
oScript.type = 'text/javascript';
oScript.src = sScriptSrc;
// most browsers
oScript.onload = oCallback;
// IE 6 & 7
oScript.onreadystatechange = function() {
if (this.readyState == 'complete') {
oCallback();
}
}
oHead.appendChild(oScript);
}
类似的问题:http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2032014#2032014 – Ktash
的两在@Kt问题中的其他答案ash提及也许对其他人有用:http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2027892#2027892使用window.onerror和http:// stackoverflow .com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/8066204#8066204使用onload。 – ToolmakerSteve