检测 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 打印按钮单击 [重复]

检测 WKWebview 中的按钮点击

如何让 WKWebView 像 SFSafariViewController 一样全屏显示?

如何使用 iOS WKWebView 注入 JavaScript 回调来检测 onclick 事件?

检测用户何时向左或向右滑动以在 WKWebView 上前后移动