2017-03-05 23 views
1

我有一個表,每行都需要點擊功能。發送行號到另一個功能點擊

我想將行號和文本發送到另一個函數。

當我點擊一行時,它給了我正確的文本,但是對於每行,它給出了總行數。我將如何給出被點擊的當前行的編號?

var table = document.getElementById("orders"); 
if (table != null) { 
    for (var i = 0; i < table.rows.length; i++) { 
     for (var j = 0; j < table.rows[i].cells.length; j++) 
     table.rows[i].cells[j].onclick = function() { 
      tableText(this, i); 
     }; 
    } 
} 

function tableText(tableCell, i) { 
    alert(tableCell.innerHTML + i); 
} 

回答

1

您遇到了與JavaScript var範圍有關的常見問題。問題是該變量的範圍爲for循環本身,而不是該塊。這意味着該變量會隨着for的每一次迭代而不斷變化。

您可以輕鬆地修復與ES6 let

const table = document.getElementById("orders"); 
if (table != null) { 
    for (let i = 0; i < table.rows.length; i++) { 
     for (let j = 0; j < table.rows[i].cells.length; j++) 
     table.rows[i].cells[j].onclick = function() { 
      tableText(this, i); 
     }; 
    } 
} 

(我改變了其他變量的最佳實踐,但它是不是真的有必要。)

如果您不能使用ES6可以回落到這樣的自我執行功能:

for (var i = 0; i < table.rows.length; i++) { 
    for (var j = 0; j < table.rows[i].cells.length; j++) { 
     table.rows[i].cells[j].onclick = (function (i) { 
      return function() { 
       tableText(this, i); 
      }; 
     })(i); 
    } 
} 

雖然不是很好。

參見:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let#Cleaner_code_in_inner_functions

0

沒有進入它的深入,我懷疑alert通話評價的innerHTMLi在一起,這樣你得到的alert數量不正確。

我也會改變:

tableText(this, i); 

明確地說

tableText(table.rows[i].cells[j], i); 

,只是爲了避免任何可能的混亂。 this可以評估到JavaScript/html文件本身

+0

idmean他的第一個答案工作。不過謝謝。 – DowinskiField

相關問題