IOS UIWebView:如何向DOM事件添加监听器?

如何在UIWebView中添加侦听器到DOM事件? 例如,对于以下html:

 

是否可以在IOS应用程序中为按钮点击事件注册一个监听器,该应用程序在UIWebView中加载html?

是的,您可以使用精心设计的url和UIWebViewDelegate方法执行此操作。

首先,要在按钮标记上添加事件监听器,您应该执行如下所示的javascript(在加载页面之后)

 // In the UIWebViewDelegate - (void)webViewDidFinishLoad:(UIWebView *)webView { if (/* when the loaded url is the target */) { NSString *js = @"document.getElementById('button').click = function() { window.location = 'my-protocol://dummmy.com/maybe/some/data';}"; [webView stringByEvaluatingJavaScriptFromString: js]; } } 

我们在按钮上绑定一个click事件,当它被单击时,它将触发对webView的请求。

接下来我们要做的就是拦截请求并在ObjC中做你想做的事。

 // In the UIWebViewDelegate - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (/* when the url of the request is the crafted url */) { // call your objc method... } } 

这是在UIWebView单击链接时截取的Swift方法:

给自己一个代表:

 class ViewController: UIViewController, UIWebViewDelegate { //... } 

分配它:

 override func viewDidLoad() { super.viewDidLoad() webView.delegate = self //... } 

现在我们可以用它来拦截:

  func webViewDidFinishLoad(_ webView: UIWebView) { if (currentURL?.lowercased().range(of:"some/url") != nil) { webView.stringByEvaluatingJavaScript(from: "document.getElementsByTagName('a')[0].onclick = function() {window.location = 'injected://loadPDF1'; return false;}") } } // Sent before a web view begins loading a frame. func webView(_: UIWebView, shouldStartLoadWith: URLRequest, navigationType: UIWebViewNavigationType) -> Bool{ // intercept all injected page calls if (shouldStartLoadWith.url?.scheme == "injected") { return false; } return true; }