#javascript #ajax #jquery #global-variables
#javascript #ajax #jquery #глобальные переменные
Вопрос:
Как я могу присвоить переменную (var) объекту json, который возвращается из ajax-вызова на сервер? Мне нужно получить доступ к этому объекту в остальной части тела.
Например, я пробовал это, я не уверен, что это правильно.
var selectValues=$(document).ready(function() {
$.ajax({
type: "POST",
url: "http://10.0.2.2/mobileajax/callajax.php",
data: ({name: theName}),
cache: false,
dataType: "text",
success: onSuccess
});
})
var $vendor = $('select.mobile-vendor');
var $model = $('select.model');
$vendor.change(
function() {
$model.empty().append(function() {
var output = '';
$.each(selectValues[$vendor.val()], function(key, value) {
output = '<option>' key '</option>';
});
return output;
});
}).change();
// bonus: how to access the download link
$model.change(function() {
$('a#download-link').attr('href', selectValues[$vendor.val()][$model.val()]).show();
});
Обратите внимание, что переменная selectValues
используется в остальной части текста.
Ответ №1:
Я думаю, вам следует выполнить весь код внутри $(document).ready(function()
функции, а затем сделать вызов ajax синхронным. Потому что теперь вызов ajax будет выполнен, когда документ будет готов, но другой код будет выполняться напрямую, не дожидаясь, пока документ будет готов. Также вызов ajax по умолчанию асинхронный, поэтому вы должны сделать его синхронным и назначить selectValues
переменную внутри функции успеха ajax-вызова. Это станет чем-то вроде этого:
$(document).ready(function() {
var selectValues;
$.ajax({
type: "POST",
url: "http://10.0.2.2/mobileajax/callajax.php",
data: ({name: theName}),
cache: false,
dataType: "text",
async: false,
success: function(data) {
selectValues = data
}
});
var $vendor = $('select.mobile-vendor');
var $model = $('select.model');
$vendor.change(
function() {
$model.empty().append(function() {
var output = '';
$.each(selectValues[$vendor.val()], function(key, value) {
output = '<option>' key '</option>';
});
return output;
});
}).change();
// bonus: how to access the download link
$model.change(function() {
$('a#download-link').attr('href', selectValues[$vendor.val()][$model.val()]).show();
});
})
Ответ №2:
вы должны определить переменную вне document ready
области следующим образом:
var selectValues;
$(document).ready(function() {
// ajax
});
в функции onSuccess вы можете определить selectValues = data
или что-то в этом роде
Комментарии:
1. присвоение данных
selectValues
? Мне нужно присвоить возвращаемое значение, а не отправляющее значение.2. извините, я имел в виду
response
, поэтому что-то вродеsuccess: function(response) { selectValues = response; }
3. Большое спасибо за быстрый ответ!
4. пока остальной ваш код не находится в готовом документе, это не может работать.. потому что остальная часть кода будет выполнена до присвоения выбранных значений.
5. верно, но это срабатывает только по
change
событиям 🙂
Ответ №3:
$.ajax({
type: "POST",
url: "http://10.0.2.2/mobileajax/callajax.php",
data: ({name: theName}),
cache: false,
dataType: "text",
success: function (result){
var selectValues=resu<
}
});
попробуйте это.
Комментарии:
1.
var selectValues
будет доступно только вsuccess
функции, а не за пределами этой области2. Затем определите «значения выбора переменной» как глобальные
3. действительно, это должен быть ваш ответ Кугатасану Абимарану
4. Даже если
selectValues
значение является глобальным, обратите внимание, что остальная часть страницы фактически не сможет получить доступ к значениям до тех пор, пока не будет выполнен успешный обратный вызов.
Ответ №4:
Вот как мы извлекаем возвращаемую информацию из наших (xml) ajax-вызовов:
$.ajax ({
type: "POST",
url: "something.cgi?someparam=whatever",
data: "key=valamp;key2=val2",
dataType: "xml", // you use json, but I don't think it matters
success: function (data) {
if ($("error", data).text() === "") {
// I could assign $("error", data).text() to a var just here
// This gets the "error" parameter out of the returned xml or
// json, here contained in "data"
}
[snip the rest]
Ответ №5:
Другой способ сделать это — добавить остальную часть вашего кода в успешный обратный вызов, подобный этому:
$(document).ready(function() {
$.ajax({
type: "POST",
url: "http://10.0.2.2/mobileajax/callajax.php",
data: ({name: theName}),
cache: false,
dataType: "text",
async: false,
success: function(selectValues) {
var $vendor = $('select.mobile-vendor');
var $model = $('select.model');
$vendor.change(
function() {
$model.empty().append(function() {
var output = '';
$.each(selectValues[$vendor.val()], function(key, value) {
output = '<option>' key '</option>';
});
return output;
});
}).change();
// bonus: how to access the download link
$model.change(function() {
$('a#download-link').attr('href', selectValues[$vendor.val()][$model.val()]).show();
});
}
});
})