在Firefox扩展中更改找到的文本突出显示

时间:2014-12-25 17:01:11

标签: firefox-addon

我正在开发Firefox的扩展程序,用于搜索页面中的术语。我想更改找到的文字高亮颜色和背景。例如,我搜索一个字母“s”,默认情况下,它选择了一个带有白色文本颜色的蓝色矩形。所以我想将蓝色变为红色。 我怎么能通过JS做到这一点?

Edit0:

要选择找到的文字,请使用document.createRange()selection.addRange()方法 我不知道默认查找器如何选择找到的术语并将背景应用于它 所以也许'范围'方法不是最好的。
但我想我正在寻找突出这个创造范围的方法......

EDIT1

现在我已经部分地解决了变色的问题。在找到并选择文本时,只需添加带有::-moz-selection和红色背景的CSS规则。然后对于文档'onmousedown',我删除此规则,不要将默认选择保留为红色。

但是一个新问题是当我找到一个数字并且它得到一个选择时,该选择的背景是灰色的(所以它看起来像一个非活动窗口的文本选择)。然后当我用鼠标在文档文本中的某处单击并按F3时,扩展名找到下一个数字并选择红色背景。接下来的研究结果合适(红色背景)。

所以我的目的是将初始灰色背景改为红色 也许我应该改变不活动的选择颜色......

EDIT2:

现在我更新了我的JS代码:

var selection=w.getSelection()
var range=w.document.createRange()
range.setStart(foundNode,foundOffset)
range.setEnd(foundNode,foundOffset+foundLength)
selection.removeAllRanges()
selection.addRange(range)

var controller=gBrowser.docShell.QueryInterface(Ci.nsIInterfaceRequestor)
               .getInterface(Ci.nsISelectionDisplay)
               .QueryInterface(Ci.nsISelectionController);

controller.setDisplaySelection(controller.SELECTION_ATTENTION)
controller.repaintSelection(controller.SELECTION_NORMAL)

感谢Noitidart的回答,我找到了一些有关如何使用nsISelectionController XPCOM界面选择带背景的文本的信息。我仍然无法为此背景设置自定义颜色,因此它与Firefox中找到的文本的默认颜色不同。但是,将ui.textSelectBackgroundAttention中的about:config首选项设置为所需的颜色将适用于我的扩展程序和默认查找引擎。

我发现SELECTION_ATTENTION常量负责该背景颜色,setDisplaySelection方法将颜色链接到所选文本。但我找不到这种方法的任何实现。我只看到nsISelectionController idl文件及其结构,但没有相应的.cpp或.js文件实现此.idl。所以我没有关于如何设置颜色的信息。

EDIT3:

最近我在扩展程序中添加了“突出显示全部”功能。关于这个亮点的颜色的一个新问题已经上升。使用上面的tecnique将显示所有匹配绿色查找颜色(默认情况下)。但是使用不同的颜色来区分当前的匹配和其他颜色会更舒服。

所以我找不到另一个有用的nsISelectionController常量,用于“突出显示全部”选项。我只是将此选项设置为“已禁用”类型并更改了ui.textSelectBackgroundDisabled about:config首选项。此pref显然是针对非活动窗口的选定文本背景。它对我有用。

controller.setDisplaySelection(controller.SELECTION_DISABLED)

另一件事是我不确定上一个编辑中的controller.repaintSelection()是否必要。我想当我开始用这些东西进行实验时,选择没有它。但现在我删除了那条线,但仍然有效。

加:

如果有人需要,还有一些额外的链接:

  

我还使用了Firefox源档案中的一些文件:Firefox 33 Source

 - nsISelectionController.idl          [\content\base\public\]
 - nsTypeAheadFind.cpp                 [\toolkit\components\typeaheadfind\]
 - Finder.jsm                          [\toolkit\modules\]
 - findbar.xml                         [\toolkit\content\widgets\]

1 个答案:

答案 0 :(得分:1)

我通过电子邮件将这个问题问到了水银,这就是他告诉我的:

  

您可能会发现这个有用:https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsISelectionController

     实际上,我不是你认为我的主人。 :)要更改这些颜色,我只需更改首选项的值:

     

ui.textHighlightBackground

     

ui.textHighlightForeground

     

ui.textSelectBackgroundAttention - > SELECTION_ATTENTION,它不是一个亮点,它是一个正常的选择(因为你会用你的鼠标选择一些文本,它会转动常规的蓝色黑色,至少在窗口中)但是它给了“注意”,所以它有查找操作报告的绿色背景。基本上它是一种向用户显示“我在这里!!”的方式在firefox自动选择他搜索的文本之后。

     

而且我真的不知道大部分内容,SELECTION_NORMAL用于正常文本选择,就像用鼠标选择文本时一样,SELECTION_FIND用于高亮,我只知道ON / HIDDEN / OFF / DISABLED那些不言自明的。当您在可编辑的内容节点中输入时,SELECTION_SPELLCHECK可能用于自动更正,但我只是猜测名称中的那个。

     

另外,据我所知,不可能只创建自定义选择范围/内容,因为代码在没有编辑C ++代码的情况下根本无法识别它们。这实际上是我尚未实施https://github.com/Quicksaver/FindBar-Tweak/issues/76的原因之一。