如何在 WebKit 视图中获取被点击元素的 ID?

ham*_*our 3 webkit ios swift

UIWebKit在一个 url 中加载了一个,我想在点击时选择一个 html 元素的 id。我可以在知道 id 时获取元素,但是如何在单击时获取未知元素 Id。感谢你们对我的帮助 !

Rat*_*ker 9

您可以按照以下方式进行。

  1. 使用 .js 将一些 javascript 注入到 WebView 中WKUserScript
  2. 注入的 javascript 将侦听任何单击事件的文档正文。
  3. 收到点击事件后,使用elementFromPoint.
  4. 以这种方式设置,javascript 将与本机代码进行通信。
  5. 收到点击并找到元素后,联系被点击 DOM 的本机代码。

我已经测试了这种工作方式,它对我有用。

import UIKit
import WebKit

class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!
    private var url = URL(string: "https://www.google.com")!


    override func viewDidLoad() {
        super.viewDidLoad()

        initializeWebView()
        loadData()

    }

    private func initializeWebView() {

        let javascript = """
        window.onload = function() {
            document.addEventListener("click", function(evt) {
                var tagClicked = document.elementFromPoint(evt.clientX, evt.clientY);
                window.webkit.messageHandlers.jsMessenger.postMessage(tagClicked.outerHTML.toString());
            });
        }
        """

        let userScript = WKUserScript.init(source: javascript,
                                           injectionTime: .atDocumentStart, forMainFrameOnly: true)
        webView.configuration.userContentController.addUserScript(userScript)
        webView.configuration.userContentController.add(self, name: "jsMessenger")
    }

    private func loadData() {
        let request  = URLRequest(url: url)
        webView?.load(URLRequest.init(url: url))
    }
}


extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print(message.body)
    }
}
Run Code Online (Sandbox Code Playgroud)

它为您提供整个元素作为字符串