Удалить раздел из веб-просмотра в Swift - PullRequest
0 голосов
/ 11 июня 2018

У меня есть этот сайт http://www.zakatona.com Я хочу быстро создать приложение webView, но хочу удалить панель навигации с веб-страницы.

Я попытался удалить по идентификатору, но не могу«т.

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, но этот код не может работать для меня.

1 Ответ

0 голосов
/ 11 июня 2018

Используйте WKWebView, а не UIWebView.Вот мой HTML

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

Я буду удалять кнопку с идентификатором somebutton при загрузке WKWebView.

Я использовал локальный файл HTML, но это не должно повлиять на O/P.

Без добавления WKWebView метода делегирования O / P выглядит как

enter image description here

Теперь добавьте делегатов

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 после добавления метода делегатов

enter image description here

Надеюсь, это поможет

...