もう何年も前の質問に答えてもしょうがないかもしれないですが、今でも悩んでいるプログラマーはいるので、検索で引っかかってくれたらうれしいです。
私も本当に参りました。
でも、およその原因がわかり、対策も講じることができたのでお伝えします。
何のきっかけでこんなことになるかというとFacebookAPIを利用したアプリケーションづくりです。APIをJavascriptから利用するというのが、Facebook Deveropperのページでも紹介されており、手軽に利用できるのでお勧めなのですが、ここで披露されているコードに問題ありです。
問題のコードは、
window.fbAsyncInit = function() {
FB.init({
appId : '{your-app-id}',
cookie : true,
xfbml : true,
version : '{api-version}'
});
FB.AppEvents.logPageView();
};
(function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
となっています。
このなかでwindow.fbAsyncInit = function()という関数を理解していないとハマります。そう、非同期処理なのです。この中のFB.initの処理が終わる前に、FB.apiなどのコマンドを使うとinit not called with valid versionというようなエラーがでるのです。FBの初期化が終わっていないよというエラーが出ればいいのですが、APIのバージョンが違うというようなエラーが出るのでややこしいのです。
しかも、私の場合は$(windows).loadの中にFB.apiを書いたので、エラーが出たり出なかったり、ブラウザによって挙動が違うというドツボにはまりました。
対策はまあ簡単といえば簡単で、
window.fbAsyncInit = function() {
FB.init({
appId : plugin_path.fb_app,
cookie : true,
xfbml : true,
version : 'v14.0'
});
<ここにFB.apiなどの処理を書く>
}
要するにコールバック関数の中に処理を書いてやればいいということでした。FB.initは一度ページ内で実行すれば、そのページ内では有効なので、そのあとは気にしなくても大丈夫のようです。
でも、本当に疲れました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。