如何在单击按钮时停止 firefox 插件?

How to stop the firefox addon on button click?

我正在使用选择 API 和剪贴板 API 将用户选择的数据直接复制到剪贴板。单击按钮时插件开始运行(调用 handleClick 函数)。但问题是,当我单击插件按钮以停止它时,会生成一个错误,提示 data should be string

var self = require('sdk/self');
var clipboard = require("sdk/clipboard");
var selection = require("sdk/selection");
var selected_text =[];
var result;
var flag = false ;
function myListener() {

    if (selection.text){
        selected_text= selected_text.concat(selection.text);
        result= selected_text.toString();
    }  
    clipboard.set(result);

}
function handleClick(state) {
        if (!flag){
            selection.on('select', myListener);
            flag= true;
        } else {
            clipboard.set(null);
        }
}
require("sdk/ui/button/action").ActionButton({
    id: "Selection",
    label: "Click to start saving your next selections to clipboard",
    icon: {
        "16": "./icon-16.png",
        "32": "./icon-32.png",
        "64": "./icon-64.png"
    },
    onClick: handleClick
});

确切的错误消息:

JPM undefined   Message: RequirementError: The option "data" must be one of the following types: string

如果有人能建议一种在按钮上停止和启动插件的方法,点击一下我在哪里执行错误,那就太好了。

那是因为您可能会在 Firefox Nightly 或启用 e10s 的情况下执行此代码。不幸的是,选择 API 还不适用于 e10s;所以事件被发出(至少,对于文本框)但是没有发现选择(你也可以尝试迭代它们,你会看到你没有选择)。因此,selection.textnull – 尝试自己记录 – 它不是传递到剪贴板的有效值 API.

使用 Firefox 版本,在没有启用 e10s 的情况下,您的代码可以正常工作。

编辑

如前所述,null 不是传递给剪贴板的有效值 API;这也意味着这一行:clipboard.set(null); 将引发异常。

我会简单地做类似的事情:

const clipboard = require("sdk/clipboard");
const selection = require("sdk/selection");

function onSelect() {
  if (selection.text) {
    clipboard.set(selection.text);
  }
}

require("sdk/ui/button/toggle").ToggleButton({
    id: "Selection",
    label: "Click to start saving your next selections to clipboard",
    icon: {
        "16": "./icon-16.png",
        "32": "./icon-32.png",
        "64": "./icon-64.png"
    },
    onChange(state) {
      if (state.checked) {
        selection.on("select", onSelect);
      } else {
        selection.off("select", onSelect);
      }
    }
});

我删除了数组,因为我觉得那里的逻辑有问题,但我不知道你到底想做什么;所以我更愿意为您提供一个基本的简单示例。

如果你真的想"clear"剪贴板,我建议你在删除监听器时将剪贴板设置为空字符串;但对我来说,它失去了整个代码的意义。