在 WKWebView 中处理 JavaScript 事件

Posted

技术标签:

【中文标题】在 WKWebView 中处理 JavaScript 事件【英文标题】:Handling JavaScript events in WKWebView 【发布时间】:2017-07-12 16:16:24 【问题描述】:

我试图捕捉WKWebView 中的每个onClick 事件。 该网站仅使用 javascript,因此我无法处理以下内容:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)

我该怎么做?

【问题讨论】:

【参考方案1】:

您可以使用 WKUserScript 并将其添加到 WKWebView 配置的 userContentController 中。

    let config = WKWebViewConfiguration()
    let source = "document.addEventListener('click', function() window.webkit.messageHandlers.iosListener.postMessage('click clack!'); )"
    let script = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
    config.userContentController.addUserScript(script)
    config.userContentController.add(self, name: "iosListener")
    webView = WKWebView(frame: UIScreen.main.bounds, configuration: config)

这将创建脚本并在文档完成加载后将其注入页面。现在,您需要实现 WKScriptMessageHandler 协议来接收消息:

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) 
        print("message: \(message.body)")
        // and whatever other actions you want to take
    

【讨论】:

天哪,我浪费了这么多时间来让它工作!感谢分享:) 太棒了!非常感谢! 有人知道这个概念是否也适用于 android 吗? @RedRoosterMobile,这个概念也适用于 Android。检查 android.webkit.WebView 上的 addJavascriptInterface 方法 @iMRahib,self 是呈现 web 视图的控制器【参考方案2】:

如果您只想为 ID 为 'buttonX' (<button id="buttonX">Click me</button>) 的按钮添加点击监听器,那么


let scriptSource = """
var button = document.getElementById('buttonX');
document.body.style.backgroundColor = `red`;
if(button != null) 
    button.addEventListener("click", function()
        window.webkit.messageHandlers.iosClickListener.postMessage('open_invitation');
        document.body.style.backgroundColor = `green`;
    );


"""

        let config = WKWebViewConfiguration()
        let script = WKUserScript(source: scriptSource, injectionTime: .atDocumentEnd, forMainFrameOnly: false)

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


        let webView = WKWebView(frame: view.frame, configuration: config)

        view.addSubview(webView)
        webView.loadhtmlString(html, baseURL: nil) //load your html body here

    

    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) 
        if let body = message.body as? String, body == "open_invitation" 
            print("✅ we did it")
        
    

您的视图控制器也应该符合WKScriptMessageHandler 协议

【讨论】:

【参考方案3】:

您可以使用 WebViewJavascriptBridge。详情请参考以下链接:

https://github.com/marcuswestin/WebViewJavascriptBridge

【讨论】:

为什么我要添加一个 3rd 方库,向我的 app bundle 中投放广告,而 WKWebView 已经支持所有具有 Objective-C 风格界面的东西?

以上是关于在 WKWebView 中处理 JavaScript 事件的主要内容,如果未能解决你的问题,请参考以下文章

在 WKWebView 上处理第三方 Cookie

在 Swift WKWebView 中的完成处理程序中将 html 数据保存在变量中

WKWebView 的调整大小处理程序中未更新 window.innerWidth/Height

UIWebview/WKWebView javascript调用处理两个返回值?

可可斯威夫特:错误评估JavaScript可选(“发生JavaScript异常”)

WKWebView 在 deinit 上崩溃