有人可以告诉我为什么这不起作用吗?
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的新手,所以我确信它很简单。
答案 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>";
});