2016-01-12 42 views
1

我有兩個簡單的函數,當被調用時,將一個條目移回,或者向前移動數組中的一個條目。但是,當你到達最後並顯示所有條目時,還有一個額外的「未定義」條目。對於如何解決這個問題,有任何的建議嗎?防止未定義的數組條目

<?php 
$slide_img_array = array(); 
$slide_desc_array = array(); 
$slide_name_array = array(); 

while (!$sql_pres_select->eof()) { 
    array_push($slide_img_array, $sql_pres_select->valueof('file_location')); 
    array_push($slide_desc_array, $sql_pres_select->valueof('description')); 
    array_push($slide_name_array, $sql_pres_select->valueof('slide_name')); 
    $sql_pres_select->next(); 
} 
?> 
<script> 

    var slide_no = 0; 
    var slides = <?php echo json_encode($slide_img_array); ?>; 
    var desc = <?php echo json_encode($slide_desc_array); ?>; 
    var names = <?php echo json_encode($slide_name_array); ?>; 

    function nextSlide() { 
     if (slide_no < slides.length) { 
      slide_no++; 
      document.getElementById("display").src = slides[slide_no]; 
      document.getElementById("func_slide_desc").innerHTML = desc[slide_no]; 
      document.getElementById("func_slide_name").innerHTML = names[slide_no]; 

     } 

    } 
    function prevSlide() { 
     if (slide_no > 0) { 
      slide_no--; 
      document.getElementById("display").src = slides[slide_no]; 
      document.getElementById("func_slide_desc").innerHTML = desc[slide_no]; 
      document.getElementById("func_slide_name").innerHTML = names[slide_no]; 
     } 
    } 

    function goToSlide(id) { 
     slide_no = id; 
     document.getElementById("display").src = slides[slide_no]; 
     document.getElementById("func_slide_desc").innerHTML = desc[slide_no]; 
     document.getElementById("func_slide_name").innerHTML = names[slide_no]; 
     document.getElementById('slide_index').innerHTML = slide_no; 

    } 
</script> 

我想我需要寫檢查,如果數組的結尾是否已經reached.But我不確知我應該怎麼做這一行。我曾嘗試執行以下操作:

function nextSlide() { 
      if (slide_no < slides.length) { 
       slide_no++; 
       document.getElementById("display").src = slides[slide_no]; 
       document.getElementById("func_slide_desc").innerHTML = desc[slide_no]; 
       document.getElementById("func_slide_name").innerHTML = names[slide_no]; 

      } 
      else if (slide_no===slides.length){ 
       break; 
      } 

但是,當我嘗試它只是停在第一個條目和nextSlide功能將不再工作

+0

嘗試刪除'else if'語句並將其全部放入其中。 –

+0

同時將'slide_no

+0

如果我刪除'else if'語句幻燈片可以正確來回移動,但問題是,在幻燈片結束時,我得到一個未定義的條目,我不想 –

回答

1

問題是訪問數組元素,你需要索引爲0之間是數組長度 - 1.

在你nextSlide()第一實施你執行以下操作:

function nextSlide() { 
    if (slide_no < slides.length) { 
     slide_no++; 

這意味着當slide_no等於length-1並調用該函數時,if()條件將爲true,因爲slide_no將小於slides.length。然後,您將1添加到slide_no,這意味着slide_no現在等於slides.length,而您1超出索引限制 - 這就是爲什麼您得到未定義的值。 我會重寫它像這樣

function nextSlide() { 
    if (slide_no < slides.length - 1) { 
     slide_no++; 
     document.getElementById("display").src = slides[slide_no]; 
     document.getElementById("func_slide_desc").innerHTML = desc[slide_no]; 
     document.getElementById("func_slide_name").innerHTML = names[slide_no]; 
    } 
} 
+0

它的工作原理,你可能只是爲了更好的可讀性而修改答案。我幾乎可以理解所有的東西,只需要更清晰一點 –

+0

!根據Albertus的評論,爲了清晰而重寫了一些解釋。 – cyrille

+0

很好的答案,完美解釋! –

1

刪除else if,一切都在它裏面,也同時更換slide_no < slides.lengthslide_no < slides.length - 1或移動線slide_no++以命令的結束,如果塊。

所以它會解決你的問題。在訪問slides陣列之前,問題以slide_no爲增量。

爲了避免執行的東西你不需要執行函數中break,只是單純的ommit添加任何新的代碼(代碼添加到只有身體是否),或者把return;在else語句,如果你需要停止從futher執行功能。

+0

兩種方法都奏效,謝謝 –

+0

不客氣!祝你好運 ) –