我正在开发Firefox的扩展程序,用于搜索页面中的术语。我想更改找到的文字高亮颜色和背景。例如,我搜索一个字母“s”,默认情况下,它选择了一个带有白色文本颜色的蓝色矩形。所以我想将蓝色变为红色。
我怎么能通过JS做到这一点?
要选择找到的文字,请使用document.createRange()
和selection.addRange()
方法
我不知道默认查找器如何选择找到的术语并将背景应用于它
所以也许'范围'方法不是最好的。
但我想我正在寻找突出这个创造范围的方法......
现在我已经部分地解决了变色的问题。在找到并选择文本时,只需添加带有::-moz-selection
和红色背景的CSS规则。然后对于文档'onmousedown',我删除此规则,不要将默认选择保留为红色。
但是一个新问题是当我找到一个数字并且它得到一个选择时,该选择的背景是灰色的(所以它看起来像一个非活动窗口的文本选择)。然后当我用鼠标在文档文本中的某处单击并按F3时,扩展名找到下一个数字并选择红色背景。接下来的研究结果合适(红色背景)。
所以我的目的是将初始灰色背景改为红色
也许我应该改变不活动的选择颜色......
现在我更新了我的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。所以我没有关于如何设置颜色的信息。
最近我在扩展程序中添加了“突出显示全部”功能。关于这个亮点的颜色的一个新问题已经上升。使用上面的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\]
答案 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的原因之一。