2012-02-11 5 views
0

У меня есть одна из самых проблем, с которыми я когда-либо сталкивался с языком программирования. Im читает некоторые xml, а затем пытается отобразить на веб-странице. У меня нет проблем с этим. Вот код, как это сделать.обновление веб-страницы с помощью объекта цикла с помощью javascript

    // File: readXML.js 

         var shared  = []; 
         var sheet  = new Array() 
         // Start function when DOM has completely loaded 
         $(document).ready(function(){ 
          var bigo  = new Object(); 
          console.log("can you see me."); 

          var sheetJoint = new Object(); 


          // get the sheet xml file 
          $.get("sheet1.xml",{},function(xml){ 
           var attrs = []; 

           // this is a loop within a loop. we traverse the values in the xml to get end up with a key pair value of key: val 
          // in our case this works out to be A1 = 0 this is the first step to get the actual value from the sharedstring.xml 
          // Run the function for each row tag in the XML file 
          $(xml).find("row").each(function(i) { 
           //run the function for each c tag in the xml and get the attribute. 
           //this is the attribute that references the actual column. 
           $(this).find("c").each(function(i){ 
            $('c',xml).each(function(i) { 
              v1 = $(this).attr("r"); 
             bigo[v1] =v1; 
              bigo[v1]= $(this).find("v").text(); 
           }); 
         })}); 

          //get the shared string elements to combine with the other 
          $.get("sharedStrings.xml",{},function(xml){ 
            $('si',xml).each(function(i) { 
             shared.push($(this).find("t").text()); 

           })}); 


          }); 
          combineObjects(bigo);//combine the the array and the object. 
         }); 

Поскольку у меня есть два чтения двух разных файлов xml, я должен использовать другую функцию для их объединения. Вот эта функция.

function combineObjects(obj){ 
          myHTMLOutput = ''; 
          myHTMLOutput += '<table width="98%" border="1" cellpadding="0" cellspacing="0">'; 
          myHTMLOutput += '<th>A</th>'; 


         //mydiv=document.getElementById("ContentArea") 

        try{ 
         var strt=""; 
         var tempVal; 
        //loop throught the obejct and get the value from the returnTheValueSegment. 

        for (var ind in obj){ 
         //if you want to print something to the log then just add this. 
         // pretty handy when trying to discover variable values. does not see to work well inside for loops thought. 
         // console.log("can you see me."); 
         tempVal = returnTheValueOfSegment(obj[ind]); 
        //bring the values 
         obj[ind] = tempVal; 

         } 

         for (var ind in obj){ 


           mydata = BuildStudentHTML(ind); 
           myHTMLOutput = myHTMLOutput + mydata; 


         } 
          myHTMLOutput += '</table>'; 
           $("#ContentArea").append(myHTMLOutput); 
        } 
         catch(err){alert(err)}; 

        } 

моя проблема возникает, когда я создаю таблицу. его в основном ударил или пропустил ... , если я попробую его в firefox, он работает, только если я использую firebug и прохожу через код, иначе он не покажет элементы таблицы.

вот код, который вызывается для создания таблицы.

     function BuildStudentHTML(column1){ 



          // Build HTML string and return 
          output = ''; 
          output += '<tr>'; 
          output += '<td>'+ column1 +'</td>'; 
          output += '</tr>'; 
          return output; 
         } 

что я могу делать неправильно. мне нужен какой-то таймер? это то, что цикл должен быть быстрым, а обновление страницы не может обновляться. Пожалуйста, если кто-то может указать мне в правильном направлении, я был бы навсегда благодарен.

+0

Вы знаете, что '$ .get' является ** асинхронным **, правильно? И что возвращенные объекты будут недоступны до тех пор, пока HTTP-запросы не будут завершены? Вам нужно объединить возвращенные объекты с отсрочкой с '$ .when()', а затем выполнить свою «комбайновую» работу в обратном вызове. – Pointy

+0

Спасибо за ответ pointy.but вы в основном говорите, что функция движется вперед еще до того, как $ .get сделан? Можете ли вы указать мне в правильном направлении с обратным вызовом из .get? Im действительно новый для jquery и пытается понять. – user677275

+0

Да - '$ .get()' немедленно возвращает ** **, хотя может быть много миллисекунд или секунд до завершения HTTP-запроса. См. Ответ @ wecsam. – Pointy

ответ

1

В вашем коде combineObjects(bigo); вызывается до того, как HTTP-запросы для файлов XML могут завершиться. $.get() запускает новый HTTP-запрос и затем запускает функцию успеха , когда запрос завершил загрузку. Вы можете попробовать поставить combineObjects(bigo); в функцию успеха для последнего документа XML, но это не сработает, потому что bigo не будет определено в этой функции. Решение состоит в создании функции, которая создает функцию. Поместите это перед функцией $(document).ready():

function second_XML(bigo){ 
    return function(xml){ 
     $('si', xml).each(function (i) { 
      shared.push($(this).find("t").text()); 
     }); 
     combineObjects(bigo); //combine the the array and the object. 
    } 
} 

Это позволяет передать переменную bigo функции в качестве внешней переменной. Затем замените код, который загружает второй XML-документ с этим:

//get the shared string elements to combine with the other 
$.get("sharedStrings.xml", {}, second_XML(bigo)); 

Это сделает код ждать, пока второй файл XML не загружен, прежде чем объединять два. По какой-то причине вы уже заставили свой код ждать загрузки первого документа XML до загрузки второго, так что у вас нет проблемы.

+1

Спасибо, я полностью пропустил асинхронную часть. U - это человек, который поблагодарил вас за то, что указал мне в правильном направлении. – user677275

+0

Нет проблем. Добро пожаловать. – wecsam

Смежные вопросы