检测 WKWebView 中的非导航按钮单击
Posted
技术标签:
【中文标题】检测 WKWebView 中的非导航按钮单击【英文标题】:Detect non-navigation button click in WKWebView 【发布时间】:2016-09-27 16:30:56 【问题描述】:我已将网页加载到WKWebView
。我想检测用户何时单击此特定按钮。
<div class="compacted-item">
<button class="btn btn-lg btn-primary deploy-button" data-ember-action="1361">
Deploy
</button>
</div>
decidePolicyFor navigationAction
未触发,因为它不是导航操作。
我知道如何将 js 消息处理程序添加到 web 视图用户内容控制器,但由于我不拥有该网页,我如何让它发送一条消息让我拦截?如:
window.webkit.messageHandlers.buttonClicked.postMessage(messageToPost);
或者是否有其他方法可以检测WKWebView
中的非导航按钮点击?
【问题讨论】:
没有没有办法,WKWebView会拦截。检查链接是否有您想要实现的目标***.com/questions/34574864/… 我的 js 示例直接来自那个问题。请注意我关于不知道如何发送buttonClicked.postMessage
的评论,因为 js 不是我的。
@Frankie 你解决了吗?
【参考方案1】:
这在技术上是可行的,但您必须有点技巧才能做到这一点。您可以将任意 js 注入到 WKWebView 中,因此您可以找到该元素并为其添加事件侦听器。当然,您冒着有人会从您下面更改 html 的风险,并且您的功能可能会在那时中断。
我拼凑了一个快速而肮脏的示例项目来尝试一下(我只是将您的按钮放入硬编码的 html 文档中)。这是如何做到这一点的要点。 (注意,这是一个非常快速和肮脏的实现,而 JS 并不是我真正的强项,但你肯定想改进它,至少在你开始像我一样访问它们之前确保你的查询有一些结果。)。在WKScriptMessageHandler
的实现中,一旦收到来自注入脚本的消息,您就可以做任何您需要做的事情。
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/这个页面。
另外,很抱歉复活了一个非常老的帖子,希望它可以帮助某人。老实说,我看的是问题而不是日期,然后有点不知所措地想知道这是否可能。
【讨论】:
这应该被标记为正确答案!它对我有用。谢谢克里斯!以上是关于检测 WKWebView 中的非导航按钮单击的主要内容,如果未能解决你的问题,请参考以下文章
WKWebview:从菜单中删除复制、查找、共享按钮并显示自定义
如何让 WKWebView 像 SFSafariViewController 一样全屏显示?