Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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
无法使EventListener仅触发一次JavaScript_Javascript - Fatal编程技术网

无法使EventListener仅触发一次JavaScript

无法使EventListener仅触发一次JavaScript,javascript,Javascript,我试图创建一个只触发一次的链接,这样我就可以将它更改为另一个EventListener。 当我按下“Show More”时,我希望删除当前的EventListener,因为我使用的是阵列解决方案,所以现在它只会继续触发其他“Show More-”链接 这是我目前经常使用的函数,但我不觉得它会触发removeEventListener,因为我可以多次按下它。你可以在我的密码笔里看到 for (let i = 0; i < this.showMoreLinks.length; i++) {

我试图创建一个只触发一次的链接,这样我就可以将它更改为另一个EventListener。 当我按下“Show More”时,我希望删除当前的EventListener,因为我使用的是阵列解决方案,所以现在它只会继续触发其他“Show More-”链接

这是我目前经常使用的函数,但我不觉得它会触发removeEventListener,因为我可以多次按下它。你可以在我的密码笔里看到

for (let i = 0; i < this.showMoreLinks.length; i++)
{
    this.showMoreLinks[i].addEventListener("click", function handler(e) { 
        this.UpdateShowMore(i);
        e.currentTarget.removeEventListener(e.type, handler);
    }.bind(this));
}
for(设i=0;i
完整代码:


可能这甚至不是最明智的选择,因此任何其他代码建议也会受到重视。

我认为您的绑定函数实际上与您对
处理程序的定义不同,它返回一个已绑定到
this
的新函数,因此,
handler
s的定义保持不变,因此在尝试删除时找不到它。我建议使用arrow函数来避免在任何时候使用绑定。全部:

let handler = e => {
    this.UpdateShowMore(i);
    e.currentTarget.removeEventListener(e.type, handler);
}
this.showMoreLinks[i].addEventListener( "click", handler );
当然,这与在绑定之前进行绑定并将绑定结果存储到变量中是一样的:

let handler = function( e ){
    this.UpdateShowMore(i);
    e.currentTarget.removeEventListener(e.type, handler);
}.bind( this );
this.showMoreLinks[i].addEventListener( "click", handler );
来自MDN:

bind()方法创建一个新函数,调用该函数时,将其this关键字设置为提供的值,并在调用新函数时提供的任何参数之前提供一个给定的参数序列


因此,在将处理程序定义为
function handler(){}
之后,使用bind将返回一个不同于
handler
的匿名函数,并带有预设参数,然后用作事件侦听器。您希望取消此返回函数的链接,而不是原始函数的链接,因此需要将绑定结果存储在一个变量中以供以后使用。

我认为您的绑定函数实际上与
处理程序的定义不同,它返回一个已绑定到此
的新函数,因此,
handler
s的定义保持不变,因此在尝试删除时找不到它。我建议使用arrow函数来避免在任何时候使用绑定。全部:

let handler = e => {
    this.UpdateShowMore(i);
    e.currentTarget.removeEventListener(e.type, handler);
}
this.showMoreLinks[i].addEventListener( "click", handler );
当然,这与在绑定之前进行绑定并将绑定结果存储到变量中是一样的:

let handler = function( e ){
    this.UpdateShowMore(i);
    e.currentTarget.removeEventListener(e.type, handler);
}.bind( this );
this.showMoreLinks[i].addEventListener( "click", handler );
来自MDN:

bind()方法创建一个新函数,调用该函数时,将其this关键字设置为提供的值,并在调用新函数时提供的任何参数之前提供一个给定的参数序列


因此,在将处理程序定义为
function handler(){}
之后,使用bind将返回一个不同于
handler
的匿名函数,并带有预设参数,然后用作事件侦听器。您希望取消此返回函数的侦听,而不是原始函数,因此需要将绑定结果存储在变量中以供以后使用。

最佳解决方案是在事件上设置一个标志,使listner成为实时listner

请将JavaScript代码更新为:

this.showMoreLinks[i].addEventListener("click", function handler(e) { 
    this.UpdateShowMore(i);     
}.bind(this), {once : true});

您不必编写任何removeEventListner()。

最好的解决方案是在事件上设置一个标志,使listner成为实时listner

请将JavaScript代码更新为:

this.showMoreLinks[i].addEventListener("click", function handler(e) { 
    this.UpdateShowMore(i);     
}.bind(this), {once : true});

您不必编写任何removeEventListner()。

感谢您的快速回答。现在效果很好。谢谢你的快速回答。现在效果很好。自从我阅读了这篇文章的文档,我很高兴你提示我这么做,这非常有用。自从我阅读了这篇文章的文档,我很高兴你提示我这么做,这非常有用。