我正在使用选择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
如果有人可以建议一种方法来停止并在按钮上启动插件,那将会很棒。我会在哪里执行错误。
答案 0 :(得分:3)
那是因为您可能会在Firefox Nightly上执行此代码,或者启用e10s。不幸的是,选择API还没有在e10上运行;所以事件被发出(至少对于文本框)但没有发现任何选择(你也可以尝试迭代它们,你会发现你没有选择)。因此,selection.text
为null
- 尝试自行记录 - 并且它不是传递给剪贴板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);
}
}
});
我删除了数组'因为那里的逻辑似乎有问题,但我不知道你想要做什么;所以我更喜欢给你一个基本的简单例子来处理。
如果你真的想“清除”剪贴板,我建议你在删除监听器时将剪贴板设置为空字符串;但对我而言,它忽略了整个代码的重点。