如何使用Javascript中的变量值使用onclick按钮函数更改全局变量的值

艾莉森·李

我是这个平台的新手,刚遇到这样的问题:我想制作一个 9x9 的按钮网格,所以当用户点击坐标为 (x,y) 的按钮时,x 和 y 的值被保存到两个全局变量。下面是我的代码:

但是我测试的时候,不管在哪里点击,clicked_row和clicked_col的值永远是9和9。我想是因为函数只让i和j这两个值等于,它们的值停在了9 for 循环。有没有办法将值 i 和 j 传递给函数?非常感谢。

for (var i = 0; i < 9; i++) {
  for (var j = 0; j < 9; j++) {
    let btn = document.createElement("button");
    btn.innerHTML = ("(").concat((i + 1).toString(), ", ", (j + 1).toString(), ")"); //(i, j)
    btn.className = "button";
    btn.onclick = function() {
      clicked_row = i;
      clicked_col = j;
    };
    document.body.appendChild(btn);
  }
  document.body.appendChild(document.createElement("BR"));
}

水肿

您是正确的,问题是ij变量由所有function()s共享,因此它们都获得这些变量的最终值,即9.

传统的(ECMAScript中4)的方式来保存当前值是使用在其中传递的当前值的函数ij

    for (var i = 0; i < 9; i++) {
      for (var j = 0; j < 9; j++) {
        let btn = document.createElement("button");
        btn.innerHTML = ("(").concat((i + 1).toString(), ", ", (j + 1).toString(), ")"); //(i, j)
        btn.className = "button";
        btn.onclick = function(i, j) {
          return function() {
            clicked_row = i;
            clicked_col = j;
          };
        }(i, j);
        document.body.appendChild(btn);
      }
      document.body.appendChild(document.createElement("BR"));
    }

但是您正在使用let,它提供了一种更简单的方法:用于let定义变量的本地副本(在循环的每次迭代中都是不同的变量):

    for (var i = 0; i < 9; i++) {
      for (var j = 0; j < 9; j++) {
        let iNow = i, jNow = j;
        let btn = document.createElement("button");
        btn.innerHTML = ("(").concat((i + 1).toString(), ", ", (j + 1).toString(), ")"); //(i, j)
        btn.className = "button";
        btn.onclick = function() {
          clicked_row = iNow;
          clicked_col = jNow;
        };
        document.body.appendChild(btn);
      }
      document.body.appendChild(document.createElement("BR"));
    }

但是 JavaScript 在for循环的情况下为此提供了简写

    for (let i = 0; i < 9; i++) {
      for (let j = 0; j < 9; j++) {
        let btn = document.createElement("button");
        btn.innerHTML = ("(").concat((i + 1).toString(), ", ", (j + 1).toString(), ")"); //(i, j)
        btn.className = "button";
        btn.onclick = function() {
          clicked_row = i;
          clicked_col = j;
        };
        document.body.appendChild(btn);
      }
      document.body.appendChild(document.createElement("BR"));
    }

与原始代码的唯一区别是更改varlet. 请参阅使用“let”和“var”有什么区别?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用lamda更改全局变量的值?

如何在Perl中获取全局变量值?

如何返回使用变量值的函数?

python3-不使用更新的全局变量值,而是使用旧值

如何在函数中保存全局变量值?

如何使用Alamofire更改全局变量?

如何使用IRBuilder更新LLVM IR中的全局变量值?

如何使用if条件在python中更改变量值

如何获取AJAX的全局变量值

在函数内部更改全局变量值

GAS:在处理程序函数中使用变量时,如何更改全局变量值并保留其更改后的值?

jQuery全局变量值已更改也应从函数中访问

使用带有参数Javascript的函数更改全局变量

更改全局变量值jQuery

如何在javascript中的函数内使用全局变量?

使用window.onload内部的函数更改全局变量值

如何使用参数更改函数中的全局变量

用于更改全局变量值的按钮命令中的参数 python tkinter

除了声明它的函数之外,如何更改python中的全局变量值?

使用函数中的内容更改变量值

更改我测试的函数中使用的全局变量的值

如何使用 Javascript 对象中的变量值动态更改按钮的颜色?

无法在 Kotlin 中更改全局变量值

如何使用Javascript在函数中访问全局变量?

使用 Python 中的函数更改变量值

使用全局变量的函数是否可以使用函数声明时而不是调用时的变量值?

如何使用setstate更改streambuilder中的变量值?

如何设置 KOFAX KTM Server 全局变量值,该值将在 Batch open 中初始化,在SeparateCurrentPage 中更新并在 BatchClose 中使用?

在 Javascript 中单击按钮后更改变量值