2012-12-22 125 views
3
<html> 
<head> 
    <title>Array of images</title> 
    <script type="text/javascript"> 
     var myPics = new Array[3]; 
     myPics[0] = "./img/blue.png"; 
     myPics[1] = "./img/red.png"; 
     myPics[2] = "./img/yellow.png"; 
     var counter = 0; 

     function preImg(){ 
     alert(counter); 
      if(counter == 0) 
       counter = 4; 

      counter --; 
     alert(counter); 
      document.getElementById("coloredImg").src = myPics[counter]; 
     } 

     function nextImg(){ 
      if(counter == 3) 
       counter = -1; 

      counter ++; 

      document.getElementById("coloredImg").src = myPics[counter]; 
     } 
    </script> 
</head> 
<body> 
    <img src="./img/blue.png" id="coloredImg" alt="Image not found"/> 
    <input type="button" onclick="preImg()" value="Previous"/> 
    <input type="button" onclick="nextImg()" value="Next"/> 
</body> 
</html> 

我遇到的問題是我的計數器變量在函數內部是未定義的。例如,當我調用函數preImg時,它會以未定義(當它應該只是0時)向我發出警報,而第二個警報顯示NaN,當它應該是3.爲什麼我的函數不能識別我的「var counter」,它是全局的嗎?你認爲變量mypics會發生同樣的情況嗎?謝謝!Javascript變量未定義

回答

8
new Array[3]; 

應該

new Array(3); 

反倒是,用方括號創建一個數組(有沒有需要或者指定長度):

var myPics = []; 

爲什麼使用這種語法你可能會問?有很多原因:

  1. []faster和更短的方式創建一個數組。
  2. 構造函數Array可以被覆蓋,而像這樣的語法結構不能。
  3. 在代碼中發現更容易,使調試更容易。
  4. 它有能力採取一個單一的元素(即[5]),而不是將其解釋爲數組的長度,這是一個繁瑣的構造函數的常見問題。
3

使用閉合簡單幻燈片對象超過elementpicscounter

function Slideshow(element, pics) { 
    var counter = 0; 

    this.nextImg = function() { 
     element.src = pics[counter]; 
     counter = (counter + 1) % pics.length; 
    } 
    this.nextImg(); // init 
} 

用法:

var show = new Slideshow(
    document.getElementById("coloredImg"), 
    ["./img/blue.png", "./img/red.png", "./img/yellow.png"] 
); 

show.nextImg(); // red 
show.nextImg(); // yellow 
show.nextImg(); // blue 

當函數被調用(或再次調用)時,閉包確保定義函數時在範圍內的每個變量仍處於範圍內。這種標準的JavaScript技術可以優雅地解決您的問題counter

使用基於模數的計算可讓計數器重複序列0,1,2(在此示例中)。


編輯:假設你想切換到一個新的形象每三秒鐘:

setInterval(show.nextImg, 3000);