WKWebView中a標簽設(shè)置target問題

問題描述:

HTML代碼中 a 標簽設(shè)置 target 屬性為 _blank,因為 _blank 屬性在瀏覽器中代表打開一個新窗口,但在 WKWebView 中會導(dǎo)致 WKNavigationDelegate 導(dǎo)航方法被調(diào)用兩次

<a style="color:#2c65bb; font-size:56px" href="demo://app/customer/home" target="_blank">打開鏈接</a>
navigationAction 分析:

1、首次打開h5頁面,targetFrame request 為 null

<WKNavigationAction: 0x11de616f0; navigationType = -1; 
syntheticClickType = 0; position x = 0.00 y = 0.00 request = <NSMutableURLRequest: 0x280370b70> { URL: file:///private/var/containers/Bundle/Application/74B78B54-3ECE-422A-8A22-101AC2C6B3D2/Gundam.app/test.html }; 
sourceFrame = (null); 
targetFrame = <WKFrameInfo: 0x10a24ba00; webView = 0x10e00e200; isMainFrame = YES; request = (null)>>

2、點擊 <a target="_blank" href= ".... > 標簽

  • 首次調(diào)用導(dǎo)航回調(diào)方法,目標 frame 為 null,瀏覽器中應(yīng)該打開一個新的導(dǎo)航
<WKNavigationAction: 0x10a50d290; navigationType = 0; syntheticClickType = 1; position x = 35.00 y = 1028.00 request = <NSMutableURLRequest: 0x28036d080> { URL: demo://app/customer/home };
sourceFrame = <WKFrameInfo: 0x10a50af70; webView = 0x10e00e200; isMainFrame = YES; request = <NSMutableURLRequest: 0x28036d0e0> { URL: file:///private/var/containers/Bundle/Application/74B78B54-3ECE-422A-8A22-101AC2C6B3D2/Gundam.app/test.html }>; 
targetFrame = (null)>
  • 二次調(diào)用導(dǎo)航回調(diào)方法,targetFrame 有了 WKFrameInfo 信息并且有了 request 信息
<WKNavigationAction: 0x10d90d730; navigationType = -1; syntheticClickType = 0; position x = 0.00 y = 0.00 request = <NSMutableURLRequest: 0x280374a30> { URL: demo://app/customer/home }; 
sourceFrame = (null); 
targetFrame = <WKFrameInfo: 0x10d903ae0; webView = 0x10e00e200; isMainFrame = YES; request = <NSMutableURLRequest: 0x2803749d0> { URL: file:///private/var/containers/Bundle/Application/74B78B54-3ECE-422A-8A22-101AC2C6B3D2/Gundam.app/test.html }>>
解決方案一

頁面加載完成之后手動執(zhí)行JS方法修改target屬性為_self (如果頁面有JS渲染需要延遲執(zhí)行 target 屬性修改)

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    [webView evaluateJavaScript:@"var a = document.getElementsByTagName('a');for(var i=0;i<a.length;i++){a[i].setAttribute('target','_self');}" completionHandler:nil];
}
解決方案二

WKNavigationDelegate 導(dǎo)航方法中判斷navigationAction.targetFrame屬性

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    WKFrameInfo *frameInfo = navigationAction.targetFrame;
    // 判斷frameInfo,處理業(yè)務(wù)邏輯代碼
    decisionHandler(WKNavigationActionPolicyAllow);
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容