【问题标题】:Remove section from webview in Swift从 Swift 中的 webview 中删除部分
【发布时间】:2018-11-20 09:34:44
【问题描述】:

我有这个网站http://www.zakatona.com 我想快速制作一个 webView 应用程序,但我想从网页中删除导航栏。

我尝试按 id 删除,但我不能。

class ViewController: UIViewController {

  @IBOutlet weak var webView: UIWebView!

  public var internalHosts: [String] = ["zakatona.com"]

  public var elementsToRemove: [String] = [
    "navbarappleid",
    "minimal-intro",
    "features",
    "downloadappleid"
  ]


  override func viewDidLoad() {
    super.viewDidLoad()

    getPost()
    setupSideMenu(storyBoard: self.storyboard!)

  }

  func getPost() {
    loadURL(urlString: "http://www.zakatona.com/zakat-calculator.php")
  }

  func loadURL(urlString: String) {

    if let url = URL(string: urlString) {
        self.webView.loadRequest(URLRequest(url: url))
    }
  }
}

extension ViewController:UIWebViewDelegate {

  func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    if let url = request.url, navigationType == .linkClicked, isExternalHost(forURL: url), UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url)
        return false
    }

    return true
  }

  func webViewDidStartLoad(_ webView: UIWebView) {
    self.startActivityIndicator()
    self.removeElements(fromWebView: webView)
  }

  func webViewDidFinishLoad(_ webView: UIWebView) {
    self.removeElements(fromWebView: webView)
    self.stopActivityIndicator()
  }

  private func startActivityIndicator() {
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
  }

  private func stopActivityIndicator() {
    UIApplication.shared.isNetworkActivityIndicatorVisible = false
  }

  private func isExternalHost(forURL url: URL) -> Bool {

    if let host = url.host, internalHosts.contains(host) {
        return false
    }

    return true
  }

  private func removeElements(fromWebView webView: UIWebView) {
    self.elementsToRemove.forEach { self.removeElement(elementID: $0, fromWebView: webView) }
  }

  private func removeElement(elementID: String, fromWebView webView: UIWebView) {
    let removeElementIdScript = "var element = document.getElementById('\(elementID)'); element.parentElement.removeChild(element);"
    webView.stringByEvaluatingJavaScript(from: removeElementIdScript)

    let removeElementClassScript = "document.getElementsByClassName('\(elementID)')[0].style.display=\"none\";"
    webView.stringByEvaluatingJavaScript(from: removeElementClassScript)
  }
}

我使用此代码按 id 删除元素,但此代码对我不起作用。

【问题讨论】:

    标签: ios swift webview uiwebview webpage


    【解决方案1】:

    使用WKWebView 而不是UIWebView。这是我的html

    <html>
        <body bgcolor="#E6E6FA">
                <button id="somebutton">Name</button>
        </body>
    </html>
    

    在加载WKWebView 时,我将删除 ID 为 somebutton 的按钮。

    我使用了本地的html文件,但这应该不会影响O/P。

    没有添加任何WKWebView委托方法的O/P看起来像

    现在继续添加代表

    self.webView.navigationDelegate = self
    

    实现委托方法

    extension ViewController : WKNavigationDelegate {
        func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            let elementID = "somebutton"
            let removeElementIdScript = "var element = document.getElementById('\(elementID)'); element.parentElement.removeChild(element);"
            webView.evaluateJavaScript(removeElementIdScript) { (response, error) in
                debugPrint("Am here")
            }
        }
    }
    

    添加委托方法后的O/P

    希望对你有帮助

    【讨论】:

    • @meldewaik : 很高兴 :) 编码愉快
    • 但如果我有多个元素,我该如何解决这个问题,谢谢@Sandeep
    • @meldewaik :您可以按照您在问题中的方式进行循环:)应该可以
    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多