首页 文章

使用iOS WKWebView注入JavaScript回调以检测onclick

提问于
浏览
2

我正在使用 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)">

他们调用的 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();
}

当前的WKWebView实现

当我单击webview中的任何按钮时,在 WKNavigationDelegate 上调用此函数:

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

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

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

我想在用户单击 Submit 时忽略并忽略其他按钮按下 .

我在使用 WKUserContentController 的Stack Overflow上看到了一些其他方法,但它们似乎要求网站调用类似于:

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

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

1 回答

  • 1

    您始终可以在Web视图上使用evaluateJavaScript(_:)注入源代码 . 从那里,要么替换按钮上的事件处理程序(发布消息然后在新处理程序中调用原始函数),要么在按钮上添加事件处理程序,或者在捕获点击事件和发布消息的祖先元素上添加事件处理程序 . (原始事件处理程序也将运行 . )

    document.getElementById("submit-button").addEventListener("click", function () {
       window.webkit.messageHandlers.log.postMessage("submit");
    });
    

    如果按钮没有ID,则可以在文档上添加处理所有(冒泡)单击事件的处理程序,然后根据事件目标发布消息(使用按钮的文本或位置作为行列式) .

相关问题