2010-10-04 55 views
1

我想從當前用戶獲得IP並與AJAX POST一起發送到PHP文件。這意味着我需要重新使用來自IP .getJSON請求的響應中獲得的變量。的jQuery(跨域).getJSON,在存儲響應重複使用的變量

腳本1:我發現這個方便的片斷上snipt

$.getJSON("http://jsonip.appspot.com?callback=?",function(data){ 
    alert("Your ip: " + data.ip); 
}); 

腳本1部作品,並給出你的IP 一個警告對話框。

腳本2:我轉換腳本1成這樣:

var ipAppspot; 
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){ 
     ipAppspot = data.ip; 
}); 
alert(ipAppspot); 

正如我知道,未聲明「變種」在一個變量的前關鍵字使得avaible到所有範圍甚至功能外(全球)。雖然我想這應該工作,如果腳本2不會是一個跨域請求可能,但在這種情況下,它給出了一個警告對話框,「undifined」那麼這個例子就不會工作,但

Stackoverflow還有另一個問題jQuery-storing-ajax-response-into-global-variable處理大約相同的問題。

並附加他們給出的解決方案我得到以下。

腳本3:追加從鏈路

// https://stackoverflow.com/questions/905298/jquery-storing-ajax-response-into-global-variable 
var ipStore = (function(){ 
    var ipAppspot; 
    $.getJSON("http://jsonip.appspot.com?callback=?",function(data){ipAppspot = data.ip;}); 
    return {getIp : function() 
    { 
     if (ipAppspot) return ipAppspot; 
     // else show some error that it isn't loaded yet; 
    }}; 
})(); 

alert(ipStore.getIp()); 

腳本3溶液給出了同樣的問題,因爲腳本2,這是'未定義'

問題:如何在以後的腳本中重新使用這個變量?

編輯尼克Cravers尼克Craver,這確實事實上作品回答

var ipAppspot; 
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){ 
    ipAppspot = data.ip; 
    myFunc();  
}); 
function myFunc() { 
    alert(ipAppspot); 
} 

function dataAuth(ip){  
    // collect data from form 
    var usernameRaw = $('#feg-username').val(); 
    var passwordRaw = $('#feg-password').val(); 
    // phpFile is our back-endgine 
    var phpFile = 'feg/back-endgine.php'; 
    // construct the JSON in a variable 
    var dataConstruct = "username=" + usernameRaw + "&password=" + passwordRaw + "&ip=" + ip; 
    // start the AJAX 
    $.ajax({ 
     type: "POST", 
     url: phpFile, 
     dataType: "json", 
     data: dataConstruct, 
     success: function(msg){ 
     alert(msg); 
     } 
    }); 
} // END dataAuth 

這是我的申請,我將使用功能,例如:

$('body').delegate('#feg-submit', 'click', function(){ 
    $(this).attr('disabled','disabled'); 
    console.log('submit button clicked'); 
    dataAuth(ipAppspot); 
    return false 
}); 

所以我會用ipAppspot那裏,我需要的IP爲AJAX請求以後,有什麼辦法可以實現它嗎?

回答

3

這不是一個範圍的問題,這是一個時機的問題,讓我們來說明它與一個例子確實工作,像這樣:

var ipAppspot; 
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){ 
    ipAppspot = data.ip; 
    myFunc();  
}); 
function myFunc() { 
    alert(ipAppspot); 
} 

You can test it here。注意它確實提醒你的IP,那麼這裏有什麼不同?你不是要求的變量(通過調用alert()),直到變量填充,這發生在$.getJSON()回調。所以範圍不是問題,但事實上,回調運行(當響應回來)的問題,只是從回調啓動任何需要的數據,因爲這是第一次數據可用。

下面是一個比較常見的例子,直接傳遞數據給所到之處:

$.getJSON("http://jsonip.appspot.com?callback=?",function(data){ 
    myFunc(data.ip); 
}); 
function myFunc(ipAppspot) { 
    alert(ipAppspot); 
} 

或者,短版:

$.getJSON("http://jsonip.appspot.com?callback=?", myFunc); 
function myFunc(ipAppspot) { 
    alert(ipAppspot); 
} 
1

您的警報發生在asyc操作完成之前,因此當時未定義。如果您將警報置於回調中,您會發現它(可能)已被正確定義。如果你想分配和重用變量,不要試圖這樣做,直到回調被觸發。也許需要這個值的邏輯可以放在一個從回調中調用的函數中?

0

Ajax是異步的。重構所以你在回調中做條件。

這或使異步錯誤。