4

我试图异步加载all.js文件。异步加载Facebook Javascript SDK

在我的ASCX文件:

<div id="fb-root"></div> 

我有一个用户控件与包括JavaScript文件中:

window.fbAsyncInit = function() { 
    FB.init({ 
     appId: 'XXXXXXXXXXXXX', 
     status: true, 
     cookie: true, 
     xfbml: true, 
     oauth: true 
    }); 
}; 

(function() { 
    var e = document.createElement('script'); 
    e.type = 'text/javascript'; 
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    document.getElementById('fb-root').appendChild(e); 
}()); 

然而,当页面呈现和负载,FB不存在。

什么给?

回答

1

这意味着FB在被初始化之前被调用。由于它是初始化异步,所以在你第一次使用FB之前,我建议你在你的视图中编写代码FB.init而不是包含它。像这样使用 -

window.fbAsyncInit = function() { 
    FB.init({ 
    appId: 'XXXXXXXXXXXXX', 
    status: true, 
    cookie: true, 
    xfbml: true, 
    oauth: true 
    }); 
    // use FB here .. 
}; 
2

Sahil的回答是正确的。在呈现文档时,不能保证已经加载了任何异步脚本。

如果从fbAsyncInit回调中运行你的代码是不是你想要的,你可以考虑两种可供选择的方法是什么:

选项1

加载SDK synchronousy:

<script type="text/javascript" src="http://connect.facebook.net/en_US/all.js"></script> 

通过这样做,即使在文档开始呈现之前,FB也将存在。

选项2

检查的SDK已经被加载并在不提供备用解决方案。

if (window.FB) { 
    // use FB here .. 
} else { 
    // still loading, tell user to wait one more second 
}