2013-11-06 4 views
1

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

Я пытаюсь создать плеер для загрузки html-файлов в div из xml-файла, а затем сможет перемещаться по страницам с помощью предыдущих и следующих кнопок. До сих пор мне удалось загрузить xml, преобразовать его в массив и загрузить первую страницу, но когда я нажимаю на предыдущие и следующие кнопки, я получаю «страницы неопределенными».

Вот код:

$(document).ready(function(){ 

    var i = 0; 

    $.ajax({ 
     type: "GET", 
     url: "studyguide/new_course.xml", 
     dataType: "xml", 
     success: function(xml) {   
      pages = parseXml(xml) 
      doStuff(pages); 
      loadFirstPage(pages); 
     } // END success 
    }); //END ajax 

    function parseXml(xml) { 
     var pages = []; 
     $(xml).find("page").each(function() { 
      pages.push({ 
       title: $(this).find("title").text(), 
       url: $(this).find("url").text() 
      }); // END .push 
     }); // END .each 
     return pages; 
    } // END parseXML 

    function doStuff(pages) { 
     //Do some javascript stuff with the response 
     alert(pages[0].title); 
     alert(pages[0].url); 
    } // END doStuff 

    function loadFirstPage(pages){ 
     //alert(pages[i].url); 
     $('#displayResults').html('<img src="../images/495.gif" />'); 
     $("#displayResults").load(pages[i].url, function() { 
     }) //END .load 
    }; //END loadFirstPage 

    function loadPage(pages){ 
     //alert(pages[i].url); 
     $('#displayResults').html('<img src="../images/495.gif" />'); 
     $("#displayResults").load(pages[i].url, function() { 
     }) //END .load 
    };// END loadPage 

    $('#prev').bind('click', function(pages) { 
     i--; 
     //alert(i); 
     loadPage(); 
    }) //END click 

    $('#next').bind('click', function(pages) { 
     i++; 
     //alert(i); 
     loadPage(); 
    }) // END click 

}); // END ready 

И XML:

<?xml version="1.0" encoding="iso-8859-1"?> 
<course> 
    <section name = "Section One"> 
     <page> 
      <title>Page 1</title> 
      <url>studyguide/page1.html</url> 
      <instructions></instructions> 
     </page> 
     <page> 
      <title>Page 2</title> 
      <url>studyguide/page2.html</url> 
      <instructions></instructions> 
     </page> 
     <page> 
      <title>Page 3</title> 
      <url>studyguide/page3.html</url> 
      <instructions></instructions> 
     </page> 
    </section> 
    <section name = "Section Two"> 
     <page> 
      <title>Page 1</title> 
      <url>studyguide/page4.html</url> 
      <instructions></instructions> 
     </page> 
     <page> 
      <title>Page 2</title> 
      <url>studyguide/page5.html</url> 
      <instructions></instructions> 
     </page> 
    </section> 
</course> 

Так что у меня 2 Вопросы, во-первых, как сделать массив глобальным, поэтому он может быть использован функцией loadPage , Во-вторых, есть ли лучший способ сделать это в первую очередь. Xml может содержать 5 страниц или 100 страниц, поэтому я хочу сохранить его динамическим.

Thanks

Спасибо за помощь. Я сделал некоторые изменения, и теперь я получаю «страницы [I] не определено. К сожалению я не программист по своей природе, так что вы должны медленно идти со мной.

$(document).ready(function(){ 

    var i = 0; 
    var pages = []; 

    $.ajax({ 
     type: "GET", 
     url: "studyguide/new_course.xml", 
     dataType: "xml", 
     success: function(xml) {   
      pages = parseXml(xml) 
      doStuff(pages); 
      loadFirstPage(pages); 
     } // END success 
    }); //END ajax 

    function parseXml(xml) { 
     //var pages = []; 
     $(xml).find("page").each(function() { 
      pages.push({ 
       title: $(this).find("title").text(), 
       url: $(this).find("url").text() 
      }); // END .push 
     }); // END .each 
     return pages; 
    } // END parseXML 

    function doStuff(pages) { 
     //Do some javascript stuff with the response 
     alert(pages[0].title); 
     alert(pages[0].url); 
    } // END doStuff 

    function loadFirstPage(pages){ 
     //alert(pages[i].url); 
     $('#displayResults').html('<img src="../images/495.gif" />'); 
     $("#displayResults").load(pages[i].url, function() { 
     }) //END .load 
    }; //END loadFirstPage 

    function loadPage(pages){ 
     //alert(pages[i].url); 
     $('#displayResults').html('<img src="../images/495.gif" />'); 
     $("#displayResults").load(pages[i].url, function() { 
     }) //END .load 
    };// END loadPage 

    $('#prev').bind('click', function(pages) { 
     i--; 
     //alert(i); 
     loadPage(pages); 
    }) //END click 

    $('#next').bind('click', function(pages) { 
     i++; 
     alert(i); 
     loadPage(pages); 
    }) // END click 

}); // END ready 
+0

Используйте 'window.varname = ...'. – clover

+2

просто объявите массив, в котором вы объявляете 'i':' var i = 0, pages = []; '. Не забудьте удалить его из функции parseXML –

ответ

0

Чтобы ответить на первый вопрос, если вы не 't положил var перед объявлением переменной, он станет глобальным (на объекте окна). Обычно это считается плохой идеей. Я лично, вероятно, объявлю переменную в вашей функции ready, а затем использую ее для других функций внутри этот объем.

Еще одно замечание здесь заключается в том, что вы настроили функцию loadPage с параметром, однако тогда вы не передаете ему что-либо в своем обращении к нему.

Я думаю, что ваш подход работает очень хорошо.

+0

Я просто добавил alert (pages.length); к функции doStuff, и это привело к появлению всплывающего окна с номером 5 в нем, но это верно, но когда я добавил одно и то же предупреждение к функции loadpages, я получил одно и то же предупреждение, но число теперь равно 1? – user2961753

+0

@ user2961753 Было бы возможно создать JSFiddle? Это облегчит вам задачу. – claydiffrient

+0

Исправлено! Просто удалил «страницы» из функции loadPage (страницы), и он сработал. Спасибо за вашу помощь. – user2961753

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