簡體   English   中英

在WKWebView中加載網站后,如何檢測元素何時可見?

[英]How can I detect when an element is visible after loading website in WKWebView?

我正在嘗試加載一個公交網站,這樣我就可以為一個停止時間刮掉停止時間。 加載url后,稍后會通過javascript動態加載停止時間。 我的目標是通過一類“停止時間”來檢測元素的存在。 如果html中存在這些元素,我可以解析html。 但在我解析html之前,我必須等待這些元素出現“停止時間”。 我讀了很多其他的SO問題,但我不能把它拼湊起來。 我正在實現didReceive消息函數,但我不確定如何加載javascript我需要檢測元素的存在(具有“停止時間”類的元素)。 我成功注入了一些javascript以防止顯示位置權限彈出窗口。

override func viewDidLoad() {
    super.viewDidLoad()

    let contentController = WKUserContentController()
    let scriptSource = "navigator.geolocation.getCurrentPosition = function(success, error, options) {}; navigator.geolocation.watchPosition = function(success, error, options) {}; navigator.geolocation.clearWatch = function(id) {};"
    let script = WKUserScript(source: scriptSource, injectionTime: .atDocumentStart, forMainFrameOnly: true)
    contentController.addUserScript(script)

    let config = WKWebViewConfiguration()
    config.userContentController = contentController

    webView = WKWebView(frame: .zero, configuration: config)
    self.view = self.webView!

    loadStopTimes("https://www.website.com/stop/1000")
}

func loadStopTimes(_ busUrl: String) {
    let urlString = busUrl
    let url = URL(string: urlString)!
    let urlRequest = URLRequest(url: url)
    webView?.load(urlRequest)
}

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if(message.name == "stopTimesLoaded") {
        // stop times now present so take the html and parse the stop times
    }
}

首先,您需要注入下一個腳本,以通過突變觀察者檢測元素的外觀:

var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
      console.log('mutation.type = ' + mutation.type);
      for (var i = 0; i < mutation.addedNodes.length; i++) {
        var node = mutation.addedNodes[i];
        if (node.nodeType == Node.ELEMENT_NODE && node.className == 'stop-time') {
            var content = node.textContent;
            console.log('  "' + content + '" added');
            window.webkit.messageHandlers.stopTimesLoaded.postMessage({ data: content });
        }
      }
    });
  });
observer.observe(document, { childList: true, subtree: true });

然后你需要訂閱事件'stopTimesLoaded':

contentController.add(self, name: "stopTimesLoaded")

最后添加代碼來處理數據

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM