下午在做 UIWebView 时,有一个需求,需要获取用户点击 HTML 的 a 标签时进行判断点击的链接是否有效并做对应的处理。本来打算使用 OC 与 js 交互实现,但后来发现一个实用的方法,记录一下。

UIWebView 有一个可选的代理方法:- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

当用户点击 HTML 的 a 标签时,默认是在当前的 WebView 进行下一级跳转的,由于跳转是在 UIWebView 的下一级打开的,iOS 端返回时体验很差。

所以需求来了,当用户点击 a 标签时,判断 a 标签的内容是不是有效的 http 网页地址。如果是,点击后新开一个页面进行加载;如果不是,则请求新的跳转地址进行新开页面加载。

在上边展示的代理方法里进行实现,可以判断用户的点击行为,主要有以下几个状态:

typedef NS_ENUM(NSInteger, UIWebViewNavigationType) {
    UIWebViewNavigationTypeLinkClicked,
    UIWebViewNavigationTypeFormSubmitted,
    UIWebViewNavigationTypeBackForward,
    UIWebViewNavigationTypeReload,
    UIWebViewNavigationTypeFormResubmitted,
    UIWebViewNavigationTypeOther
} __TVOS_PROHIBITED;

当用户点击 a 标签时,即 navigationType == UIWebViewNavigationTypeLinkClicked 时,判断 a 标签内容并进行下一步的操作,代码如下:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
    
    // 判断是否是单击
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        NSURL *url = [request URL];
        NSString *curUrl= [url absoluteString];
        NSString *str = [curUrl substringToIndex:4];
        if ([str isEqualToString:@"http"]) {
            // 如果是有效的 http 地址,则新开页面进行展示
            
            // 不在 WebView 的下一级打开,如果返回 YES 则表示在下一级展开
            return NO;
        }else{
            // 如果不是有效的 http 地址,则进行其他处理
            
        }
    } 
    return YES;   
}