2011-07-22 60 views
1
var display_welcome = function(){ 
    var fb_login_button = jQuery('#fb_login_button'); 
    var fb_welcome = jQuery('#fb_welcome'); 
    var name = ''; 

    FB.api('/me',function(response){ 
     console.log(response); 
     name = response.first_name; 
    }); 

    fb_login_button.css('display', 'none'); 
    fb_welcome.html('<span>Welcome, ' + name + '</span>'); 
    fb_welcome.css('display', 'block'); 
}; 

當用戶從網站登錄到Facebook時調用此函數。目標是用用戶的名字向用戶顯示歡迎消息。問題是變量'name'是FB.api()的回調方法範圍內的局部變量。提取這個值並在函數'display_welcome'中使用它的最好方法是什麼?從javascript回調函數中檢索值

回答

1

如何將這些代碼行移入API的回調?像這樣:

var display_welcome = function(){ var fb_login_button = jQuery('#fb_login_button'); var fb_welcome = jQuery('#fb_welcome'); var name ='';

FB.api('/me',function(response){ 
    console.log(response); 
    name = response.first_name; 

    fb_login_button.hide(); 
    fb_welcome.html('<span>Welcome, ' + name + '</span>'); 
    fb_welcome.show(); 
}); 

};

0

我會怎麼做:

jQuery(document).ready(function($){ 

    FB.api('/me',function(response){ 
     var fb_login_button = $('#fb_login_button'), 
      fb_welcome = $('#fb_welcome'); 

     fb_login_button.css('display', 'none'); 
     fb_welcome.html('<span>Welcome, ' + response.first_name + '</span>') 
        .css('display', 'block'); 

    }); 
}); 
0

把你的代碼的其餘部分中的回調函數。

+1

3個答案在15秒內都說同樣的事情。可能這就是要走的路! :-) – gilly3

0

我認爲最好是通過訂閱FB.init()後的事件來獲取用戶信息。事情是這樣的:

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

    FB.Event.subscribe('auth.login', function(response) { 
     // do something with response 
     display_welcome(); 
    }); 

    FB.getLoginStatus(function(response) { 
     if (response.session) { 
      // logged in and connected user, someone you know 
      display_welcome(); 
     } 
    }); 
    }; 


var display_welcome = function(){ 

    FB.api('/me',function(response){ 
     var fb_login_button = jQuery('#fb_login_button'); 
     var fb_welcome = jQuery('#fb_welcome'); 
     var name = response.first_name; 

     fb_login_button.css('display', 'none'); 
     fb_welcome.html('<span>Welcome, ' + name + '</span>'); 
     fb_welcome.css('display', 'block'); 
    }); 

}; 
0

的問題是,當你調用FB.api(...)功能是異步,也就是說,你的代碼也不會停止,並等待結果,它不會等待回調你提供被調用。相反,接下來顯示歡迎信息的三行代碼將在之前執行回調發生,這意味着name變量在您嘗試使用它時仍然是空白的。解決的辦法是按照其他的答案,即移動歡迎訊息代碼到回調函數,這樣,直到它已經被設置你不嘗試使用name

var display_welcome = function(){ 
    var fb_login_button = jQuery('#fb_login_button'); 
    var fb_welcome = jQuery('#fb_welcome'); 
    var name = ''; 

    FB.api('/me',function(response){ 
    console.log(response); 
    name = response.first_name; 
    fb_login_button.css('display', 'none'); 
    fb_welcome.html('<span>Welcome, ' + name + '</span>'); 
    fb_welcome.css('display', 'block'); }; 
    }); 
} 

(順便說一句,這是我不喜歡一次性變量談話:除非你在你的頁面上的其他地方使用它(這大概你不是因爲它是本地的你的display_welcome()功能),你根本不需要name變量,直接使用response.first_name直接在回調內。)