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!応答が到着すると、指定された成功関数が呼び出されます。

その問題を解決する方法には 2 つの選択肢があります。代替案 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 に答える