Я хочу получить IP от текущего пользователя и отправить его вместе с AJAX POST в PHP файл.Это означает, что мне нужно повторно использовать переменную, полученную в ответе на запрос IP .getJSON.
Скрипт 1: Я нашел этот удобный фрагмент в snipt :
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
alert( "Your ip: " + data.ip);
});
Сценарий 1 работает и выдает предупреждение с вашим IP .
Сценарий 2: I
var ipAppspot;
$.getJSON("http://jsonip.appspot.com?callback=?",function(data){
ipAppspot = data.ip;
});
alert(ipAppspot);
script 1 преобразовал в это: Как я понимаю, отсутствие объявления ключевого слова 'var' перед переменной делает его доступным для всех областей, дажевне функции (глобально) .Хотя я думаю, что это должно работать, если script 2 не будет междоменным запросом, может быть, но в этом случае он выдает диалоговое окно с предупреждением 'undeifined' Так чтохотя пример не будет работать
Вкл Stackoverflow есть еще один вопрос jQuery-storing-ajax-response-into-global-variable , который имеет дело с примернота же проблема.
И добавляя решение, которое они дают, я получаю следующее.
Скрипт 3: Добавление решения по ссылке
// /703971/jquery-hranenie-otveta-ajax-v-globalnuy-peremennuy
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 , то есть 'undefined'
Вопрос: Как можноЯ повторно использую эту переменную в дальнейшем использовании в моем сценарии?
РЕДАКТИРОВАТЬ для ответа Ника Крейвера
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 позже, есть ли способ, которым я мог бы реализовать это?