我正在用SWT浏览器小部件开发一个小型应用程序。我正在使用突出显示搜索文本单词
<a id="xyz" href=''><mark>test</mark></a>
在HTML文档中。并以这种方式替换HTML文本中的所有搜索词,这样我们就可以突出显示所有搜索词。
htmltext.replaceAll("(?i)"+Pattern.quote(searchword), "\<a id='xyz' href=''> <mark>$0\</mark></a>
我想实现这样的功能:如果我点击下一个按钮,下一个突出显示的单词应该得到焦点,如果我点击上一个按钮上一个突出的文本应该得到焦点。如何在Eclipse RCP应用程序中使用Javascript完成Next和Previous Hit。
最好通过将JavaScript与Java代码相结合来解决此问题。这取决于你要处理什么样的HTML内容,它是有状态的(例如,不能重新加载)、有很多JS代码的动态的,还是纯静态的。在大多数情况下,最好的解决方案包括用JS编写的大部分逻辑,以及用Java将JS操作绑定到SWT GUI的最小代码。
您需要实现以下几点:
- 关键字搜索
- 切换高亮显示
- 将高亮显示从一个单词切换到另一个单词
1.搜索:您意识到您将无法搜索跨越许多HTML元素的单词,如W<span>o</span>rd
?如果可以,那么您可以像现在一样从Java中搜索和替换。我会用id:<span id="match1">
单独标记每个单词匹配,并记住总共找到了多少个匹配。
您也可以在JS端进行这样的搜索,方法是添加一个函数,该函数遍历DOM并搜索特定文本,然后用另一个DOM对象包装它。
2.切换高亮显示:最好使用JavaScript。将切换DOM元素样式的JS代码片段附加到HTML中。类似于:`
function highlight(id) {
document.getElementById(id).className = 'highlighted'
}
您可以通过调用swtBrowser.execute("highlight('match1')")
从SWT调用此JS此外,您应该实现取消突出显示的功能。
3.在元素之间切换高亮显示:这既可以在Java端完成,也可以在JS端完成。我可能会使用JS,再添加两个函数:highlightNext()
和highlightPrev()
,它们只会用适当的id调用highlight()
函数。然后在Java中,您可以制作SWT按钮,通过SWTBrowser.execute().