web-dev-qa-db-ja.com

FB.initはすでに呼び出されています

Facebook iframeアプリを作成しています。アプリケーションが1回読み込まれ(signed_requestを1回受け取る)、内部ドメインリンクを使用してiframe内のページをナビゲートします。これらの奇妙なメッセージがChromeとFirefox

FB.init has already been called - this could indicate a problem

このメソッドは一度だけ呼び出され、Facebookはアプリケーションのロードごとに(ページごとに一度ではなく)一度呼び出すように望んでいるようです。

window.fbAsyncInit = function() {
  FB.init({
    appId: param('facebook_app_id'),
    frictionlessRequests: true,
    oauth: true,
    channelUrl: site_url('/channel.html')
  })
}

ここでどのようなエラーが発生していますか?

52
potomok

js.srcのような#xfbml=1&appId=Xにパラメーターを渡すと、FB SDKは自動的に初期化されるため、FB.initは再初期化を試みます。したがって、コードでは、 FB.init関数を削除し、JS SDKを非同期にロードするコードでパラメーターを渡さないようにしてください。

これを置き換えます:

js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&appId=X";

で:

js.src = "//connect.facebook.net/en_US/sdk.js";

お役に立てれば。

156
Tinou

本当に複数回initを呼び出す必要がある場合、これを行うことができます:

FB._initialized = false;
FB.init();

しかし、それは私には意味がありません、私は少し異なる問題を抱えていますが、FB.init has already been called - this could indicate a problemメッセージ。

AJAXベースのWebサイトがあり、各ページの読み込み後に、AJAXリクエスト(ボタンなどのコメント)から取得したHTMLからXFBMLをレンダリングする必要があります。

 <div class="fb-comments" data-href="{REMOVED}" data-num-posts="5" data-width="760" colorscheme="dark"></div>

これを行うには、XFBMLをレンダリングする必要があるときにこれを実行できます。

FB.XFBML.parse();
10

私もこの問題を抱えています。私は単にFB.init({...})部分を削除し、次のコードで動作し始めました:

window.fbAsyncInit = function () {
    FB.Event.subscribe('auth.logout', function () {
        // subscribe parts
    });

    // here is where fb.init() code was
};
(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 = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=X";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

コードは自動的に初期化されるので、手動で行う必要はありません。今、私のコードは再び機能します。これがお役に立てば幸いです。

0
pwkc