Remove section from webview in Swift

mEldewaik

I have this site http://www.zakatona.com i want to make a webView app in swift but I want to remove the navigation bar from the web page.

I tried to remove by id but I can't.

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

I use this code to remove elements by id but this code can't work for me.

Sandeep Bhandari

Make Use of WKWebView and not UIWebView. Here is my html

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

Ill be removing the button with id somebutton on loading the WKWebView.

I have used the local html file but that should not affect the O/P.

Without any WKWebView delegate method added O/P looks like

enter image description here

Now go ahead and add delegates

self.webView.navigationDelegate = self

Implement delegate methods

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 after adding delegate method

enter image description here

Hope it helps

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related