如何在点击事件后从URL加载部分HTML?

问题描述:

我已经写了一些代码来加载所有来自url的html,并解析它以删除标题。所以我得到了标题下的其余html显示。 但是,在正文html中单击事件后,屏幕将显示URL中的完整HTML。如何在点击事件后从URL加载部分HTML?

有没有解决方案?还是我犯了一个错误来解决这个问题?

我所做的代码如下

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) 
     } 

    } 

试试这个,它的工作原理与UIWebViewNavigationType.linkClicked。您可以修改它以与其他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 
} 
+0

我添加的内容基本上是当webview内部点击链接时,webview停止请求并获取请求的url,然后解析url中的html以删除标题,然后再将其传递到webview。 – Sherman

+0

但它不显示网址。当我打印变量** myURLString **时,它显示**可选(“about:blank”)** – Jinna

+0

再试一次。我得到url后更改了webview.stoploading() – Sherman

我找到了答案!

感谢@Sherman的提示来解决这个问题。

我不得不更换下面

if navigationType == .linkClicked 

一行代码

if navigationType == UIWebViewNavigationType.linkClicked 

然后它的工作原理!