How to load part of HTML from URL even after clicking event?

房东的猫 提交于 2019-12-25 10:46:52

问题


I have wrote some code to load all html from url and parse it to remove header. So I got the rest of the html under header to show. However, after clicking event in the body html, the screen shows full html from the URL.

Is there any solution for this? or Did I make a mistake to approach this problem?

The code I made is below

import UIKit
import Fuzi

class ViewController: UIViewController {

    @IBOutlet weak var webView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let myURLString = "http://yahoo.com"
        var myHTMLString = ""
        guard let myURL = URL(string: myURLString) else {
            print("Error: \(myURLString) doesn't seem to be a valid URL")
            return
        }

        do {
            myHTMLString = try String(contentsOf: myURL, encoding: .utf8)
        } catch let error {
            print("Error: \(error)")
        }

        do {
            // if encoding is omitted, it defaults to NSUTF8StringEncoding
            let doc = try! HTMLDocument(string: myHTMLString, encoding: String.Encoding.utf8)

            let fullHtml:String = (doc.firstChild(xpath: "//*")?.rawXML)!


            if let header = doc.firstChild(xpath: "//body/div/header") {

                let headerString:String = header.rawXML

                let withoutHeader = fullHtml.replacingOccurrences(of: headerString, with: "")

                webView.loadHTMLString(withoutHeader as String, baseURL: nil)
            }
        } catch let error{
            print(error)
        }

    }

回答1:


Try this, it works with UIWebViewNavigationType.linkClicked. You can modify it to use with other UIWebViewNavigationType.

import UIKit
import Fuzi

class ViewController: UIViewController, UIWebViewDelegate {

@IBOutlet weak var webView: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()

    webView.delegate = self

    let myURLString = "http://yahoo.com"
    var myHTMLString = ""
    guard let myURL = URL(string: myURLString) else {
        print("Error: \(myURLString) doesn't seem to be a valid URL")
        return
    }

    do {
        myHTMLString = try String(contentsOf: myURL, encoding: .utf8)
    } catch let error {
        print("Error: \(error)")
    }

    do {
        // if encoding is omitted, it defaults to NSUTF8StringEncoding
        let doc = try! HTMLDocument(string: myHTMLString, encoding: String.Encoding.utf8)

        let fullHtml:String = (doc.firstChild(xpath: "//*")?.rawXML)!


        if let header = doc.firstChild(xpath: "//body/div/header") {

            let headerString:String = header.rawXML

            let withoutHeader = fullHtml.replacingOccurrences(of: headerString, with: "")

            webView.loadHTMLString(withoutHeader as String, baseURL: nil)
        }
    } catch let error{
        print(error)
    }
}

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == .linkClicked
    {
        let myURLString = webView.request?.url.absoluteString
        webView.stopLoading()
        var myHTMLString = ""
        let myURL = URL(string: myURLString)
    do {
        myHTMLString = try String(contentsOf: myURL, encoding: .utf8)
    } catch let error {
        print("Error: \(error)")
    }

    do {
        // if encoding is omitted, it defaults to NSUTF8StringEncoding
        let doc = try! HTMLDocument(string: myHTMLString, encoding: String.Encoding.utf8)

        let fullHtml:String = (doc.firstChild(xpath: "//*")?.rawXML)!


        if let header = doc.firstChild(xpath: "//body/div/header") {

            let headerString:String = header.rawXML

            let withoutHeader = fullHtml.replacingOccurrences(of: headerString, with: "")

            webView.loadHTMLString(withoutHeader as String, baseURL: nil)
        }
    } catch let error{
        print(error)
    }
    }
    return true
}



回答2:


I found an answer!

Thanks to @Sherman for the hint to solve this problem.

I had to replace a line of code below

if navigationType == .linkClicked

to

if navigationType == UIWebViewNavigationType.linkClicked

Then It works!



来源:https://stackoverflow.com/questions/44170936/how-to-load-part-of-html-from-url-even-after-clicking-event

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!