jQuery вложенный вопрос XML - PullRequest
0 голосов
/ 11 июня 2009

Я использую jQuery для вставки оболочки HTML в страницу и заполнения оболочки XML. Вот этот XML вопрос

  <minorPropCategory title="Test Title 1">
    <minorProp>FLV</minorProp>
    <minorProp>BLV</minorProp>
    <minorProp>RLV</minorProp>
  </minorPropCategory>
  <minorPropCategory title="Test Title 2">
    <minorProp>LAS</minorProp>
    <minorProp>ILV</minorProp>
    <minorProp>BIL</minorProp>
  </minorPropCategory>

Итак, во-первых, я импортирую фрагмент HTML для каждой minorPropCategory и добавляю заголовок, используя этот код

$(xml).find('minorPropCategory').each(function(){
                        var minorHeader=$(this).attr("title");
                        var minorId=$(this).attr("title").replace(/ /g,'');
                        var minorModuleContainerCode = "minorModuleContainer.html";
                        //names the div with a unique ID
                        minorDiv = $("<div id='"+minorId+"minorModuleContainer' class='minorModuleGroupContainer'>");
                        //Sets loading message in case it takes longer than usual to load
                        minorDiv.html("Loading......");
                        //After minorModuleContainerCode.html code loads, starts populating module
                        minorDiv.load(minorModuleContainerCode,"t",
                            function(){
                                $("#"+minorId+"minorModuleContainer").find(".minorModuleHeader").html(minorHeader);

                            }
                        );
                        $("#minorModuleContainer").append(minorDiv);

Затем я хочу добавить еще один фрагмент HTML-кода и заполнить его. Вот где у меня проблема. Я могу попробовать это так

//Create the actual minor modules
                        $(this).find('minorProp').each(function(){
                            var minorPropCode = $(this).text();
                            var minorModuleCode = "minorModule.html";
                            minorModuleDiv = $("<div id='"+minorPropCode+"minorModule' class='minorModule'>");
                            minorModuleDiv.html("Loading......");
                            minorModuleDiv.load(minorModuleCode,"b",
                            function(){
                                $.ajax({
                                    type: "GET", url: minorPropCode+".xml", dataType: "xml", 
                                    success: function(xml3) {
                                        $("#"+minorPropCode+"minorModule").find(".minorPropLogo").attr(
                                            {
                                                src:$(xml3).find('smallImage').text(),
                                                alt:$(xml3).find('smallImageAlt').text()
                                            }
                                        );

                                    }
                                });
                            });
                            $("#"+minorId+"minorModuleContainer").append(minorModuleDiv);
                        });
                    });

Но он никогда не появляется на странице, потому что я не думаю, что он стреляет в нужное время. В качестве альтернативы я попытался перенести создание второстепенных модулей в функцию .load своего родителя, но столкнулся с другой проблемой. Код выглядит следующим образом.

