WKScriptMessageHandler 不会侦听网页上按钮元素上的“onclick”或“click”事件。网页是使用Reactjs开发的

2024-07-01

我正在使用一个WKWebView在 UIViewController 的视图中使用 url 端点显示托管在服务器上的网页。该网页使用Reactjs。这就是我所掌握的有关该网页的所有信息。该代码创建一个 Web 视图并将该 Web 视图作为控制器视图的子视图插入。

let requestObj = URL(string:urlString)!
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
webViewWK = WKWebView(frame: .zero, configuration: configuration)
webViewWK.navigationDelegate = self
_ = webViewWK.load(requestObj)
webViewwrapper = WKWebViewWrapper(forWebView: webViewWK)

网页加载良好,控制器充当 webview 的代表并接收相同的消息。现在我还实现了一个符合 WKScriptMessageHandler 的 WKWebViewWrapper 类。然后,该类可以从场景中的 WKWebView 创建的 webkit 对象接收消息。其实现如下

class WKWebViewWrapper : NSObject, WKScriptMessageHandler{

var wkWebView : WKWebView
let eventNames = ["buttonClick"]
var eventFunctions: Dictionary<String, (String) -> Void> = [:]
let controller: WKUserContentController

init(forWebView webView : WKWebView){
    wkWebView = webView
    controller = WKUserContentController()
    super.init()
}

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if let contentBody = message.body as? String {
        if let eventFunction = eventFunctions[message.name]{
            print("Detected javascript event")
        }
    }
}

func setUpPlayerAndEventDelegation(){
    wkWebView.configuration.userContentController = controller
    for eventname in eventNames {
        controller.add(self, name: eventname)
        eventFunctions[eventname] = { _ in }

        wkWebView.evaluateJavaScript("var elements = document.getElementsByClassName('btn button_btn button_primary button_md button_block'); for (var i = 0 ; i < elements.length; i++) { elements[i].addEventListener('onClick', function(){ window.webkit.messageHandlers.\(eventname).postMessage(JSON.stringify(isSuccess)) }); }") { any, error in
            if let error = error {
                print("EvaluateJavaScript Error:",error)
            }

            if let any = any {
                print("EvaluateJavaScript anything:", any)
            }

        }
    }
}

}

The setUpPlayerAndEventDelegation()方法是最重要的部分。这里是类型为的控制器对象WK用户内容控制器使用其 add(: , 名称:) 方法。根据文档,此方法将 name 参数的 messageHandler 添加到 webkit 对象。每当消息处理程序被触发时,WKScriptMessageHandler 的 userContentController(userContentController:WKUserContentController,didReceive消息:WKScriptMessage)方法


注意一个重要的行为(但鲜为人知)WKWebViewConfiguration in 苹果文档 https://developer.apple.com/documentation/webkit/wkwebviewconfiguration,

WKWebViewConfiguration 仅在首次初始化 Web 视图时使用。创建 Web 视图后,您不能使用此类来更改其配置。

因此,这通常是您应该设置的WKUserContentController完全在 Web 视图创建之前。

// First, create custom configuration with user script
let userController = WKUserContentController()
let scalingScriptString = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
let scalingScript = WKUserScript(source: scalingScriptString, injectionTime: .atDocumentStart, forMainFrameOnly: true)
userController.addUserScript(scalingScript)

let configurations = WKWebViewConfiguration()
configurations.userContentController = userController  // MUST set controller in configurations before creating webview
// Now, use that configuration to create the webview
webView = WKWebView(frame: .zero, configuration: configurations)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WKScriptMessageHandler 不会侦听网页上按钮元素上的“onclick”或“click”事件。网页是使用Reactjs开发的 的相关文章

