IOS UIWebView: ¿Cómo agregar oyentes a events DOM?

¿Cómo puedo agregar oyentes a events DOM en UIWebView? Por ejemplo, para el siguiente html:

<button type="button" id="button1">Try it</button> 

¿Es posible registrar un oyente para hacer clic en un evento de clic en la aplicación IOS que carga html en UIWebView?

Sí, puede hacerlo con los methods url y UIWebViewDelegate.

En primer lugar, para agregar un detector de events en la label de button, debe ejecutar javascript como a continuación (después de cargar la página)

 // 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]; } } 

Atamos un evento de clic en el button, y cuando se hace clic, se activará una request a webView.

Y lo siguiente que tenemos que hacer es interceptar la request y hacer lo que quieras en 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... } } 

Aquí está la forma rápida de interceptar cuando se hace clic en un enlace en UIWebView :

Consígase un delegado:

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

Y asignalo:

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

Ahora podemos usarlo para interceptar:

  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; }