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

时间:2015-08-13 07:50:29

标签: javascript firefox firefox-addon firefox-addon-sdk

我正在使用选择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

如果有人可以建议一种方法来停止并在按钮上启动插件,那将会很棒。我会在哪里执行错误。

1 个答案:

答案 0 :(得分:3)

那是因为您可能会在Firefox Nightly上执行此代码,或者启用e10s。不幸的是,选择API还没有在e10上运行;所以事件被发出(至少对于文本框)但没有发现任何选择(你也可以尝试迭代它们,你会发现你没有选择)。因此,selection.textnull - 尝试自行记录 - 并且它不是传递给剪贴板API的有效值。

使用Firefox版本,尚未启用e10s,您的代码按预期工作。

修改

如上所述,null不是传递给cliboard 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);
      }
    }
});

我删除了数组'因为那里的逻辑似乎有问题,但我不知道你想要做什么;所以我更喜欢给你一个基本的简单例子来处理。

如果你真的想“清除”剪贴板,我建议你在删除监听器时将剪贴板设置为空字符串;但对我而言,它忽略了整个代码的重点。