Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环遍历XML文件jQuery_Javascript_Jquery_Xml_Json - Fatal编程技术网

Javascript 循环遍历XML文件jQuery

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;

我有点被以下问题困住了

我有几个用ID标记的XML文件(每个XML都用一个值标识)。我现在尝试循环浏览这些文件,并将其内容输出到HTML

但是,它在执行回调之前启动循环

回路0 回路1 回路2 回调0 回拨1 回拨2

我需要 回路0 回调0 回路1 回拨1

因为我需要在某个时候控制结果

        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相当长的一段时间,这不是一个真正的长期选项,我现在看看下面的选项,然后将重新评估我的答案。谢谢你,奈特