IOS UIWebView: How to add listeners to DOM events?

假装没事ソ 提交于 2019-12-31 23:11:39

问题


How can I add listeners to DOM events in UIWebView? For example for the following html:

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

Is it possible to register a listener for a button click event in IOS application that loads html in UIWebView?


回答1:


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



回答2:


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


来源:https://stackoverflow.com/questions/20328519/ios-uiwebview-how-to-add-listeners-to-dom-events

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