我在使用AJAX成功范围之外的JSON对象时遇到问题。我需要在AJAX成功范围之外访问返回的JSON对象。我尝试在AJAX范围之外初始化JS var并为其分配JSON。但是,此方法会导致catalog.item is undefined
错误。我感谢任何有助于我解决此问题的建议。
这就是我的尝试:
这种方法完全正常(但不是我需要的):
$('.catViewButton').click(function(){
var overlay = jQuery('<div class="overlay"> </div>');
overlay.appendTo(".invoice-body");
$('.catalog-view-wrapper').show();
$.ajax({
url: "ajax/invoice-get-data.php?loadCatalog=1",
dataType: "json",
success: function(catalog){
alert(catalog.item[0].image);
$('.catalog-img-container').attr("src", catalog.item[0].image);
}
});
...more code
.....
.....
这种方法是我需要的,但会导致错误:
var catalog = [];
$('.catViewButton').click(function(){
var overlay = jQuery('<div class="overlay"> </div>');
overlay.appendTo(".invoice-body");
$('.catalog-view-wrapper').show();
$.ajax({
url: "ajax/invoice-get-data.php?loadCatalog=1",
dataType: "json",
success: function(cat){
catalog = cat;
}
});
alert(catalog.item[0].image);
$('.catalog-img-container').attr("src", catalog.item[0].image);
...more code
.....
.....
非常感谢提前!
答案 0 :(得分:3)
您可以使用Deferred Object来处理异步调用。这样做,无论何时发回响应,您的代码都将按阅读顺序执行。您可以根据需要添加任意数量的回调:
jqxhr = $.ajax({
url: "ajax/invoice-get-data.php?loadCatalog=1",
dataType: "json"
});
jqxhr.done(function(catalog) {
alert(catalog.item[0].image);
$('.catalog-img-container').attr("src", catalog.item[0].image);
});
jqxhr.done(function(catalog) {
// use catalog again
});
文档中充满了关于所有这些的示例:http://api.jquery.com/jQuery.ajax/。
答案 1 :(得分:1)
这是ajax的a
非常重要的地方。异步表示在运行成功回调之前alert
和后续.attr()
行正在运行。你真的应该将这些行放在成功回调中。
答案 2 :(得分:1)
查看延迟的obj和.when()。您不必将所有内容都放入成功回调中。
http://api.jquery.com/category/deferred-object/ http://api.jquery.com/jQuery.when/
答案 3 :(得分:0)
这就是AJAX的工作原理。返回到success:
函数的结果是该函数的本地结果。
如果您需要在成功函数之外访问它们,一个选项是将它们存储在一个元素中 - 例如隐藏的<input>
字段,如下所示:
假设隐藏的输入字段如下:
<input type="hidden" id="myHiddenField" />
修订AJAX
$.ajax({
url: "ajax/invoice-get-data.php?loadCatalog=1",
dataType: "json",
success: function(catalog){
$('#myHiddenField').val(catalog);
$('#myHiddenField').trigger('blur');
}
});
在AJAX功能之外:
$('#myHiddenField').blur(function() {
var cat = $(this).val();
//now do something with the data in var cat
});