随机推荐

  • 在 PowerShell 中更改错误消息语言

    我正在尝试在 powershell 中以英文显示错误 以便我可以更轻松地在线搜索它们 当出现错误时 它会以法语显示 如下所示 PS C Users Olivier lpthw gt type nul gt ex2 py type Impos
  • 使用具有阿拉伯字符的 json.dumps 将字典转换为 json [重复]

    这个问题在这里已经有答案了 我有一本包含阿拉伯语单词的字典 例如 data name name print json dumps data file open data json a encoding utf 8 Output name u
  • 在Python中使用argparse解析整个JSON

    我正在尝试使用 ARGPARSE 库在一个简单的参数中解析整个 Json 问题是当它遇到儿子内部的不同元素 例如 和 时 它会突然停止 这是测试代码 parse py import argparse parser argparse Argu
  • 从 Google 地图中的纬度、经度搜索生成英国邮政编码

    我正在尝试通过 Google 地图中的纬度和经度搜索生成英国邮政编码 例如 在 Google 地图中搜索 57 350237 1 977539 将返回以下内容 https i stack imgur com mSULM png https
  • UIProgressView 没有更新?

    我已经开始在 iOS5 中使用 UIProgressView 但还没有真正使用它 我在更新视图时遇到问题 每次更新进度后 我都有一组连续的操作 问题是 进度视图不是一点一点更新的 而是在全部完成之后才更新 事情是这样的 float cnt
  • 如何使用元类中的方法更改 groovy 中方法的行为

    我想通过以下方式 破坏 Groovy 中的 plus 方法 Integer metaClass plus Integer n gt delegate n 1 assert 2 2 5 我收到 StackOverflowException 这
  • HTTPS文件下载C#

    我需要下载隐藏在 HTTPS 连接后面的文件 我对下载安全网站后面的文件不熟悉 我尝试使用凭据来解决此问题 但无济于事 据我所知 您需要创建并使用证书来完成此操作 但我没有找到任何示例 任何帮助表示赞赏 这就是我现在所拥有的 WebClie
  • FullCalendar 日期之间的分割线

    我正在使用 jquery fullcalendar 它工作得很好 但是在议程周视图中 日期之间没有分界线 我查看了 fullcalendar 网站 甚至试图找到 css 处理显示分界线的方式 但没有成功 如何显示日期分割线 Thanks 我
  • Oracle 难以管理简单任务的说法正确吗?没有优质的管理应用程序吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我在这里看到这个说法是在咆哮中提出的http discuss joelonsoftware com default asp joel 3 456
  • 有人可以推荐 java 8 模式来替换 switch 语句吗?

    我有以下代码 public class A private String type String getType return type 现在在许多代码位置我都有这样的代码 switch a geType case A return new
  • 将静态站点生成器与 php 集成

    我目前正在使用 php 构建一个不需要定期更新的网站 并且我考虑使用静态站点生成器 因为它将具有类似博客的功能 然而 我的网站包含一个将与数据库链接的表单 我遇到的问题是静态站点生成器无法识别和解析 php 我目前正在考虑使用三个静态站点生
  • 带骨干的递归函数jquery

    我在主干中有一个应用程序 我想在 Json 中找到一些记录并打印出来 我的 JSON 是这样的 id r1 hotel id 1 name Single level 1 id r1 1 hotel id 1 name Double leve
  • 无法将 Angular 更新到版本 6

    我正在尝试将角度更新到最新版本 我已经更新了全局 angular cli npm install g angular cli 然后当我尝试使用更新本地 angular cli 时ng update angular cli我收到此错误 Err
  • 使用psql以SSL方式连接PostgreSQL

    我正在尝试为 PostgreSQL 服务器配置 ssl 证书 我在数据目录中创建了一个证书文件 server crt 和密钥 server key 并将参数SSL更新为 on 以启用安全连接 我只希望服务器在客户端使用服务器证书进行身份验证
  • 使用协处理器HBase创建二级索引

    我一直在尝试编写自己的协处理器 使用 prePut 挂钩创建二级索引 首先 我只是尝试让 prePut 协处理器工作 到目前为止 我可以将协处理器添加到传递给它的 put 对象中 我发现我无法让协处理器写入与传入的 put 对象正在写入的行
  • 可以使用 libSegFault.so 获取 SIGABRT 的回溯吗?

    神奇的咒语 LD PRELOAD lib libSegFault so someapp runs someapplibSegFault so 提供有关 SIGSEGV 的回溯信息 如中所述many http blogs fau de wit
  • 快速判断文件是否为有效视频

    确定文件是否是可播放视频的最快方法是什么 我不关心它是否腐败 只关心它是否是哑剧类型should可以在 iPad 上播放 我玩过将文件推送到NSURL正如另一个问题所建议的 但每个文件可能需要 gt 1 秒 这太慢了 我目前正在查看文件扩展
  • 正确使用 GuzzleHttp/Psr7/Response

    不确定在 php 页面中显示 Psr7 Guzzle Response 的正确方法是什么 现在 我正在做 use GuzzleHttp Psr7 BufferStream use GuzzleHttp Psr7 Response class
  • 使用数据绑定后查看边距不起作用

    下面是gridview的item布局的代码 在此 layout margin 位于设计面板中 但当我运行时没有边距 我尝试检查其他标签 例如背景 发现它有效 类似的问题是线性布局的布局权重 它们也不起作用 这些在没有数据绑定的情况下工作得很
  • WKScriptMessageHandler 不会侦听网页上按钮元素上的“onclick”或“click”事件。网页是使用Reactjs开发的

    我正在使用一个WKWebView在 UIViewController 的视图中使用 url 端点显示托管在服务器上的网页 该网页使用Reactjs 这就是我所掌握的有关该网页的所有信息 该代码创建一个 Web 视图并将该 Web 视图作为控