javascript - 如何在按钮单击时停止 Firefox 插件?

标签 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

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

最佳答案

这是因为您可能会在 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);
      }
    }
});

我删除了数组,因为对我来说逻辑似乎有问题,但我不知道你到底想做什么;所以我更愿意给你一个基本的简单示例来进行操作。

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

关于javascript - 如何在按钮单击时停止 Firefox 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31982474/

相关文章:

javascript - Android CloudRail 品牌网站失败 - "Unexpected token )"(community.js 第 18 行)

javascript - 在没有可用标识符的情况下将所有具有特定 textContent 的 <a> 元素作为目标

css - 为什么我的整个站点在 Firefox 中变小了一点点?

php - JavaScript 菜单在 Chrome 中行为异常

firefox-addon - 为什么包裹在 firefox 插件中的用户脚本会比 greasemonkey 中的相同脚本慢?

javascript - 在 JavaScript 中获取特定于平台的换行符?

javascript - Firefox 扩展 (SDK) 中的内容脚本添加事件监听器

javascript - Fb Like 按钮 + <http ://www. facebook.com> 获取属性 Proxy.InstallTrigger 的权限被拒绝

javascript - Twitter Bootstrap JS 警报上的自动关闭功能

CSS ajax 新跨度未在 Internet Explorer 10 中更新