我正在使用 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 回答
您始终可以在Web视图上使用evaluateJavaScript(_:)注入源代码 . 从那里,要么替换按钮上的事件处理程序(发布消息然后在新处理程序中调用原始函数),要么在按钮上添加事件处理程序,或者在捕获点击事件和发布消息的祖先元素上添加事件处理程序 . (原始事件处理程序也将运行 . )
如果按钮没有ID,则可以在文档上添加处理所有(冒泡)单击事件的处理程序,然后根据事件目标发布消息(使用按钮的文本或位置作为行列式) .