带有匿名函数的事件侦听器(typeError ,toggle undefined)

用户7171623

我是Javascript新手

我有两张相同的桌子并排放置。我想要镜面效果。case 1在没有匿名函数的情况下工作正常。

但是,我的case 2Javascript 代码中似乎存在一些问题,这对我的项目至关重要


情况1

 var table1td = document.querySelectorAll("#table1 td");
 var table2td = document.querySelectorAll("#table2 td");

 for(var i=0; i<table2td.length; i++)
 {
    table2td[i].addEventListener("click",_click);
 }

 function _click() {
    this.classList.toggle("_changecolor");
 }

案例二

 var table1td = document.querySelectorAll("#table1 td");
 var table2td = document.querySelectorAll("#table2 td");    

 for(var i=0; i<table2td.length; i++)
 {
    table2td[i].addEventListener("click", function(){_click(i)});
 }

function _click(index) {
    this.classList.toggle("_changecolor");
    table2td[9-index].classList.toggle("_changecolor");
}

(HTML、CSS 代码没有变化)

易卜拉欣·马里尔

您的代码有两个问题:

  1. 你不能使用thisinside_click因为它不会成为你的元素。触发事件的元素将绑定到传递给的匿名函数addEventListener,而不是_click(取决于您的代码的其余部分,将绑定到undefined或全局对象window)。

您可以通过在匿名函数中使用orthis调用时显式设置来解决此问题_clickFunction#callFunction#apply

for(var i = 0; i < table2td.length; i++) {
    table2td[i].addEventListener("click", function() {
        _click.call(this);                       // passing the current this (of the anonymous function) to _click as we invoke it
    });
}

function _click() {
    this.classList.toggle("_changecolor");       // using this is OK
}
  1. 由于这个著名的问题,您无法使用索引

一个快速解决方法是使用let(尊重块范围)而不是var(不尊重):

for(let i = 0; i < table2td.length; i++) {       // using let instead of var
    table2td[i].addEventListener("click", function() { _click(i); });
}

function _click(index) {                         // using index is also OK
    table2td[index].classList.toggle("_changecolor");
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用带有局部作用域变量的匿名函数删除事件侦听器

事件侦听器中的匿名函数与事件侦听器中的匿名函数

JavaScript - 使用带有 setTimeout 函数的事件侦听器

在事件侦听器中的匿名函数中运行函数

阻止函数执行或删除匿名事件侦听器

Toggle 函数追加 Div 而不是 Toggle

尝试获取资源时,带有CLICK事件侦听器的Javascript API FETCH:TypeError:NetworkError

删除带有额外参数的事件侦听器

如何在没有匿名函数的情况下设置事件侦听器?(不失去范围)

Bootstrap .navbar-toggle事件

将参数传递给事件侦听器中的方法而不添加匿名函数

如何从具有匿名功能的div中删除事件侦听器

禁用匿名事件侦听器或将参数和事件传递给非匿名侦听器

如何使用带有事件学说的事件侦听器更改相关实体

将带有事件侦听器的元素传递给模板事件内的appendChild

TypeError:undefined不是函数Angular

触发data-toggle = offcanvas事件

在 Switch Toggle 事件上更新 ListView 内容

Toggle()函数元素未正确消失

如何在 Javascript 中添加带有 HTML 模板文字的事件侦听器?

添加带有参数的事件侦听器,然后将其删除

带有 react-native-image-zoom-viewer 的后退按钮事件侦听器

使用键值对数组遍历多个按钮以添加带有循环的事件侦听器

带有远程JanusGraph的变异侦听器事件策略引发序列化异常

Mat-toggle-slide 觸發器

错误TypeError:“ jit_nodeValue_3(...)。toggle不是函数”

运行函数的函数 onclick 事件侦听器

有什么方法可以访问在函数中添加了事件侦听器的元素?

如何在类内的html中添加具有函数回调的事件侦听器?