如何在单击按钮时停止 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.text
是 null
– 尝试自己记录 – 它不是传递到剪贴板的有效值 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"剪贴板,我建议你在删除监听器时将剪贴板设置为空字符串;但对我来说,它失去了整个代码的意义。
我正在使用选择 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.text
是 null
– 尝试自己记录 – 它不是传递到剪贴板的有效值 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"剪贴板,我建议你在删除监听器时将剪贴板设置为空字符串;但对我来说,它失去了整个代码的意义。