【问题标题】:Listener keeps executing in false if statement侦听器一直在错误的 if 语句中执行
【发布时间】:2022-01-25 21:05:01
【问题描述】:

我正在编写一个 Chrome 扩展程序,它有一个内容脚本,可以对 seclectionchange 事件执行某些操作,但希望这些操作仅在用户在扩展程序设置中启用它们时才执行。

这是我的代码:

const readOption = async(key) => {
  return new Promise((resolve, reject) => {
    chrome.storage.sync.get([key], function(result) {
      if (result[key] === undefined) {
        reject();
      } else {
        resolve(result[key]);
      }
    });
  });
};

async function myAsyncFunction() {
  let checkVariable = await readOption('mykey');

  if (checkVariable === true) {

    document.addEventListener('selectionchange', function(e) {
      // Doing stuff
    }, false);
  }
}

myAsyncFunction();

chrome.storage.onChanged.addListener((changes, area) => {
  if (area === 'sync' && changes.mykey) {
    myAsyncFunction();
  }
});

这就是问题所在。当我通过设置断点将变量从 true 更改为 false 时,if (checkVariable === true) 被 onChanged 侦听器触发执行,然后它的主体被跳过,因为变量为 false。

但之后selectionchange 就像不在 if 语句中一样执行。我必须重新加载页面以防止其执行。

我该如何解决这个问题?我想只有在 mykey 设置为 false 时才删除 onchanged 监听器中的 selectionchange 监听器,但我该怎么做呢?

【问题讨论】:

    标签: javascript google-chrome google-chrome-extension add-on


    【解决方案1】:

    当您在未指定 {once: true} 的情况下注册事件侦听器时,它将在此页面中永远处于活动状态,直到您使用具有相同函数引用的 removeEventListener 显式取消注册它。为确保相同,您可以简单地将函数移动到将持久的外部范围:

    async function myAsyncFunction() {
      let checkVariable = await readOption('mykey');
      let onoff = `${checkVariable ? 'add' : 'remove'}EventListener`;
      document[onoff]('selectionchange', onSelChange);
    }
    
    function onSelChange(e) {
      // Doing stuff
    }
    

    【讨论】:

    • 是否应该将selectionchange 侦听器中的false 更改为{once: true} 以使我的代码按原样工作?因为当我尝试它时,selectionchange 监听器永远不会执行它的操作。
    • 使用once,当用户进行其他选择时,它将不起作用。至于你的新问题,我猜你没有重新加载 chrome://extensions 页面上的扩展和网页的标签。答案中的代码是正确的,当变量为真时,它与您当前的代码执行相同的操作。
    • 不,不!您的解决方案工作正常。一百万谢谢,因为我在循环中移动!我说的是{once: true} 声明。这应该使我的初始代码在没有其他更改的情况下工作吗?因为我试过了,没用。
    • 使用once,当用户进行其他选择时,它将不起作用。
    • 我收到async function myAsyncFunction() 的错误:未捕获(承诺)未定义。浏览器会突出显示最后一个},但我想这并没有什么特别的意义。该错误仅在我第一次安装附加组件时发生,如果我每次加载页面时都使用默认设置,但如果我在设置中按保存它会停止。我虽然设置变量的初始化存在问题。按照谷歌文档的例子,我使用document.addEventListener('DOMContentLoaded', restore_options);。我还尝试了onInstalled 的监听器,但没有变化。
    猜你喜欢
    • 2014-03-01
    • 2023-04-04
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多