鏈接:http://www.reibang.com/p/3a75d7348843
原因:一個(gè)可點(diǎn)擊的標(biāo)簽帶有 target='_blank' 時(shí)孵班,導(dǎo)致WKWebView無法加載點(diǎn)擊后的網(wǎng)頁的問題。
1拗窃、_blank 標(biāo)簽脆侮,眾所周知锌畸,是讓瀏覽器新開一個(gè)頁面來打開鏈接,而不是在原網(wǎng)頁上打開靖避。
在UIWebView上潭枣,只有一個(gè)頁面,所以會(huì)自動(dòng)在原來的頁面上打開新鏈接幻捏。
2盆犁、但是在WKWebView上就不是這樣了。
WKWebView 的 WKNavigationDelegate 有一個(gè)decidePolicyForNavigationAction方法篡九。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
用戶點(diǎn)擊網(wǎng)頁上的鏈接谐岁,需要打開新頁面時(shí),將先調(diào)用這個(gè)方法榛臼。
這個(gè)方法的參數(shù) WKNavigationAction 中有兩個(gè)屬性:sourceFrame和targetFrame伊佃,分別代表這個(gè)action的出處和目標(biāo)。類型是 WKFrameInfo 沛善。WKFrameInfo有一個(gè) mainFrame 的屬性航揉,正是這個(gè)屬性標(biāo)記著這個(gè)frame是在主frame里還是新開一個(gè)frame。
如果 targetFrame 的 mainFrame 屬性為NO金刁,表明這個(gè) WKNavigationAction 將會(huì)新開一個(gè)頁面帅涂。
3、WKWebView帶_blank標(biāo)簽的網(wǎng)頁胀葱,將會(huì)調(diào)用 它的 WKUIDelegate 代理中的createWebViewWithConfiguration方法漠秋。
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
開發(fā)者實(shí)現(xiàn)這個(gè)方法,返回一個(gè)新的WKWebView抵屿,讓 WKNavigationAction 在新的webView中打開庆锦。如果你沒有設(shè)置 WKUIDelegate代理,或者沒有實(shí)現(xiàn)這個(gè)協(xié)議轧葛。那么WKWebView將什么事情都不會(huì)做搂抒,也就是你點(diǎn)那個(gè)按鈕沒反應(yīng)。
注意:返回的這個(gè)WKWebView不能和原來的WKWebView是同一個(gè)尿扯。如果你返回了原來的webView求晶,將會(huì)拋出異常。
解決辦法
apple設(shè)置這個(gè)協(xié)議的作用就是要求開發(fā)者新開一個(gè)webView衷笋。但實(shí)際使用中芳杏,我們的應(yīng)用中webView也就拿來簡簡單單顯示網(wǎng)頁罷了,寫那么復(fù)雜沒必要。
所以解決辦法1:
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
WKFrameInfo *frameInfo = navigationAction.targetFrame;
if (![frameInfo isMainFrame]) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
這樣處理的話爵赵,相當(dāng)于放棄掉原來的點(diǎn)擊事件吝秕,強(qiáng)制讓webView加載打開的鏈接。
原來我就是這么做的空幻,直到:http://www.soku.com/m/y/video?q=阿凡達(dá)%20片段#loaded 這個(gè)優(yōu)酷鏈接烁峭。
這個(gè)鏈接里,點(diǎn)擊某個(gè)視頻秕铛,將會(huì)新開頁面打開约郁。然后在這個(gè)協(xié)議方法里,navigationAction.request 竟然是空的但两!request的URL是空的鬓梅!
所以解決辦法2:
- (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);
}