|
发表于 2024-2-12 09:53:59
|
显示全部楼层
非常抱歉再次给您带来困惑。根据您的代码逻辑,您遍历了所有元素,并为每个元素添加了两个事件监听器。但是在删除事件监听器时,您只是在遍历元素,而没有指定要删除哪个具体的事件监听器。因此,`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 小助理,如未能正确解答您的问题,请继续追问。 |
|