在webview页面中使用swift查找文本?

我怎样才能在uiwebview页面中find文本,并突出显示它,并使用swift在页面中的位置?

例如chrome查找文本:

search范例

但是我使用alert视图:

我的search例子在我的应用程序!

这里是swift代码:

1)将UIWebViewSearch.js文件添加到您的项目

func highlightAllOccurencesOfString(str:String) -> Int { let path = Bundle.main.path(forResource: "UIWebViewSearch", ofType: "js") var jsCode = "" do{ jsCode = try String(contentsOfFile: path!) }catch { // do something } self.newsWebView.stringByEvaluatingJavaScript(from: jsCode) let startSearch = "uiWebview_HighlightAllOccurencesOfString('\(str)')" self.newsWebView .stringByEvaluatingJavaScript(from: startSearch) let result = self.newsWebView.stringByEvaluatingJavaScript(from: "uiWebview_SearchResultCount") return Int(result!)! } func scrollTo(index:Int) { self.newsWebView.stringByEvaluatingJavaScript(from: "uiWebview_ScrollTo('\(index)')") } func removeAllHighlights() { self.newsWebView.stringByEvaluatingJavaScript(from: "uiWebview_RemoveAllHighlights()") } 

你必须为此使用JavaScript。
我用下面的代码做了同样的事情(但是在Objective C中 – 你可以把它改写成Swift)。

用法(仅在webViewDidFinishLoad中 – 这很重要!):

 -(void)webViewDidFinishLoad:(UIWebView *)webView { if (self.searchString != nil ) { [self.webView highlightAllOccurencesOfString:self.searchString]; int position = self.foundedStringsCount - self.selectedStringNumber - 1; [self.webView scrollTo:position]; } } 

创build并添加这个文件到你的代码:

SearchWebView.h:

 #import <Foundation/Foundation.h> @interface SearchWebView : UIWebView - (NSInteger)highlightAllOccurencesOfString:(NSString*)str; - (void)scrollTo:(int)index; - (void)removeAllHighlights; @end 

SearchWebView.m:

 #import "SearchWebView.h" @implementation SearchWebView - (NSInteger)highlightAllOccurencesOfString:(NSString*)str { NSString *path = [[NSBundle mainBundle] pathForResource:@"UIWebViewSearch" ofType:@"js"]; NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; [self stringByEvaluatingJavaScriptFromString:jsCode]; NSString *startSearch = [NSString stringWithFormat:@"uiWebview_HighlightAllOccurencesOfString('%@')",str]; [self stringByEvaluatingJavaScriptFromString:startSearch]; NSString *result = [self stringByEvaluatingJavaScriptFromString:@"uiWebview_SearchResultCount"]; return [result integerValue]; } - (void)scrollTo:(int)index { [self stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"uiWebview_ScrollTo('%d')",index]]; } - (void)removeAllHighlights { [self stringByEvaluatingJavaScriptFromString:@"uiWebview_RemoveAllHighlights()"]; } @end 

UIWebViewSearch.js:

 var uiWebview_SearchResultCount = 0; /*! @method uiWebview_HighlightAllOccurencesOfStringForElement @abstract // helper function, recursively searches in elements and their child nodes @discussion // helper function, recursively searches in elements and their child nodes element - HTML elements keyword - string to search */ function uiWebview_HighlightAllOccurencesOfStringForElement(element,keyword) { if (element) { if (element.nodeType == 3) { // Text node var count = 0; var elementTmp = element; while (true) { var value = elementTmp.nodeValue; // Search for keyword in text node var idx = value.toLowerCase().indexOf(keyword); if (idx < 0) break; count++; elementTmp = document.createTextNode(value.substr(idx+keyword.length)); } uiWebview_SearchResultCount += count; var index = uiWebview_SearchResultCount; while (true) { var value = element.nodeValue; // Search for keyword in text node var idx = value.toLowerCase().indexOf(keyword); if (idx < 0) break; // not found, abort //we create a SPAN element for every parts of matched keywords var span = document.createElement("span"); var text = document.createTextNode(value.substr(idx,keyword.length)); span.appendChild(text); span.setAttribute("class","uiWebviewHighlight"); span.style.backgroundColor="yellow"; span.style.color="black"; index--; span.setAttribute("id", "SEARCH WORD"+(index)); //span.setAttribute("id", "SEARCH WORD"+uiWebview_SearchResultCount); //element.parentNode.setAttribute("id", "SEARCH WORD"+uiWebview_SearchResultCount); //uiWebview_SearchResultCount++; // update the counter text = document.createTextNode(value.substr(idx+keyword.length)); element.deleteData(idx, value.length - idx); var next = element.nextSibling; //alert(element.parentNode); element.parentNode.insertBefore(span, next); element.parentNode.insertBefore(text, next); element = text; } } else if (element.nodeType == 1) { // Element node if (element.style.display != "none" && element.nodeName.toLowerCase() != 'select') { for (var i=element.childNodes.length-1; i>=0; i--) { uiWebview_HighlightAllOccurencesOfStringForElement(element.childNodes[i],keyword); } } } } } // the main entry point to start the search function uiWebview_HighlightAllOccurencesOfString(keyword) { uiWebview_RemoveAllHighlights(); uiWebview_HighlightAllOccurencesOfStringForElement(document.body, keyword.toLowerCase()); } // helper function, recursively removes the highlights in elements and their childs function uiWebview_RemoveAllHighlightsForElement(element) { if (element) { if (element.nodeType == 1) { if (element.getAttribute("class") == "uiWebviewHighlight") { var text = element.removeChild(element.firstChild); element.parentNode.insertBefore(text,element); element.parentNode.removeChild(element); return true; } else { var normalize = false; for (var i=element.childNodes.length-1; i>=0; i--) { if (uiWebview_RemoveAllHighlightsForElement(element.childNodes[i])) { normalize = true; } } if (normalize) { element.normalize(); } } } } return false; } // the main entry point to remove the highlights function uiWebview_RemoveAllHighlights() { uiWebview_SearchResultCount = 0; uiWebview_RemoveAllHighlightsForElement(document.body); } function uiWebview_ScrollTo(idx) { var scrollTo = document.getElementById("SEARCH WORD" + idx); if (scrollTo) scrollTo.scrollIntoView(); }