2014-02-23 66 views
1

我不明白爲什麼clearInterval不適合我。在間隔中,我以表格格式顯示二維數組,然後更新數組,並反覆重複。爲什麼我不能清除間隔?

爲什麼clearInterval無法正常工作?

的JavaScript頭:

$(window).load(function() { 
    var tabl = document.getElementById('ordersTable'); 
    var l = tabl.rows.length; 
    var w = tabl.rows[0].cells.length; 
    alert("Width:" + w); 
    var array1 = new Array(l); 
    var array2 = new Array(l); 
    initialize(); 
    alert(JSON.stringify(array1)); 
    var st = setInterval(function() { 
     display(array1); 
     newArray(); 
     //alert(JSON.stringify(array1)); 
    }, 3000); 

    function stopTime() { 
     clearInterval(st); 
    } 

    function display(array) { 
     for (var i = 0; i < l; i++) { 
      for (var j = 0; j < w; j++) { 
       var tr = tabl.rows[i]; 
       var cll = tr.cells[j]; 
       var ct = cll.innerHTML = array[i][j]; 
       if (array[i][j] == 1) { 
        $(cll).css("color", "red"); 
       } else { 
        $(cll).css("color", "black"); 
       } 
       cll.id = array1[i][j]; 
      } 
     } 
    } 

    function initialize() { 
     for (var i = 0; i < l; i++) { 
      array1[i] = new Array(w); 
      array2[i] = new Array(w); 
      for (var j = 0; j < w; j++) { 
       var rand = Math.floor(Math.random() * 2); 
       array1[i][j] = rand; 
      } 
     } 
    } 

    function newArray() { 
     for (var i = 0; i < l; i++) { 
      for (var j = 0; j < w; j++) { 
       var rand = Math.floor(Math.random() * 2); 
       array1[i][j] = rand; 
      } 
     } 
    } 
}); 

HTML身體:

<table id="ordersTable"> 
    <tr><td>Row 1</td><td> Row 1.2</td><td>Row 1.3</td></tr> 
    <tr><td>Row 2</td><td> Row 2.2</td><td>Row 2.3 </td></tr> 
    <tr><td>Row 3</td><td> Row 3.2 </td><td>Row 3.3</td></tr> 
</table> 

<button onclick="stopTime()">Stop</button> 
+0

動功的$上述ST =「」(窗口).load(函數(){ – Grumpy

+3

@SLaks我upvoted您的評論但那只是壓痕差 - 這是不是一個可變的問題 –

+0

@BenjaminGruenbaum感謝您修復這個問題! –

回答

3

的原因是,stopTime()不是一個全球性的功能,所以它不能被你onclick="stopTime()"找到。

要解決該問題,請將stopTime()函數和st變量移至全局範圍。

var st; 

function stopTime() { 
    clearInterval(st); 
} 

$(window).load(function() { 
    //... 
    st = setInterval(function() { 
     display(array1); 
     newArray(); 
     //alert(JSON.stringify(array1)); 
    }, 3000); 

    // ... 
}); 

或結合onload函數內onclick處理程序。

$(window).load(function() { 
    //... 
    var st = setInterval(function() { 
     display(array1); 
     newArray(); 
     //alert(JSON.stringify(array1)); 
    }, 3000); 

    document.getElementById("my_button").onclick = function() { 
     clearInterval(st); 
    }; 

    //... 
}); 

<table id="ordersTable"> 
    <tr><td>Row 1</td><td> Row 1.2</td><td>Row 1.3</td></tr> 
    <tr><td>Row 2</td><td> Row 2.2</td><td>Row 2.3 </td></tr> 
    <tr><td>Row 3</td><td> Row 3.2 </td><td>Row 3.3</td></tr> 
</table> 

<button id="my_button">Stop</button> 
+0

他會如何解決它?哇,那很快。 –

+0

實際上,保持varialbe爲local,但在load-closure內設置click-handler是修復它的更好辦法......使用全局變量/爲'window'添加屬性是醜陋的。 –

+0

謝謝!這工作。我在想什麼 – Nazariy1995

0

可避免全局變量和動態連接監聽器,並保持引用所需的變量在閉包,如解決這個問題:

添加一個ID按鈕(或其他識別方法):

<button type="button" id="stopButton">Stop</button> 

添加監聽器負載的功能,是這樣的:

$(window).load(function() { 

    function stopTime() { 
     if (st) { 
      clearInterval(st); 
     } 
    } 
    var st = ...; 

    ... 

    $('#stopButton').click(function(){stopTime()}) 
});