我已将网页加载到WKWebView中。我想检测用户何时单击此特定按钮。

<div class="compacted-item">
    <button class="btn btn-lg btn-primary deploy-button" data-ember-action="1361">
        Deploy
    </button>
</div>

没有触发decidePolicyFor navigationAction,因为它不是导航操作。

我知道如何向Web View 用户内容 Controller 添加js消息处理程序,但是由于我不拥有该网页,如何获取发送消息以供我拦截的网页?如:
window.webkit.messageHandlers.buttonClicked.postMessage(messageToPost);

还是有另一种方法来检测WKWebView中的非导航按钮单击?

最佳答案

从技术上讲这是可能的,但是您必须要有一点技巧。您可以将任意js注入(inject)WKWebView中,以便可以找到该元素并向其添加事件监听器。当然,您冒着这样的风险,即有人会从您下方更改html,并且此时功能可能会中断。

我汇集了一个快速而肮脏的示例项目来进行尝试(我只是将您的按钮放入了一个硬编码的html文档中)。这是如何执行此操作的要点。 (请注意,这确实是一个快速而肮脏的实现,而JS并不是我真正的强项,但是您绝对希望对其进行优化,并至少确保在像我一样开始访问它们之前,您的查询具有一些结果。)在WKScriptMessageHandler的实现中,一旦从注入(inject)的脚本中收到消息,您就可以做任何需要做的事情。

class ViewController: UIViewController {
    ...
    private func getConfiguredWebview() -> WKWebView {
        let config = WKWebViewConfiguration()
        let js = "document.querySelectorAll('.deploy-button')[0].addEventListener('click', function(){ window.webkit.messageHandlers.clickListener.postMessage('Do something'); })"
        let script = WKUserScript(source: js, injectionTime: .atDocumentEnd, forMainFrameOnly: false)

        config.userContentController.addUserScript(script)
        config.userContentController.add(self, name: "clickListener")

        let webView = WKWebView(frame: .zero, configuration: config)
        return webView
    }
}

extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print(message.body)
    }
}

这个答案的灵感来自https://learnappmaking.com/wkwebview-how-to/此页面。

另外,很抱歉复活一个非常古老的帖子,希望对您有所帮助。老实说,我看的是问题而不是日期,然后有点不知所措,想知道是否有可能。

10-05 21:06
查看更多