Javascript 循环遍历XML文件jQuery
我有点被以下问题困住了 我有几个用ID标记的XML文件(每个XML都用一个值标识)。我现在尝试循环浏览这些文件,并将其内容输出到HTML 但是,它在执行回调之前启动循环 回路0 回路1 回路2 回调0 回拨1 回拨2 我需要 回路0 回调0 回路1 回拨1 因为我需要在某个时候控制结果Javascript 循环遍历XML文件jQuery,javascript,jquery,xml,json,Javascript,Jquery,Xml,Json,我有点被以下问题困住了 我有几个用ID标记的XML文件(每个XML都用一个值标识)。我现在尝试循环浏览这些文件,并将其内容输出到HTML 但是,它在执行回调之前启动循环 回路0 回路1 回路2 回调0 回拨1 回拨2 我需要 回路0 回调0 回路1 回拨1 因为我需要在某个时候控制结果 var allContent=["xmlfile1","xmlfile2","xmlfile3","xmlfile4"]; var totalSearch = 0;
var allContent=["xmlfile1","xmlfile2","xmlfile3","xmlfile4"];
var totalSearch = 0;
var countSearch = 0;
function doSearch() {
var oldContentID = contentID;
for (iSearch=0;iSearch<allContent.length;iSearch++) {
totalSearch = totalSearch + countSearch;
contentID = allContent[iSearch];
defineContent();
getXML();
}
}
function getXML() {
$.ajax({
type: "GET",
url: langFile,
dataType: "xml",
beforeSend: function(){
$('#results-list').empty();
$('#results-list').hide();
$('#loading').addClass('loading');
},
success: function(xml) {
var totalElements;
var intSearch = 0;
totalSearch = totalSearch + countSearch;
countSearch = 0;
var searchText = $('#text').val().toLowerCase();
totalElements = $(xml).find('news').length;
while (intSearch < totalElements) {
oFeed = $(xml).find('news:eq('+intSearch+')');
var headline = oFeed.find('headline').text();
var newsText = oFeed.find('detail').text();
var section = oFeed.find('section').text();
var category = oFeed.attr('category');
var stripEnters = newsText.match(/\r?\n|\r/gi);
if (stripEnters != null) {
for (var s = 0; s < stripEnters.length ; s++ ){
newsText = newsText.replace(stripEnters[s],'');
}
}
var newsText2 = $.htmlClean(newsText, {format:true});
var newsText3 = $(newsText2)
var newsText4 = $(newsText3).text();
var newsText5 = newsText4.replace( /\W/gi, "" );
if (section.toLowerCase() == "news" || section.toLowerCase() == "featured") {
if (headline.toLowerCase().indexOf(searchText) >= 0) {
$('<dt></dt>').html(headline).appendTo('#results-list');
$('<dd></dd>').html(newsText).appendTo('#results-list');
countSearch++;
}//end if
else if (newsText5.toLowerCase().indexOf(searchText) >= 0) {
$('<dt></dt>').html(headline).appendTo('#results-list');
$('<dd></dd>').html(newsText).appendTo('#results-list');
countSearch++;
}
}
intSearch++;
}
}
});
}
var allContent=[“xmlfile1”、“xmlfile2”、“xmlfile3”、“xmlfile4”];
var totalSearch=0;
var countSearch=0;
函数doSearch(){
var oldContentID=contentID;
对于(iSearch=0;iSearch=0){
$(“”).html(标题).appendTo(“#结果列表”);
$(“”).html(新闻文本).appendTo(“#结果列表”);
countSearch++;
}//如果结束
else if(newsText5.toLowerCase().indexOf(searchText)>=0){
$(“”).html(标题).appendTo(“#结果列表”);
$(“”).html(新闻文本).appendTo(“#结果列表”);
countSearch++;
}
}
intSearch++;
}
}
});
}
在回调结束时,我需要运行以下命令,但是它现在在完成所有回调之前执行此函数
function displayResults() {
if (totalSearch == 0)
{
alert("No results found");
$('#loading').removeClass('loading');
$('#main').fadeIn(1000);
}
else {
dynamicFaq();
$('<p></p>').html(totalSearch + ' Results found').prependTo('#results-list');
$('#results-list').fadeIn(1000);
$('#loading').removeClass('loading');
}
}
函数显示结果(){
如果(totalSearch==0)
{
警报(“未发现结果”);
$('加载').removeClass('加载');
$('main').fadeIn(1000);
}
否则{
dynamicFaq();
$(“”).html(totalSearch+“找到的结果”).prependTo(“#结果列表”);
$(“#结果列表”).fadeIn(1000);
$('加载').removeClass('加载');
}
}
我发现您的AJAX调用是异步的。试用
....
type: "GET",
url: langFile,
async: false,
dataType: "xml",
.....
如果我理解正确,您需要加载一个xml文件,循环,然后开始加载下一个xml文件。如果是这样,下面是一个小伪代码:
function doSearch(int xmlFileIterator){
if (xmlFileIterator < allContent.length) {
...
contentID = allContent[xmlFileIterator];
...
getXml(xmlFileIterator);
} else {
//no more xml files left
displayResults();
}
}
function getXml(int xmlFileIterator) {
...
success: function() {
...
doSearch(++xmlFileIterator);
}
}
函数doSearch(int-xmlFileIterator){
if(xmlFileIterator
第一个调用是
doSearch(0)
,它加载第一个xml文件。加载文件并完成循环(成功)后,您可以使用更大的数字(迭代器)再次调用doSearch
函数。维护ajax队列,以便逐个完成ajax调用。另外,还要维护一个全局变量searchedCount,该变量将维护主xml的处理方式
在ajax的完全回调中,检查searchedCount并调用displayResults函数
var allContent = ["xmlfile1", "xmlfile2", "xmlfile3", "xmlfile4"];
var totalSearch = 0;
var countSearch = 0;
var searchedCount = 0;
var ajaxQueue = $({});
$.ajaxQueue = function (ajaxOpts) {
// Hold the original complete function.
var oldComplete = ajaxOpts.complete;
// Queue our ajax request.
ajaxQueue.queue(function (next) {
// Create a complete callback to fire the next event in the queue.
ajaxOpts.complete = function () {
// Fire the original complete if it was there.
if (oldComplete) {
oldComplete.apply(this, arguments);
}
// Run the next query in the queue.
next();
};
// Run the query.
$.ajax(ajaxOpts);
});
};
function doSearch() {
var oldContentID = contentID;
searchedCount = 0;
for (iSearch = 0; iSearch < allContent.length; iSearch++) {
totalSearch = totalSearch + countSearch;
contentID = allContent[iSearch];
defineContent();
searchedCount++;
getXML();
}
}
function getXML() {
$.ajaxQueue({
type: "GET",
url: langFile,
dataType: "xml",
beforeSend: function () {
$('#results-list').empty();
$('#results-list').hide();
$('#loading').addClass('loading');
},
success: function (xml) {
//your code
},
complete: function () {
if (searchedCount == allContent.length) {
displayResults()
}
}
});
}
var allContent=[“xmlfile1”、“xmlfile2”、“xmlfile3”、“xmlfile4”];
var totalSearch=0;
var countSearch=0;
var searchedCount=0;
var ajaxQueue=$({});
$.ajaxQueue=函数(ajaxOpts){
//保留原始完整功能。
var oldComplete=ajaxOpts.complete;
//对ajax请求进行排队。
队列(函数(下一步){
//创建一个完整的回调以触发队列中的下一个事件。
ajaxOpts.complete=函数(){
//如果原稿在那儿,就把它全部烧掉。
如果(已完成){
oldComplete.apply(这个,参数);
}
//运行队列中的下一个查询。
next();
};
//运行查询。
$.ajax(ajaxOpts);
});
};
函数doSearch(){
var oldContentID=contentID;
searchedCount=0;
对于(iSearch=0;iSearch
永远不要使用同步调用,永远不要。它会卡在浏览器上(这只是你应该避免同步调用的一个方面)。异步工作,但它冻结了IE7/8相当长的一段时间,这不是一个真正的长期选项,我现在看看下面的选项,然后将重新评估我的答案。谢谢你,奈特