我正在做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 1和Question 2
有没有其他方法可以实现这个目标?
答案 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()
。