我已将网页加载到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/此页面。
另外,很抱歉复活一个非常古老的帖子,希望对您有所帮助。老实说,我看的是问题而不是日期,然后有点不知所措,想知道是否有可能。