由于H5网页加载的方式,分为本窗口加载和新开窗口加载的模式,我们日常使用的uiwebview和wkwebview是可以自动跳转本窗口加载的网页,但是新开窗口加载的方式就点击无效,因为H5使用了target="_blank",现在有三种方式可以解决:
方法一:网页里面target的值置为空
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
if (!navigationAction.targetFrame.isMainFrame) {
[webView evaluateJavaScript:@"var a = document.getElementsByTagName('a');for(var i=0;i<a.length;i++){a[i].setAttribute('target','');}" completionHandler:nil];
}
decisionHandler(WKNavigationActionPolicyAllow);
}
方法二:KNavigationAction 中有两个属性:sourceFrame和targetFrame,分别代表这个action的出处和目标。类型是 WKFrameInfo 。WKFrameInfo有一个 mainFrame 的属性,正是这个属性标记着这个frame是在主frame里还是新开一个frame。
- (void)webView:(WKWebView*)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler
{
if(navigationAction.targetFrame==nil){
[webViewloadRequest:navigationAction.request];
}
decisionHandler(WKNavigationActionPolicyAllow);
}
方法三:wkwebview 自带的WKUIDelegate代理方法
- (WKWebView*)webView:(WKWebView*)webView createWebViewWithConfiguration:(WKWebViewConfiguration*)configuration forNavigationAction:(WKNavigationAction*)navigationAction windowFeatures:(WKWindowFeatures*)windowFeatures {
NSLog(@"页面弹出窗口");
if(!navigationAction.targetFrame.isMainFrame) {
[webViewloadRequest:navigationAction.request];
}
return nil;
}