Jquery-每个循环不更新变量

时间:2012-09-11 06:28:17

标签: javascript jquery

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

  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的新手,所以我确信它很简单。

3 个答案:

答案 0 :(得分:2)

它没有删除所有内容,当您执行items += "</select>";时,JSON请求尚未完成!

$.getJSON异步运行,这意味着语句启动了对给定URL的请求,但它不等待答案,程序流然后继续使用下一个语句(在您的情况下为{ {1}},无需等待items += ...完成!只有当响应到达时,才会调用给定的成功函数。

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

$.getJSON

备选方案2将是make the $.getJSON call non-asynchronous,以便该函数等待响应。您必须使用$.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 } ); 函数,如下所示:

$.ajax

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

答案 1 :(得分: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>";
});

答案 2 :(得分:0)

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

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

  items += "</select>";

您需要做的就是根据您的AJAX请求执行evertything。

  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>";
  });