javascript - 每次页面刷新后事件监听器都会复合

标签 javascript contextmenu event-listener clicklistener

所以我使用本教程为一些图表构建了自定义右键菜单:https://www.sitepoint.com/building-custom-right-click-context-menu-javascript/

它工作得很好,但我对听众有一个问题。具体来说,当调用 contextListeners 和 clickListeners 函数时,在页面加载时添加事件监听器。但是,在我的应用程序中,我有一个按钮可以重新绘制这些图形并重新加载自定义右键单击菜单所附加的页面,并且每次都会创建新的监听器。因此,如果我加载两个不同的图表,与右键单击菜单关联的函数将被调用两次,如果我加载三次,则调用三次。这是不断被调用并不断添加监听器的函数

function contextListener() {
                        document.addEventListener("contextmenu", function(e) {
                            taskItemInContext = clickInsideElement(e, taskItemClassName);
                            if (taskItemInContext) {
                                e.preventDefault();
                                toggleMenuOn();
                                positionMenu(e);
                            } else {
                                taskItemInContext = null;
                                toggleMenuOff();
                            }
                        });
                    }

在后来的函数中我尝试过:

document.removeEventListener("contextmenu", function(e) {
                            console.log("removed");
                        });

但这似乎并不能解决问题。

最佳答案

我不太明白你的问题,但你可以试试这个:

function contextListener() {
                if(!document.handAddcontext){
                    document.handAddcontext = true
                    document.addEventListener("contextmenu", function(e) {
                        taskItemInContext = clickInsideElement(e, taskItemClassName);
                        if (taskItemInContext) {
                            e.preventDefault();
                            toggleMenuOn();
                            positionMenu(e);
                        } else {
                            taskItemInContext = null;
                            toggleMenuOff();
                        }
                    });
                }

                }

关于javascript - 每次页面刷新后事件监听器都会复合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38463322/

相关文章:

javascript - css 仅附加到第一个面板

android - Android 上下文菜单创建中的 getMenuInflater() 方法未定义问题

java - SWT:如何为文本字段重新创建默认上下文菜单

javascript - 在扩展 EventEmitter 的 ES6 类定义中设置事件监听器

javascript - switch 语句 default 总是显示 default

javascript - HTML5 Canvas + JS 库中的选择/拖放功能?

javascript - 如何将串联的 jQuery 形成的 html 分配给变量?

javascript - Jquery 将上下文菜单绑定(bind)到动态元素 id

javascript - 存储事件监听器不在当前窗口上执行

javascript addEventListener - 垃圾收集