Javascript只经过for语句的第一次迭代
我一直想弄明白为什么这个“for”只循环一次。在花了大约6个小时重新编写条件之后,我想知道您是否可以帮我发现问题 提前感谢您的建议和宝贵时间Javascript只经过for语句的第一次迭代,javascript,loops,for-loop,Javascript,Loops,For Loop,我一直想弄明白为什么这个“for”只循环一次。在花了大约6个小时重新编写条件之后,我想知道您是否可以帮我发现问题 提前感谢您的建议和宝贵时间 var k; var i = 1; function stergeLinie(k) { var tabel = document.getElementById('produse'); var rowCount = tabel.rows.length; var row = document.getElementById("tr"
var k;
var i = 1;
function stergeLinie(k) {
var tabel = document.getElementById('produse');
var rowCount = tabel.rows.length;
var row = document.getElementById("tr" + k);
row.parentNode.removeChild(row);
var t = rowCount;
for (y = k; y < t; y++) {
document.getElementById("nrcrtid" + (y + 1)).value = y;
document.getElementById("nrcrtid" + (y + 1)).name = "nr_crt" + y;
document.getElementById("nrcrtid" + (y + 1)).id = "nrcrtid" + y;
document.getElementById("prodid" + (y + 1)).name = "prod" + y;
document.getElementById("prodid" + (y + 1)).id = "prodid" + y;
document.getElementById("umid" + (y + 1)).name = "um" + y;
document.getElementById("umid" + (y + 1)).id = "umid" + y;
document.getElementById("cantitateid" + (y + 1)).name = "cantitate" + y;
document.getElementById("cantitateid" + (y + 1)).id = "cantitateid" + y;
document.getElementById("pretid" + (y + 1)).name = "pret" + y;
document.getElementById("pretid" + (y + 1)).id = "pretid" + y;
document.getElementById("pretfaraTVAid" + (y + 1)).name = "pretfaraTVA" + y;
document.getElementById("pretfaraTVAid" + (y + 1)).id = "pretfaraTVAid" + y;
document.getElementById("tvaid" + (y + 1)).name = "tva" + y;
document.getElementById("tvaid" + (y + 1)).id = "tvaid" + y;
document.getElementById("tr" + (y + 1)).id = "tr" + y;
document.getElementById("buton" + (y + 1)).id = "buton" + y;
document.getElementById("butons" + (y + 1)).onclick = function onclick(event) {
stergeLinie(y);
}
document.getElementById("butons" + y).id = "butons" + (y);
}
alert(y);
document.getElementById("tr" + i).style.height = "100%";
i--;
}
var-k;
var i=1;
函数stergeLinie(k){
var tabel=document.getElementById('produse');
var rowCount=tabel.rows.length;
var行=document.getElementById(“tr”+k);
row.parentNode.removeChild(row);
var t=行数;
对于(y=k;y
主要问题是这一行:
document.getElementById("butons" + (y + 1)).onclick = function onclick(event) {
stergeLinie(y);
}
每次循环运行时,y
都会增加(y++
),因此当实际单击按钮时,y
具有它在最后一次迭代中的值-这刚好足以让循环运行一次
您遇到的另一个问题是这一行:
var rowCount = tabel.rows.length;
如果您的ID是基于1的,那么最小的数字是1,而length
属性是基于0的。如果有4行,rowCount
将是3,这意味着您的循环将永远不会达到4,因为条件是y
这里是您的脚本的简化版本:--我还必须在开始时运行一次函数,以按照您的方式绑定单击
以下是正确循环的更新版本:
它看起来复杂得多,但实际上并不复杂。将所有操作放入另一个函数,并将
y
的值作为参数传递给该函数-这意味着y
与循环中递增的y
变量不同,它属于循环中的函数。这是结束。这个问题的公认答案是:对闭包给出了极好的解释。取决于k
的值。您是否完成了一些基本调试(console.log()
k和t的值)?您确定执行不会因为一些未初始化的变量而在同一时间失败吗?如果您以前没有安装Firefox的Firebug,我建议您安装Firebug。它将向您显示运行时错误,并提供很好的调试可能性。@Zenith、Juhana、t定义为表的行数,k由HTML onclick事件发送。我已经测试了许多组合,(k=2,t=8;k5,t=13),所有组合都给出了相同的意外结果。@javadeveloper,我已经测试过了,第一次迭代应该完成,并且我检查了无数次变量。该函数由按钮调用,更确切地说,它是删除表中的一行,并递减以下行的名称和id。假设y=3,它将把(y+1)元素,也就是4,返回到y,变成3,以此类推,从'k'元素开始,最后把't'元素变成t-1。好的,我放在那里的故障保护代码,你可能可以去掉(if(!document.getElementById(“butons”+(y+1)){continue;}
——但我发现的两个大问题是在click函数中使用了y
,它现在取自元素id中的数字,行数是基于0的,而元素是基于1的。关于这个问题,你是对的,但是为什么不向他解释通常的、始终有效的解决方案,使用y的闭包呢?(var y=0;y
这是一个很好的观点。我认为这可能有点混乱,但我将把它加进去。这里很难给出点,因为你必须掌握一些用户代码的奥秘(像无用的var k;
外部,它将被函数参数k隐藏,隐式全局var i
,并且您还悄悄地在y前面插入var
,其中k就足够了,因为它被定义为类似于var的函数参数)……但是您让他/她走上了正确的道路;)
var k;
var i = 1;
function stergeLinie(k) {
console.log("k: " + k);
var tabel = document.getElementById('produse');
// Add 1 to the rowCount because the elements have been assigned
// ids starting with 1, and length is 0-based
var rowCount = tabel.rows.length + 1;
var row = document.getElementById("tr" + k);
row.parentNode.removeChild(row);
var t = rowCount;
console.log(t, k);
for (var y = k; y < t; y++) {
console.log("Loop: " + y);
// If the elements don't exist anymore because they were removed
// skip the loop
if (!document.getElementById("butons" + (y + 1))) {
continue;
}
document.getElementById("butons" + (y + 1)).onclick = function onclick(event) {
// Get the number out of the
// id of the element that was clicked
var x = parseInt(this.id.replace("butons",""));
console.log("x: " + x);
stergeLinie(x);
}
}
}
for (var y = k; y < t; y++) {
(function (y) {
document.getElementById("butons" + (y + 1)).onclick = function onclick(event) {
console.log(y);
stergeLinie(y);
}
}(y));
}