我正在使用选择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 尚未在 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);
}
}
});
我删除了数组,因为对我来说逻辑似乎有问题,但我不知道你到底想做什么;所以我更愿意给你一个基本的简单示例来进行操作。
如果你真的想“清除”剪贴板,我建议你在删除监听器时将剪贴板设置为空字符串;但对我来说,它失去了整个代码的意义。
关于javascript - 如何在按钮单击时停止 Firefox 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982474/