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

IOS UIWebView:如何向DOM事件添加侦听器?,ios,events,dom,uiwebview,Ios,Events,Dom,Uiwebview,如何向UIWebView中的DOM事件添加侦听器?例如,对于以下html: <button type="button" id="button1">Try it</button> 试试看 是否可以在IOS应用程序中为在UIWebView中加载html的按钮单击事件注册侦听器?是的,您可以使用特制的url和UIWebViewDelegate方法来完成此操作 首先,要在按钮标签上添加事件监听器,您应该执行如下javascript(页面加载后) 我们在按钮上绑定一个click

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

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

是否可以在IOS应用程序中为在UIWebView中加载html的按钮单击事件注册侦听器?

是的,您可以使用特制的url和UIWebViewDelegate方法来完成此操作

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

我们在按钮上绑定一个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
中单击链接时进行拦截的快捷方式:

让自己成为一名代表:

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

很好的解释,谢谢!顺便问一下,“窗口位置”是什么?看起来像一个DOM根,是吗?我可以使用“window.location”直接操作DOM吗?您可以使用传入“stringByEvaluatingJavaScriptFromString”方法的“js”变量直接操作DOM。例如,删除页面内容:“document.write(“”)如果IOS正在寻找的DOM节点需要由客户端库(如React/Vue)渲染几毫秒,是否存在此失败的风险?@EgistLi如果IOS正在寻找的DOM节点需要由客户端库(如React/Vue)渲染几毫秒,是否存在此失败的风险?@timebandit我相信是的。如果您使用的是React/Vue内部的某些东西,那么您需要以某种方式连接到React/Vue的生命周期中。或者,如果未停止按钮onclick事件侦听器的事件传播,则可以尝试在
文档
对象上使用事件委派和绑定按钮onclick事件侦听器。
    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;
    }