IOS UIWebView: How to add listeners to DOM events?

烂漫一生 提交于 2019-12-03 03:44:06

Yes, you can do this with crafted url and UIWebViewDelegate methods.

First, to add event listener on button tag, you should execute javascript like below (after the page is loaded)

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

We bind a click event on the button, and when it's clicked, it will trigger a request to webView.

And the next thing we gotta do is to intercept the request and do what you want in 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...
    }
}

Here is the Swift way to intercept when a Link is clicked in the UIWebView:

Get yourself a delegate:

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

And assign it:

override func viewDidLoad() {
        super.viewDidLoad()

        webView.delegate = self

        //...
}

Now we can use it to intercept:

    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;
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!