在做WKWebView加载的时候,有时候,会发现一个超链接加载不了,或者对应的点击事件,执行不行,实际上跟target='_blank'有着莫大的关系。target='_blank'在HTML中,意味着新创建一个window窗口加载,也就是,不再是mainframe了。但是在UIWebView中,只有一个页面,所以,UIWebView会自动的在当前页面渲染新的链接内容。
解决思路有两个。
一) 在发起请求的时候根据发起请求的类型,进行处理,可以强制加载到一个一个WKWebView中去。
//在发起请求之前 决定跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
switch (navigationAction.navigationType) {
case WKNavigationTypeLinkActivated:
//超链接
[webView loadRequest:navigationAction.request];
break;
default:
break;
}
decisionHandler(WKNavigationActionPolicyAllow);
}
WKNavigationAction中,有两个属性,sourceFrame和targetFrame,sourceFrame代表着原有加载链接的属性,targetFrame是代表着即将加载的链接的属性,其中都是属于WKFrameInfo的类型,可以通过isMainFrame,判断是在主窗口加载的,还是需要新创建一个窗口加载。
二)点击新创建一个window窗口的时候,会走UIDelegate的方法。但是,如果你没有设置UIDelegate的代理,以及实现createWebViewWithConfiguration方法,WKWebView将会什么都不做。
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{
//判断即将加载的 链接是不是在主窗口 显示的,如果不是 直接在当前的主窗口中加载
if (!navigationAction.targetFrame.isMainFrame) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
参考学习文章https://www.jianshu.com/p/3a75d7348843
但是,这两种方法解决了跳转的问题,却带来了页面无法正常返回的问题,尚待解决。