1

現在、次のコードを使用して、アプリを使用しているユーザーの電子メール ID を取得しています

function get_id(cb){
    FB.init({
        appId  : .......,
        status : true, // check login status
        cookie : true, // enable cookies to allow the server to access the session
        xfbml  : true // parse XFBML
    });

    FB.login(function(response) {
        if (response.authResponse) {
            var token = response.authResponse.accessToken;
            alert(token);
            accessToken = token;
            FB.api('/me?access_token=' + token + '', function (response) {

                cb(response.email);

            });

        }

     },{scope: 'email'});

    (function(d){
         var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
         if (d.getElementById(id)) {return;}
         js = d.createElement('script'); js.id = id; js.async = true;
         js.src = "//connect.facebook.net/en_US/all.js";
         ref.parentNode.insertBefore(js, ref);
    }(document));


}; // ending of get_id()

get_id(function (email) {
    userID=email;
    alert(email);
});

現在のコードは別の JavaScript ファイルにあり、この関数はボタンが押されたときに呼び出され<script src="http://connect.facebook.net/en_US/all.js"></script>ます。HTML ファイルにも含まれています。私のブラウザ(Google Chrome)は、アクセスしようとするたびに次のエラーを表示します「Uncaught ReferenceError: FB is not defined」

私はFacebookアプリの開発に比較的慣れていないので、私が持っている参照はすべてfacebookの開発者ページです。小さなエラーだと確信していますが、頭を包み込むことはできません。うまくいかない

4

2 に答える 2

3

コードが正しく読み込まれません。この部分:

(function(d){
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/en_US/all.js";
     ref.parentNode.insertBefore(js, ref);
}(document));

関数内に配置しないでください。スクリプト タグ内の body の開始部分の後に配置してください。別ファイルにすることはできません。これは、Facebook の JS SDK である all.js の非同期ロードのみを行います。async-load を使用している場合<script src="http://connect.facebook.net/en_US/all.js"></script>は、sync-load が実行されるため、ドキュメントに配置しないでください。

コードのこの他の部分:

FB.init({
    appId  : .......,
    status : true, // check login status
    cookie : true, // enable cookies to allow the server to access the session
    xfbml  : true // parse XFBML
});

また、関数内にあってはなりません。このフラグメントは、アプリ情報を使用してページで FB JS SDK を開始する役割を果たします。ページごとに 1 回だけ呼び出す必要があります。そうしないと、エンジンを複数回開始することになり、混乱した動作になります。「FB」オブジェクトは、FB JS SDK がロードされた後にのみ作成されます。非同期ロードのため、いつ発生するかわかりません。したがって、FB.init をこのウィンドウ イベントに割り当てる必要があります。

window.fbAsyncInit = function() {
    FB.init({
        appId  : .......,
        status : true, // check login status
        cookie : true, // enable cookies to allow the server to access the session
        xfbml  : true // parse XFBML
    });
};

Facebook 情報を使用する get_id 関数を作成します。あなたはそれに注意する必要があります。この関数が FB JS SDK の完全なロード後に呼び出されることが確実であれば、ページの任意の部分に作成できます。しかし、最も安全な方法は、window.fbAsyncInit 内に作成することだと思います。トークンについて心配する必要はありません。SDK が自動的に行います。

window.fbAsyncInit = function() {
    FB.init({
        appId  : .......,
        status : true, // check login status
        cookie : true, // enable cookies to allow the server to access the session
        xfbml  : true // parse XFBML
    });

    function get_id(cb){
        FB.login(function(response) {
            if (response.authResponse) {
                FB.api('/me', function (response) {
                    cb(response.email);
                });
            }
        },{scope: 'email'});
    }

};

ただし、これを行うと、関数が既に作成されているかどうかがわかりません。したがって、呼び出すときは、その存在をテストする必要があります。

if(get_id && typeof get_id == 'function') { 
    // It's safe to call your function, go ahead
    get_id(function (email) {
        userID=email;
        alert(email);
    });
} else {
    // Your function does not exists yet, do other stuff
}

幸運を!

于 2012-08-02T15:33:17.143 に答える
1

あなたが置く必要があります:

(function(d){
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement('script'); js.id = id; js.async = true;
     js.src = "//connect.facebook.net/en_US/all.js";
     ref.parentNode.insertBefore(js, ref);
}(document));

機能外get_id。ボタンを押す前に呼び出されました

PS: 手動で渡す必要はありません?access_token=- FB JS SDK がそれを行います

于 2012-08-01T22:40:57.190 に答える