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)')")