Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.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事件侦听器';s函数不';不能在嵌套循环外工作_Javascript - Fatal编程技术网

JavaScript事件侦听器';s函数不';不能在嵌套循环外工作

JavaScript事件侦听器';s函数不';不能在嵌套循环外工作,javascript,Javascript,我在一个有嵌套循环的js项目上工作,我遇到了一个奇怪的情况: 当函数位于嵌套循环中时,例如 window.onload = function() { let board = document.getElementById('board'); for ( let i = 0; i < 9; i++ ) { for ( let j = 0; j < 9; j++ ) { const block = []; block[i, j] = docume

我在一个有嵌套循环的js项目上工作,我遇到了一个奇怪的情况:

当函数位于嵌套循环中时,例如

window.onload = function() {
let board = document.getElementById('board');

for ( let i = 0; i < 9; i++ ) {
    for ( let j = 0; j < 9; j++ ) {
        const block = [];
        block[i, j] = document.createElement( 'img' );
        block[i, j].src = "empty-block.png";
        block[i, j].coordinate_i = i;
        block[i, j].coordinate_j = j;
        block[i, j].addEventListener('contextmenu', function r_click(event)
        {
            coordinate_i = event.target.coordinate_i;
            coordinate_j = event.target.coordinate_j;
            block[coordinate_i, coordinate_j].src="flag.png";
            event.preventDefault();
        });
        board.appendChild(block[i, j]);
        }
    }
}
这个函数不起作用


我可以得到这些事件的解释吗?

它不起作用,因为函数r\u click是内联定义的。如果您将它作为一个单独的函数拉出,并使用它的名称绑定两个事件,那么它将工作

这是内联定义请注意,函数的名称不是必需的,因为函数不需要,因为函数存在于处理程序中

 block[i, j].addEventListener('contextmenu', function (event)
        {
            coordinate_i = event.target.coordinate_i;
            coordinate_j = event.target.coordinate_j;
            block[coordinate_i, coordinate_j].src="flag.png";
            event.preventDefault();
        });
这与上面的代码相同,但该函数实际上可以从其他地方访问

    function r_click(event){
       coordinate_i = event.target.coordinate_i;
       coordinate_j = event.target.coordinate_j;
       block[coordinate_i, coordinate_j].src="flag.png";
       event.preventDefault();
    }
    window.onload = function() {
       //....code here ....
           block[i, j].addEventListener('contextmenu',r_click);
      //...more code here
    }

您试图通过此
块[i,j]
访问什么?添加完整的相关代码(包括“循环”)这看起来不像有用的语法:
块[i,j]
。。。逗号运算符意味着这应该只是访问
块[j]
始终。。。您确定已在此处正确复制了代码吗?如果您试图访问嵌套阵列,请使用
this
event.target
引用事件目标。不幸的是,这仍然不起作用。只有在第一个示例中的情况下,代码才能按预期运行。您正在使用代码执行一些非常模糊的操作。除非你提供更多关于模块的信息,否则我无法进一步帮助你
    function r_click(event){
       coordinate_i = event.target.coordinate_i;
       coordinate_j = event.target.coordinate_j;
       block[coordinate_i, coordinate_j].src="flag.png";
       event.preventDefault();
    }
    window.onload = function() {
       //....code here ....
           block[i, j].addEventListener('contextmenu',r_click);
      //...more code here
    }