防止JavaScript事件侦听器同时触发多次(在Google Chrome扩展中)

防止JavaScript事件侦听器同时触发多次(在Google Chrome扩展中),javascript,google-chrome,contextmenu,bookmarks,Javascript,Google Chrome,Contextmenu,Bookmarks,我已经设置了一个GoogleChrome扩展,可以创建用户书签的上下文菜单。由于ContextMenus API必须通过后台页面实现,因此我添加了以下事件侦听器,以在用户书签中发生任何更改时更新上下文菜单: chrome.bookmarks.onChildrenReordered.addListener(function () { chrome.contextMenus.removeAll(); contextMenu() }); chrome.bookmarks.onMove

我已经设置了一个GoogleChrome扩展,可以创建用户书签的上下文菜单。由于ContextMenus API必须通过后台页面实现,因此我添加了以下事件侦听器,以在用户书签中发生任何更改时更新上下文菜单:

chrome.bookmarks.onChildrenReordered.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onMoved.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onCreated.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onRemoved.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});

chrome.bookmarks.onImportEnded.addListener(function () {
    chrome.contextMenus.removeAll();
    contextMenu()
});
这在很大程度上是可行的,但我遇到了一个我无法解决如何杀死的bug。也就是说,如果我同时更改多个书签,例如,通过在书签管理器中选择多个项目并重新排列它们,脚本将同时触发多次,最后我将得到上下文菜单的多个实例


有人能就如何解决这一问题提供一些建议吗?

我以前从未使用过chrome扩展,但如果你想防止事情同时发生,通常可以这样做:

有一个名为lastEventTime的变量 每次事件发生时,用当前时间戳更新变量 每次事件发生时,检查当前时间是否为存储时间后的2秒。如果没有,则返回;。 这应确保在第一个事件发生后不到两秒钟内发生的任何事件都将被忽略


我不确定这是否能解决你的问题,但我希望它能为你指明正确的方向

我以前从未使用过chrome扩展,但是如果你想防止事情同时发生,你通常可以这样做:

有一个名为lastEventTime的变量 每次事件发生时,用当前时间戳更新变量 每次事件发生时,检查当前时间是否为存储时间后的2秒。如果没有,则返回;。 这应确保在第一个事件发生后不到两秒钟内发生的任何事件都将被忽略


我不确定这是否能解决你的问题,但我希望它能为你指明正确的方向

您可以保留一个全局布尔值并用它包装每个事件处理程序:

var lock = false;

chrome.bookmarks.onMoved.addListener(function () {
    if(!lock) {
        lock = true;
        chrome.contextMenus.removeAll();
        contextMenu();
        lock = false;
    }
});

对所有处理程序执行相同的操作。我不知道chrome如何处理线程,因此在完成第一次分配之前,仍然有可能有多个线程通过if测试,特别是在多核处理器上。

您可以保留一个全局布尔值,并用它包装每个事件处理程序:

var lock = false;

chrome.bookmarks.onMoved.addListener(function () {
    if(!lock) {
        lock = true;
        chrome.contextMenus.removeAll();
        contextMenu();
        lock = false;
    }
});
对所有处理程序执行相同的操作。我不知道chrome是如何处理线程的,所以在第一次分配完成之前,仍然有可能有多个线程通过if测试,特别是多核处理器