【问题标题】:How to stop the firefox addon on button click?如何在按钮单击时停止 firefox 插件?
【发布时间】:2015-08-13 18:37:14
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    那是因为您很可能在 Firefox Nightly 上执行此代码,或者启用了 e10s。不幸的是,选择 API 尚未在 e10s 上运行;所以事件被发出(至少对于文本框)但没有发现选择(你也可以尝试迭代它们,你会看到你没有选择)。因此,selection.textnull - 尝试自己记录 - 并且它不是传递给剪贴板 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);
          }
        }
    });
    

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

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

    【讨论】:

    • 在稳定版上也遇到这个问题。
    • 这意味着您在稳定版本上也启用了e10s;请记住,jpm 可以默认启用它。运行插件后,检查是否启用了 e10s(转到 about:preferences,有一个复选框)。
    • 如前所述,您使用的模块 (selection) 尚未在 e10s 上运行。准确的说,e10s 是 content 处理和 chrome 处理不同的特性。这意味着他们不能像以前那样“说话”。简而言之,使用selection 模块,如果您处于“e10s”模式,则无法获得选择,因为您的代码处于 chrome 进程中,而选择发生在内容进程中。目前 e10s 还没有正式发布,所以你的插件适用于任何“稳定的”firefox。该模块应在 e10s 发布之前修复或添加其他模块。
    • 好友如你所说“目前 e10s 还没有正式发布,所以你的插件适用于任何“稳定”的 firefox。我想问我如何关闭选择? e10s 是什么??
    • 我没有注意到您有clipboard.set(null);,这也会引发异常,因为正如我在第一个回复中所写的,您不能将null 设置为剪贴板值。我会更新的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2011-08-19
    • 2022-11-21
    • 2012-10-17
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多