如何使用Firefox Add-On SDK获取所选文本?

时间:2011-12-23 22:07:23

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

我正在尝试使用在线Add-On SDK创建一个Firefox插件。

我从一些简单的东西开始 - 我想添加一个工具栏按钮,用于读取当前选定的文本。

documentation for the Selection对象使这看起来很简单:

var selection = require("selection");
if (selection.text)
  console.log(selection.text);

这对我来说似乎没有用,我只是得到null

这是我的完整代码:

var selection = require("selection");

require("widget").Widget({
    id: "widgetID1",
    label: "Test Mozilla Widget",
    contentURL: "http://www.mozilla.org/favicon.ico",
    onClick: function(event) {
        console.log('selection.text = ' + selection.text);
    }
});

我也尝试在selection内创建onClick对象,效果相同。
我可以使用select事件来获得有关新选择的通知,所以我想我可以使用它来代替(并保留值),但我想知道为什么上面的代码不起作用...什么是我做错了吗?

2 个答案:

答案 0 :(得分:8)

定义的selection变量只有选中的文本才会有焦点。单击窗口小部件图标会使焦点远离所选文本,因此它不会选择任何文本。

这就是在侦听器函数中使用它时的原因。

为了确认这一点,我尝试在按下工具栏按钮时使用toolbarbutton module)记录其值,并且它可以正常工作。按下工具栏按钮(大概)不会窃取焦点。

以下是代码and you can test it online too

var selection = require("selection");

var tbb = require("toolbarbutton").ToolbarButton({
    id: "test",
    label: "test",
    image: "http://www.mozilla.org/favicon.ico",
    onCommand: function(event) {
      console.log('selection = ' + JSON.stringify(selection)); // works!
    }
});

答案 1 :(得分:2)

以下是使用select事件的解决方案:

var selection = require("selection");

var selectedText = '';

function selectionChanged(event){
    //todo: check for selection.isContiguous
    selectedText = selection.text;
}

selection.on('select', selectionChanged);

require("widget").Widget({
    id: "widgetID1",
    label: "Test Mozilla Widget",
    contentURL: "http://www.mozilla.org/favicon.ico",
    onClick: function(event) {
        console.log('Selection: ' + selectedText);
    }
});