//MINOR MODULE CODE
                    $(xml).find('minorPropCategory').each(function(){
                        var minorHeader=$(this).attr("title");
                        var minorId=$(this).attr("title").replace(/ /g,'');
                        var minorModuleContainerCode = "minorModuleContainer.html";
                        //names the div with a unique ID
                        minorDiv = $("<div id='"+minorId+"minorModuleContainer' class='minorModuleGroupContainer'>");
                        //Sets loading message in case it takes longer than usual to load
                        minorDiv.html("Loading......");
                        //After minorModuleContainerCode.html code loads, starts populating module
                        minorDiv.load(minorModuleContainerCode,"t",
                            function(){
                                $("#"+minorId+"minorModuleContainer").find(".minorModuleHeader").html(minorHeader);
                                $(this).find('minorProp').each(function(){
                                    alert("minorPropFired");
                                    var minorPropCode = $(this).text();
                                    var minorModuleCode = "minorModule.html";
                                    minorModuleDiv = $("<div id='"+minorPropCode+"minorModule' class='minorModule'>");
                                    minorModuleDiv.html("Loading......");
                                    minorModuleDiv.load(minorModuleCode,"b",
                                    function(){
                                        $.ajax({
                                            type: "GET", url: minorPropCode+".xml", dataType: "xml", 
                                            success: function(xml3) {
                                                alert("test");
                                                $("#"+minorPropCode+"minorModule").find(".minorPropLogo").attr(
                                                    {
                                                        src:$(xml3).find('smallImage').text(),
                                                        alt:$(xml3).find('smallImageAlt').text()
                                                    }
                                                );

                                            }
                                        });
                                });
                            $("#"+minorId+"minorModuleContainer").append(minorModuleDiv);
                        });

Проблема в том, что строка с "$ (this) .find ('minorProp'). Each (function () {" не срабатывает, потому что "this" изменилось. показывает. Я чувствую, что делаю это неправильно. Любая помощь будет оценена. Спасибо.

Ниже приведен полный файл .js того, что я пытаюсь сделать.

// JavaScript Document<script language="JavaScript" type="text/javascript">
    $(document).ready(function(){
        //gets the code for the ad from the URL.  Using URL jQuery add-on to make this super-easy
        var adCode = $.url.param("adCode");
        if (adCode != null){
            //gets the ad code's XML file
            $.ajax({
                type: "GET", url: adCode+".xml", dataType: "xml", 
                success: function(xml) {
                    //Set the header image
                    $("#headerImg").attr(
                        {
                            src:$(xml).find('headerImage').text(),
                            alt:$(xml).find('headerImageAlt').text()
                        }
                    );
                    //set the header text
                    $("#headerText").html($(xml).find('adText').text());
                    //set the top image
                    $("#topImg").attr(
                        {
                            src:$(xml).find('topImage').text(),
                            alt:$(xml).find('topImageAlt').text()
                        }
                    );
                    //MAJOR MODULE CODE - This code reads all of the major modules, then adds a majorModule div, and populates it
                    //Gets all majorProps from ad XML
                    $(xml).find('majorProp').each(function(){
                        var propCode=$(this).text();
                        var majorModuleCode = "majorModule.html";
                        //names the div with a unique ID
                        div = $("<div id='"+propCode+"majorModule' class='majorModule'>");
                        //Sets loading message in case it takes longer than usual to load
                        div.html("Loading......");
                        //After majorModule.html code loads, starts populating module
                        div.load(majorModuleCode,"t",
                            function(){
                                //Get the XML for the prop, which contains prop specific stuff
                                $.ajax({
                                    type: "GET", 
                                    url: propCode+".xml", 
                                    dataType: "xml", 
                                    success: function(xml2) {
                                        $("#"+propCode+"majorModule").find(".propImg").attr(
                                            {
                                                src:$(xml2).find('smallImage').text(),
                                                alt:$(xml2).find('smallImageAlt').text()
                                            }
                                        );
                                        $("#"+propCode+"majorModule").find(".propLogoImg").attr(
                                            {
                                                src:$(xml2).find('smallLogo').text(),
                                                alt:$(xml2).find('name').text()
                                            }
                                        );
                                        $("#"+propCode+"majorModule").find(".viewCalendarLinkA").attr(
                                            {
                                                href:"https://www.harrahs.com/AvailabilityCalendar.do?propCode="+propCode+"&showHotDeal=Y"
                                            }
                                        );
                                        $("#"+propCode+"majorModule").find(".learnMoreLinkA").attr(
                                            {
                                                href:$(xml2).find('homeLink').text()
                                            }
                                        );
                                        $("#"+propCode+"majorModule").find(".propText").html(
                                                $(xml2).find('bodyText').text()
                                        );

                                    }
                                });
                                //Get the lowest rate for the prop
                                $.ajax({
                                    type: "GET", 
                                    url: "lowest_rate\\"+propCode+".xml", 
                                    dataType: "xml", 
                                    success: function(xml3) {
                                        $("#"+propCode+"majorModule").find(".roomRate").html(
                                                "$"+($(xml3).find('roomtype').filter(
                                                    function (index) {
                                                        return $(this).attr("lowest") == "Y";
                                                    }).text()).slice(0, -3)
                                        )
                                    }
                                });
                            }
                        );
                        $("#mainModuleContainer").append(div);
                    });
                    //MINOR MODULE CODE
                    $(xml).find('minorPropCategory').each(function(){
                        var minorHeader=$(this).attr("title");
                        var minorId=$(this).attr("title").replace(/ /g,'');
                        var minorModuleContainerCode = "minorModuleContainer.html";
                        //names the div with a unique ID
                        minorDiv = $("<div id='"+minorId+"minorModuleContainer' class='minorModuleGroupContainer'>");
                        //Sets loading message in case it takes longer than usual to load
                        minorDiv.html("Loading......");
                        //After minorModuleContainerCode.html code loads, starts populating module
                        minorDiv.load(minorModuleContainerCode,"t",
                            function(){
                                $("#"+minorId+"minorModuleContainer").find(".minorModuleHeader").html(minorHeader);

                            }
                        );
                        $("#minorModuleContainer").append(minorDiv);
                        //Create the actual minor modules
                        $(this).find('minorProp').each(function(){
                            var minorPropCode = $(this).text();
                            var minorModuleCode = "minorModule.html";
                            minorModuleDiv = $("<div id='"+minorPropCode+"minorModule' class='minorModule'>");
                            minorModuleDiv.html("Loading......");
                            minorModuleDiv.load(minorModuleCode,"b",
                            function(){
                                $.ajax({
                                    type: "GET", url: minorPropCode+".xml", dataType: "xml", 
                                    success: function(xml3) {
                                        $("#"+minorPropCode+"minorModule").find(".minorPropLogo").attr(
                                            {
                                                src:$(xml3).find('smallImage').text(),
                                                alt:$(xml3).find('smallImageAlt').text()
                                            }
                                        );

                                    }
                                });
                            });
                            $("#"+minorId+"minorModuleContainer").append(minorModuleDiv);
                        });
                    });



                }
            });
        }
    });

1 Ответ

1 голос
/ 22 июля 2009

Чтобы решить эту проблему непосредственно перед запуском minorDiv.load, сделайте что-то вроде этого

var elem = $(this);
minorDiv.load(minorModuleContainerCode,"t", function(){
    $("#"+minorId+"minorModuleContainer").find(".minorModuleHeader").
        html(minorHeader);

    // replace $(this) with elem here
    elem.find('minorProp').each(function(){
        ...
    }

    ...
}

Это сохранит ссылку на правильный объект в ваших вложенных функциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...