2017-01-16 125 views
4

我正在做Epub阅读器,并显示在android webview中的书。如何在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); 

进入页面(默认情况下凸显文本)查找的文字,但如果高亮文本太小像单词“the”,很多话会强调。

我已经搜查左右,但所有的问题都没有答案Question 1Question 2

那么,有没有任何其他的方式来实现这一目标?

回答

0

基本上你必须知道你想突出显示哪个部分的webview。您只需储存突出显示的文字即可知道这一点(如您所见)。要做到这一点的唯一方法就是存储某个版本的高亮位置。

您的答案在您为了突出显示文本而展示的代码中。从Range对象

highlightRange(userSelection.getRangeAt(i));

存储信息。加载页面时,您需要加载这些信息。做相当于您的Highlightscript功能,但与您保存的范围信息。响应

添加详细评论

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

当您第一次突出显示范围时,可以提取开始节点和偏移量,并结束节点和偏移量信息。将其存储在数据库中。 (你如何做,取决于你正在使用的数据库。)

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

+0

不值得赏金,但仍然奖励,因为我不想浪费它 – Redman

+0

你觉得从答案中缺少什么? – Hod

+0

1.如何保存位置 2.即使我保存了某种位置,如何重新放置该位置/范围 – Redman