Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript只经过for语句的第一次迭代_Javascript_Loops_For Loop - Fatal编程技术网

Javascript只经过for语句的第一次迭代

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"

我一直想弄明白为什么这个“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" + 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));

}