gpt4 book ai didi

javascript - 在对象内部管理 addEventListener() 和 removeEventListener()

转载 作者:行者123 更新时间:2023-11-30 13:41:16 24 4
gpt4 key购买 nike

我在 javascript 中有一个伪类,它有一个方法可以添加和删除两个按钮的监听器。这是代码:

function FirstObj(secondObj){
this.loginButton = document.getElementById("login");
this.logoutButton = document.getElementById("logout");
this.secondObj = secondObj
}

FirstObj.prototype = {
manageListeners : function(state){ //state is a boolean
var self = this;
if (state) {
display += "none";
this.loginButton.addEventListener("click", function(){
self.seconfObj.makeSomething();
}, false);
this.logoutButton.removeEventListener("click", /*???*/ , false);
}
else {
this.logoutButton.addEventListener("click", function(){
self.logout();
}, false);
this.loginButton.removeEventListener("click", /*???*/ , false);
}
},
logout : function(){
//logout...
}
}

问题是:我如何修改此代码以正确管理事件监听器?

最佳答案

我不认为您可以删除匿名函数的事件监听器。改用命名函数:

var myEventListener = function() {
console.log("Hello World!");
};

myElement.addEventListener("click", myEventListener, false);
myElement.removeEventListener("click", myEventListener, false);

这里是你的类的一个稍微修改的版本,它应该正确地管理事件监听器:

function FirstObj(secondObj){

var self = this;

this.loginButton = document.getElementById("login");
this.logoutButton = document.getElementById("logout");
this.secondObj = secondObj;

this.loginButtonClicked = function(){
self.secondObj.makeSomething();
};

this.logoutButtonClicked = function(){
self.logout();
};

}

FirstObj.prototype = {

manageListeners : function(state){

if (state) {
display += "none";
this.loginButton.addEventListener("click", this.loginButtonClicked, false);
this.logoutButton.removeEventListener("click", this.logoutButtonClicked, false);
}
else {
this.logoutButton.addEventListener("click", this.logoutButtonClicked, false);
this.loginButton.removeEventListener("click", this.loginButtonClicked, false);
}

},

logout : function(){
// Log out...
}

};

但是,如果您重写类以利用闭包,则可以将其简化为:

function FirstObj(secondObj){

var self = this;

var loginButton = document.getElementById("login");
var logoutButton = document.getElementById("logout");

var loginButtonClicked = function(){
secondObj.makeSomething();
};

var logoutButtonClicked = function(){
self.logout();
};

this.manageListeners = function(state){

if (state) {
display += "none";
loginButton.addEventListener("click", loginButtonClicked, false);
logoutButton.removeEventListener("click", logoutButtonClicked, false);
}
else {
logoutButton.addEventListener("click", logoutButtonClicked, false);
loginButton.removeEventListener("click", loginButtonClicked, false);
}

};

this.logout = function(){
// Log out...
};

}

这里我假设不需要从类外部访问 loginButtonlogoutButtonsecondObj。如果他们这样做,只需将它们设为 FirstObj 的属性并更新引用它们的代码(在范围内使用 this,在范围外使用 self)。

关于javascript - 在对象内部管理 addEventListener() 和 removeEventListener(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2170112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com