如何在android webview上永久地突出显示文字?

时间:2017-01-16 06:45:03

标签: javascript android android-webview highlight

我正在做epub阅读器并在android webview中显示书。

目前我可以使用以下javascript突出显示文字

public static String Highlightscript = " <script language=\"javascript\">" +

        "function highlightSelection(){" +
        "var userSelection = window.getSelection();" + 
        "for(var i = 0; i < userSelection.rangeCount; i++)"
        + "  highlightRange(userSelection.getRangeAt(i));" +
         "}" +
        "function highlightRange(range){"+
        "span = document.createElement(\"span\");"+
        "span.appendChild(range.extractContents());"+
        "span.setAttribute(\"style\",\"display:block;background:#ffc570;\");"+
        "range.insertNode(span);}"+
        "</script> ";

当用户点击突出显示时我做

webView.loadUrl("javascript:highlightSelection()");

这突出了文本,我还将突出显示的文本保存在本地数据库中

但是当用户重新打开图书时,我想显示之前突出显示的文字。我怎样才能实现这一目标?

我试图在用户进入页面(默认情况下突出显示文本)

时找到文本
webView.findAllAsync(highlightedText);

但如果突出显示的文字太小,就像单词&#34;&#34; ,将突出很多单词。

我已搜索过SO,但所有问题均未得到答复Question 1Question 2

有没有其他方法可以实现这个目标?

1 个答案:

答案 0 :(得分:0)

从根本上说,您必须知道要突出显示的Web视图的哪个部分。您只能通过存储突出显示的文本(如您所见)来了解这一点。唯一的方法是使用存储高亮显示位置的某些版本。

您的答案出现在您首先突出显示文字的代码中。

highlightRange(userSelection.getRangeAt(i));

存储Range对象的信息。然后,您需要在加载页面时加载此信息。相当于Highlightscript功能,但使用您保存的范围信息。

添加详细信息以回应评论

查找Range接口(https://developer.mozilla.org/en-US/docs/Web/API/Range)。

首次突出显示范围时,可以提取起始节点和偏移量以及结束节点和偏移量信息。将其存储在您的数据库中。 (如何执行此操作取决于您使用的数据库。)

访问该页面时检索相应的信息。使用document.createRange()Range()构造函数创建Range对象。填写您保存的开始和结束信息。

在您构建的Range对象上调用highlightRange()