0

有人可以告诉我为什么这不起作用吗?

  var items = "<select id=\"orderer_search\" name=\"search\">";
  $.getJSON("https://dev.xxx.com", 
    function(data){
     $.each(data, function(index,item) { 
       items += "<option value='" + item + "'>" + item + "</option>";
     });           
  });

  items += "</select>";

如果我在之前放置警报(项目):

items += "</select>";

值为:

<select id="orderer_search" name="search">

但是如果我在每个循环中放置一个警报,每个弹出窗口都会显示从 JSON 请求返回的值。

几乎就像每个循环结束后,它正在删除我items在每个循环期间添加到变量中的所有内容。我是 JQuery 的新手,所以我确信这很简单。

4

3 回答 3

2

它并没有删除所有内容,当您这样做时,JSON 请求还没有完成items += "</select>";

$.getJSON异步运行,这意味着该语句开始对给定 URL 的请求,但它不等待答案,然后程序流程继续执行下一条语句(在您的情况下items += ...,不等待$.getJSON完成!仅当响应到达,调用给定的成功函数。

在如何解决该问题时,您有两种选择。备选方案 1 将推迟items字符串的所有组合,直到$.getJSON成功:

$.getJSON("https://dev.xxx.com", 
    function(data){
       var items = "<select id=\"orderer_search\" name=\"search\">";
       $.each(data, function(index,item) { 
           items += "<option value='" + item + "'>" + item + "</option>";
       });
       items += "</select>";
       alert(items); // or whatever else you have to do with items
    }
);

备选方案 2 是使$.getJSON调用非异步,以便函数等待响应的到来。您必须使用该$.ajax功能,如下所示:

var items = "<select id=\"orderer_search\" name=\"search\">";
$.ajax({
    url: "https://dev.webshop.restore.net.au/_pag/shop/TEST/?
          bc=TEST&sec=order%2F&pag=get_orderers_list",
    dataType: 'json',
    async: false,
    success: function(data) { 
        $.each(data, function(index,item) { 
            items += "<option value='" + item + "'>" + item + "</option>";
        }
    }
});
items += "</select>";
alert(items); // or whatever else you have to do with items

备选方案 1 有可能使您的脚本更具响应性,如果除了填写此选择之外还有其他事情要做;因为那时请求在后台运行,与您的其他代码准并行。所以我通常会这样做。

于 2012-09-11T06:31:05.233 回答
1

试过这样..???

var items = "<select id=\"orderer_search\" name=\"search\">";
$.getJSON("https://dev.webshop.restore.net.au/_pag/shop/TEST/?
          bc=TEST&sec=order%2F&pag=get_orderers_list", 
function(data){
 $.each(data, function(index,item) { 
   items += "<option value='" + item + "'>" + item + "</option>";
 }); 
   items += "</select>";
});
于 2012-09-11T06:31:19.150 回答
0

$.getJSON() 函数是异步的,这意味着您稍后会得到结果。

所以这部分代码在之前执行:

  items += "</select>";

你所要做的就是在你的 AJAX 请求的答案中执行一切。

  var items;
  $.getJSON("https://dev.webshop.restore.net.au/_pag/shop/TEST/?
              bc=TEST&sec=order%2F&pag=get_orderers_list", 
    function(data){
     items = "<select id=\"orderer_search\" name=\"search\">";
     $.each(data, function(index,item) { 
       items += "<option value='" + item + "'>" + item + "</option>";
     });
     items += "</select>";
  });
于 2012-09-11T06:32:46.590 回答