在 Android WebView 中突出显示特定单词,通常是通过 JavaScript 操作 DOM 来实现的。WebView 提供了 evaluateJavascript()
方法,允许我们在原生代码中执行 JavaScript 代码来修改网页内容。
// 在 WebView 加载完成后调用此方法
private void highlightText(WebView webView, String searchText) {
String javascriptCode =
"(function() {" +
" var searchText = '" + searchText + "';" +
" var regex = new RegExp(searchText, 'gi');" +
" var elements = document.getElementsByTagName('*');" +
" for (var i = 0; i < elements.length; i++) {" +
" var element = elements[i];" +
" for (var j = 0; j < element.childNodes.length; j++) {" +
" var node = element.childNodes[j];" +
" if (node.nodeType === 3) {" + // 文本节点
" var text = node.nodeValue;" +
" var replacedText = text.replace(regex, function(match) {" +
" return '<span style=\"background-color: yellow;\">' + match + '</span>';" +
" });" +
" if (replacedText !== text) {" +
" var newNode = document.createElement('span');" +
" newNode.innerHTML = replacedText;" +
" element.replaceChild(newNode, node);" +
" }" +
" }" +
" }" +
" }" +
"})();";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript(javascriptCode, null);
} else {
webView.loadUrl("javascript:" + javascriptCode);
}
}
private void highlightTextEfficient(WebView webView, String searchText) {
String javascriptCode =
"(function() {" +
" var searchText = '" + searchText + "';" +
" var regex = new RegExp(searchText, 'gi');" +
" var treeWalker = document.createTreeWalker(" +
" document.body, " +
" NodeFilter.SHOW_TEXT, " +
" { acceptNode: function(node) { " +
" return regex.test(node.nodeValue) ? " +
" NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP; " +
" }}, " +
" false" +
" );" +
" var textNodes = [];" +
" while(treeWalker.nextNode()) {" +
" textNodes.push(treeWalker.currentNode);" +
" }" +
" for (var i = 0; i < textNodes.length; i++) {" +
" var node = textNodes[i];" +
" var parent = node.parentNode;" +
" var text = node.nodeValue;" +
" var replacedText = text.replace(regex, function(match) {" +
" return '<span class=\"highlight\" style=\"background-color: yellow;\">' + match + '</span>';" +
" });" +
" var newNode = document.createElement('span');" +
" newNode.innerHTML = replacedText;" +
" parent.replaceChild(newNode, node);" +
" }" +
"})();";
webView.evaluateJavascript(javascriptCode, null);
}
private void clearHighlights(WebView webView) {
String javascriptCode =
"(function() {" +
" var highlights = document.getElementsByClassName('highlight');" +
" while (highlights.length > 0) {" +
" var highlight = highlights[0];" +
" var parent = highlight.parentNode;" +
" parent.replaceChild(document.createTextNode(highlight.textContent), highlight);" +
" parent.normalize();" +
" }" +
"})();";
webView.evaluateJavascript(javascriptCode, null);
}
问题原因:当页面内容很多时,遍历所有DOM节点会导致性能下降。
解决方案:
问题原因:高亮样式可能被页面原有CSS覆盖。
解决方案:
问题原因:搜索文本包含特殊字符可能导致正则表达式错误。
解决方案:
// 在Java端对搜索文本进行转义
String escapedSearchText = searchText.replaceAll("([\\\\\\.\\[\\{\\(\\*\\+\\?\\^\\$\\|])", "\\\\$1");
问题原因:页面动态加载内容后,高亮不会自动应用。
解决方案:
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
// 重新应用高亮
}
});
});
observer.observe(document.body, { childList: true, subtree: true });
通过以上方法,您可以在Android WebView中有效地实现关键词高亮功能,并根据实际需求进行调整和优化。
没有搜到相关的文章