Javascript 如何在每次web视图完成加载时突出显示UIWebView中出现的所有字符串?
所以我基本上在屏幕上有一个Javascript 如何在每次web视图完成加载时突出显示UIWebView中出现的所有字符串?,javascript,ios,swift,uiwebview,Javascript,Ios,Swift,Uiwebview,所以我基本上在屏幕上有一个UIWebView。用户可以点击两个UIBarButtonItems在web视图上加载HTML。一个按钮用于加载下一个HTML,另一个按钮用于加载上一个HTML。(我有一个HTML数组要显示) 因此,每次用户点击其中一个按钮时,我都使用此代码加载HTML: // resultView is a UIWebView resultView.loadHTMLString( entries[nowDisplayingIndex].htmlDescription, bas
UIWebView
。用户可以点击两个UIBarButtonItem
s在web视图上加载HTML。一个按钮用于加载下一个HTML,另一个按钮用于加载上一个HTML。(我有一个HTML数组要显示)
因此,每次用户点击其中一个按钮时,我都使用此代码加载HTML:
// resultView is a UIWebView
resultView.loadHTMLString(
entries[nowDisplayingIndex].htmlDescription, baseURL: nil)
每次显示一段HTML时,我都使用Javascript突出显示某些字符串的所有出现。我决定在viewDidLoad
时将Javascript函数加载到web视图中。因此,我创建了一个在viewDidLoad
中调用的方法:
extension UIWebView {
func initializeHighlighting() {
let path = NSBundle.mainBundle().pathForResource("highlight", ofType: "js")
let jsCode = try! String(contentsOfFile: path!)
self.stringByEvaluatingJavaScriptFromString(jsCode)!
}
}
js文件如下所示:
function uiWebview_HighlightAllOccurencesOfStringForElement(element,keyword) {
if (element) {
if (element.nodeType == 3) { // Text node
while (true) {
//if (counter < 1) {
var value = element.nodeValue; // Search for keyword in text node
var idx = value.toLowerCase().indexOf(keyword);
if (idx < 0) break; // not found, abort
//(value.split);
//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";
text = document.createTextNode(value.substr(idx+keyword.length));
element.deleteData(idx, value.length - idx);
var next = element.nextSibling;
element.parentNode.insertBefore(span, next);
element.parentNode.insertBefore(text, next);
element = text;
window.scrollTo(0,span.offsetTop);
}
} 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) {
var elements = document.getElementsByClassName("searchtext");
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_RemoveAllHighlightsForElement(document.body);
}
我的逻辑是,每次用户点击一个按钮,就会加载一个新的HTML。将调用webviewdiffinishload
。然后,当调用Javascript函数时,文本将突出显示
我运行了我的应用程序,我可以看到一些文本在web视图中突出显示。但是,当我点击按钮并显示下一个HTML时,突出显示消失了!然后我点击按钮加载之前的HTML,但我仍然看不到突出显示
我不明白为什么会这样,所以我开始尝试随机的事情
我添加了一个调用Javascript函数的按钮,但结果保持不变。我还尝试使用
htmlDescription
属性中的Javascript函数返回HTML,但仍然不起作用。我猜只有在调用viewDidLoad时才注入highlight.js,这是不够的,每次加载webview时都需要注入highlight js。webViewDidFinishLoadI在开始加载HTML之前和之后都尝试注入highlight.js,但结果仍然相同@我猜只有在调用viewDidLoad时才注入highlight.js,这是不够的,每次加载webview时都需要注入highlight js。webViewDidFinishLoadI在开始加载HTML之前和之后都尝试注入highlight.js,但结果仍然相同@GuySDo用js和。
webView.stringByEvaluatingJavaScriptFromString(
"uiWebview_HighlightAllOccurencesOfString('\(searchText)')")