非常抱歉再次给您带来困惑。根据您的代码逻辑,您遍历了所有元素,并为每个元素添加了两个事件监听器。但是在删除事件监听器时,您只是在遍历元素,而没有指定要删除哪个具体的事件监听器。因此,`removeEventListener`方法无法正确删除事件监听器。
为了解决这个问题,您可以使用一种更可行的方法,即将事件处理程序作为参数传递给`showTagCode`函数,并在删除事件监听器时使用相同的参数来移除它们。以下是修改后的代码示例:
function showTagCode(boolean = true, handlerA, handlerB) {
const elements = document.body.getElementsByTagName("*");
if (boolean) {
for (let i = 0; i < elements.length; i++) {
const element = elements[i];
const a = function () {
element.title = element.outerHTML;
}
const b = function () {
element.title = "";
}
element.addEventListener("mouseover", a);
element.addEventListener("mouseout", b);
if (handlerA && handlerB) {
handlerA.push(a);
handlerB.push(b);
}
}
} else {
if (handlerA && handlerB) {
for (let i = 0; i < elements.length; i++) {
const element = elements[i];
const a = handlerA[i];
const b = handlerB[i];
element.removeEventListener("mouseover", a);
element.removeEventListener("mouseout", b);
}
// 清空处理程序数组
handlerA.length = 0;
handlerB.length = 0;
}
}
}
// 使用示例
let handlerA = []; // 存储mouseover事件处理程序的数组
let handlerB = []; // 存储mouseout事件处理程序的数组
showTagCode(true, handlerA, handlerB); // 添加事件监听器
showTagCode(false, handlerA, handlerB); // 删除事件监听器
在这个修正后的代码中,我们新增了两个参数`handlerA`和`handlerB`来传递事件处理程序的引用。在添加事件监听器时,我们将每个事件处理程序存储到对应的数组`handlerA`和`handlerB`中。而在删除事件监听器时,我们使用相同的数组来遍历元素并移除对应的事件监听器。
希望这次的回答能够解决您的问题。非常感谢您的耐心!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |