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

2024-03-26

我正在使用一个WKWebView显示一个包含三个按钮的 HTML 的网站。我想在单击特定按钮时在本机应用程序中运行一些 Swift 代码。

关于 HTML

这三个按钮如下所示:

<input type="button" value="Edit Info" class="button" onclick="javascript:GotoURL(1)">
<input type="button" value="Start Over" class="button" onclick="javascript:GotoURL(2)">
<input type="button" value="Submit" class="button" onclick="javascript:GotoURL(3)">

The GotoURL他们调用的函数如下所示:

function GotoURL(site)
{
    if (site == '1')
        document.myWebForm.action = 'Controller?op=editinfo';
    if (site == '2')
        document.myWebForm.action = 'Controller?op=reset';
    if (site == '3')
        document.myWebForm.action = 'Controller?op=csrupdate';
    document.myWebForm.submit();
}

Current WKWebView执行

当我单击网络视图中的任何按钮时,我的系统上会调用此函数WKNavigationDelegate:

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    // ...?
}

但是当然,navigation是不透明的,因此不包含有关用户单击三个按钮中哪一个的信息。

检测何时单击此按钮的最简单方法是什么?

我想在用户点击时做出响应Submit并忽略其他按钮按下。

我在 Stack Overflow 上看到了一些其他方法WKUserContentController,但他们似乎要求网站调用如下内容:

window.webkit.messageHandlers.log.postMessage("submit");

我不控制这个网站,所以我无法在其源代码中添加这一行,并且我不知道使用将其注入正确位置的最佳方法WKWebView.


用户脚本是在文档加载开始时或文档加载完成后注入网页的 JS。用户脚本非常强大,因为它们允许客户端自定义网页,允许注入事件侦听器,甚至可以用于注入可以反过来回调到本机应用程序的脚本。以下代码片段创建一个在文档加载结束时注入的用户脚本。用户脚本被添加到 WKUserContentController 实例中,该实例是 WKWebViewConfiguration 对象的属性。

// Create WKWebViewConfiguration instance
  var webCfg:WKWebViewConfiguration = WKWebViewConfiguration()

  // Setup WKUserContentController instance for injecting user script
  var userController:WKUserContentController = WKUserContentController()

  // Get script that's to be injected into the document
  let js:String = buttonClickEventTriggeredScriptToAddToDocument()

  // Specify when and where and what user script needs to be injected into the web document
  var userScript:WKUserScript =  WKUserScript(source: js, 
                                         injectionTime: WKUserScriptInjectionTime.atDocumentEnd,
                                         forMainFrameOnly: false)

  // Add the user script to the WKUserContentController instance
  userController.addUserScript(userScript)

  // Configure the WKWebViewConfiguration instance with the WKUserContentController
  webCfg.userContentController = userController;

您的网页可以通过以下方式将消息发布到您的本机应用程序window.webkit.messageHandlers.<name>.postMessage (<message body>)方法。 这里,“name”是回发消息的名称。 JS 可以将任何 JS 对象作为消息体回发,并且 JS 对象会自动映射到相应的 Swift 原生对象。 当 ID 为“ClickMeButton”的按钮上发生按钮单击事件时,以下 JS 代码片段会发回一条消息。

var button = document.getElementById("clickMeButton");
button.addEventListener("click", function() {
            varmessageToPost = {'ButtonId':'clickMeButton'};
            window.webkit.messageHandlers.buttonClicked.postMessage(messageToPost);
        },false);

为了接收网页发布的消息,您的本机应用程序需要实现 WKScriptMessageHandler 协议。 该协议定义了一个必需的方法。可以查询回调中返回的 WKScriptMessage 实例以获取有关回发消息的详细信息。

func userContentController(userContentController: WKUserContentController,
                           didReceiveScriptMessage message: WKScriptMessage) {

        if let messageBody:NSDictionary= message.body as? NSDictionary{
            // Do stuff with messageBody
        }

    }

最后,实现 WKScriptMessageHandler 协议的本机类需要将自身注册为 WKWebView 的消息处理程序,如下所示:

// Add a script message handler for receiving  "buttonClicked" event notifications posted 
// from the JS document
userController.addScriptMessageHandler(self, name: "buttonClicked")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 iOS WKWebView 注入 JavaScript 回调来检测 onclick 事件? 的相关文章

随机推荐

  • phpmyadmin的PHP不执行但其他php脚本可以运行

    调用 phpmyadmin 网站时 会出现 保存文件 对话框application x httpd php 所以我的服务器不执行 phpmyadmin php 脚本 而是将代码传输到我的浏览器 其他 php 如 roundcube 或 is
  • Gradle:下载包含的 aar-library 的依赖项

    我写了一个图书馆项目cameraBarcodeScanner它内置于 aar 文件中 该库在其 build gradle 中定义了以下依赖项 dependencies compile fileTree dir libs include ja
  • 根实体中的 GAE 事务

    我是 GAE 新手 对数据存储事务有一些疑问 例如 我有一个用户实体 当用户在 Facebook 上添加我的应用程序时创建该实体 我通过 Facebook API 获得了一些属性 但我想为用户添加用户名 并且该用户名必须是唯一的 所以在事务
  • 如何获取prometheus中(当前)建立的TCP连接数(kubernetes监控)

    我在 Linux 中使用此命令来查看 当前 建立的 TCP 连接 netstat ant grep ESTABLISHED wc l 我如何将此命令转换为 PromQL 每个节点 我在 kubernetes 集群中使用带有节点导出器的 pr
  • 如何使用 R 个性化时间线?

    我想用 R 绘制一个时间线 其中的时间段很容易识别 我可以在其中个性化可视化 periods 周期 盒子 的颜色 线条 颜色 位置 文本的位置并将其放入 框 中 轴 大小 颜色 选择重点 与事件相关的日期 etc 我使用时间线库 但是我找不
  • 如何触发Uploadify onError 事件处理程序?

    我在用上传 http www uploadify com 上传文件 问题是 我需要通知用户处理这些文件期间出现的任何错误 上传有onError onComplete and onAllComplete事件处理程序 但我不知道如何触发这些事件
  • Owin WS-Federation 设置令牌滑动过期

    有人可以解释如何使用新的实现滑动过期吗欧文WS 联合会 plugin 在客户端 在 WS Federation配置我看到有一些events like Notifications new WsFederationAuthenticationN
  • 在触摸屏上禁用文本输入上的 Chrome 粘贴菜单

    如何在触摸屏上禁用 Chrome 中这个烦人的上下文菜单 当我复制了一些文本时 在选择 长按任何输入时会弹出此窗口 我正在使用 CEFSharp Chromium 嵌入式框架 开发一个应用程序 并将其部署在 Windows 8 计算机的触摸
  • C# 中枚举对象的属性(字符串)

    假设我有很多对象 并且它们有很多字符串属性 是否有一种编程方式来遍历它们并输出属性名称及其值 或者是否必须进行硬编码 是否有一种 LINQ 方法来查询 字符串 类型的对象属性并输出它们 您是否必须对要回显的属性名称进行硬编码 使用反射 它远
  • 在 R 程序中排序后对行重新编号

    我已经订购了一组行来得到这个 2 1983 TRI COUNTY TRAUTH 0 1495 0 1395 NA 452 0 0764 4 0 06 02 83 4 1983 TRI COUNTY TRAUTH 0 1193 0 1113
  • 具有行为和 ORM 的丰富域模型

    观看 Jimmy Bogard 的 NDC12 演示 Crafting Wicked Domain Models 后 http ndcoslo oktaset com Agenda http ndcoslo oktaset com Agen
  • 一个类似于 StringIO 的类,它扩展了 django.core.files.File

    class MyModel models Model image models FileField upload to blagh blagh more spam 我内存中有一个文件 我想通过 Django FileField save 方
  • VSTS - 应用程序中心 - Yaml - 找不到端点

    我正在尝试使用 yaml 设置我的构建定义 我正在使用AppCenter分发任务 https github com Microsoft vsts tasks tree master Tasks AppCenterDistribute 它需要
  • typeorm - 如何向“多对多”表添加额外字段?

    例如 3 tables user user business lines business line business line 那些创建者typeorm与声明User ManyToMany type gt BusinessLine Joi
  • Firebase 仅部署函数流程

    如果我有两个 Firebase 函数 fire1 and fire2 共享一个辅助函数 doSum 将部署firebase deploy only functions fire1改变环境fire2 不 每个功能彼此完全独立 每个已部署的函数
  • 如何使用 grpc 修复 python 中的“类型错误:不允许位置参数”

    我正在使用 Ubuntu 18 04 3 LTS x64 在 python 中使用 grpc 设置微服务 我尝试改变分配参数的方式 从我的 protoc 文件重新生成代码 客户代码 class Cliente def IniciarClie
  • ie6中缺少div高度的解决办法

    我正在使用一个空 div 通过设置来显示一行高度 3 像素 它在所有浏览器中都能正常工作 但在ie6显示的高度 div20 像素高度 即使对于 height 0px 它也保持不变 但其他属性的变化反映但不反映高度 并且没有重复的 CSS 条
  • 总结树上的值

    我使用树控件来查看一些基于嵌套 父子 表的分层项目 每个节点都有一个 NameValue 格式 接受 name 和 value 但只有叶子 最后一个节点 具有整数值 并且父节点的值保留为空 仅是它们具有的名称 我想总结值 以便每个父节点都保
  • 获取 PostgreSQL 中一个月前的时间戳

    我有一个 PostgreSQL 数据库 其中一个表快速增长得非常大 大约每月几百万行 因此我想定期将该表的内容存档到一个单独的表中 我打算使用 cron 作业每晚执行 sql 文件 将超 过一个月的所有行存档到另一个表中 我的查询工作正常
  • 如何使用 iOS WKWebView 注入 JavaScript 回调来检测 onclick 事件?

    我正在使用一个WKWebView显示一个包含三个按钮的 HTML 的网站 我想在单击特定按钮时在本机应用程序中运行一些 Swift 代码 关于 HTML 这三个按钮如下所示