iOS UIWebView 获取点击链接后进行再处理

Posted by Calvin on 2017-04-17

下午在做 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;
}