Ajax jQuery——作为一个单词打印的变量字符串
我正在编写一些jquery,它将获取一组xml文件。然后,它将循环遍历这些内容并解析它们,以便在页面上显示它们。我有这个工作,但有一件事我想做的,如果在它列出的内容,我希望它打印的文件名。这是我的密码Ajax jQuery——作为一个单词打印的变量字符串,ajax,jquery,Ajax,Jquery,我正在编写一些jquery,它将获取一组xml文件。然后,它将循环遍历这些内容并解析它们,以便在页面上显示它们。我有这个工作,但有一件事我想做的,如果在它列出的内容,我希望它打印的文件名。这是我的密码 $.get('inc/getMenuFiles.php', function(data) { var catSplit = data.split(","); var menuitems = $('.menuitems'); menuitems.empty(); f
$.get('inc/getMenuFiles.php', function(data) {
var catSplit = data.split(",");
var menuitems = $('.menuitems');
menuitems.empty();
for (i=2; i<catSplit.length; i++) {
url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, '');
catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, '');
menuitems.append(catName);
$.ajax({
type: "GET",
url: url,
dataType: "xml",
success: function(xml) {
$(xml).find('item').each(function(){
var name = $(this).find('name').text();
var price = $(this).find('price').text();
menuitems.append(name + " - $" +price + "<br />");
});
}
});
}
});
$.get('inc/getMenuFiles.php',函数(数据){
var catSplit=data.split(“,”);
变量menuitems=$('.menuitems');
menuitems.empty();
for(i=2;i发生这种情况是因为for循环比AJAX调用快。请记住AJAX中的第一个A代表异步。想象一下
您正处于for循环的开始。您获取第一个catName
,并将其附加到menuitems
。然后启动AJAX调用以获取catName
中每个项目的名称和价格。同时,AJAX请求尚未响应,因此我们将其移到第二个catName
,启动另一个AJAX请求。第一个请求没有完成,我们刚刚启动了第二个请求;因此现在我们有两个AJAX响应等待处理。同时,我们继续第三个catName
等等,等等
解决方案
将内部AJAX调用中的属性设置为false
。这将使for循环暂停,直到请求完成
**首选**在for循环之前进行AJAX调用,将响应存储在某个位置(可能是存储在一个数组中),然后使用此数组运行for循环
发生这种情况的原因是,在当前执行路径完成之前,您的Ajax回调不会执行。要解决此问题,您可以等到Ajax回调内部追加catName。这应该可以:
$.get('inc/getMenuFiles.php', function(data) {
var catSplit = data.split(",");
var menuitems = $('.menuitems');
menuitems.empty();
for (i=2; i<catSplit.length; i++) {
url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, '');
catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, '');
$.ajax({
type: "GET",
url: url,
dataType: "xml",
success: (function(catName){
return function(xml) {
menuitems.append(catName);
$(xml).find('item').each(function(){
var name = $(this).find('name').text();
var price = $(this).find('price').text();
menuitems.append(name + " - $" +price + "<br />");
});
}
})(catName)
});
}
});
$.get('inc/getMenuFiles.php',函数(数据){
var catSplit=data.split(“,”);
变量menuitems=$('.menuitems');
menuitems.empty();
对于(i=2;i您提到的文件名:它与catName
有多大不同?您的问题是关于打印变量字符串,但您的要求是关于打印文件名。请澄清您的问题。基本上是menuitems.append(catName);正在工作,但它正在将所有文件名打印为一个字符串。下面是我所说内容的屏幕截图:@raina77ow-我只是删除了.xml并“从中删除,这就是变量所做的一切”你的意思是“在一行中”而不是字符串吗?我以为默认情况下async设置为true?我添加了它,但结果仍然相同。1)for循环的速度无关紧要。即使执行for循环需要10天时间,第一个请求的回调函数也不会执行,直到for循环完成。2)你的意思是将async
设置为false
,这是一个非常糟糕的解决方案。这里演示了异步Javascript如何独立于for循环的速度:@这是半固定的。如果你删除了关于它发生的部分,因为for循环更快,并将其更改为类似以下内容的内容:for循环在第一个回调函数执行之前完成(即使AJAX请求已完成),我将删除我的否决票。@ascii lime,关于使用async:false
是一个糟糕的解决方案,您可能是对的(这就是为什么我提供了另一种解决方案),但关于速度不是问题,您是错的。例如:
$.get('inc/getMenuFiles.php', function(data) {
var catSplit = data.split(",");
var menuitems = $('.menuitems');
menuitems.empty();
for (i=2; i<catSplit.length; i++) {
url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, '');
catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, '');
$.ajax({
type: "GET",
url: url,
dataType: "xml",
success: (function(catName){
return function(xml) {
menuitems.append(catName);
$(xml).find('item').each(function(){
var name = $(this).find('name').text();
var price = $(this).find('price').text();
menuitems.append(name + " - $" +price + "<br />");
});
}
})(catName)
});
}
});