WKWebkit是APP開發中非常常用的元件,但常常會有一些不是很順利的疑難雜症,
只能一直查資料,這邊我有做了一些小筆記,提醒自己下次遇到的時候不要再犯一樣的錯誤,
希望也能幫上一樣遇到相同問題的人,這邊會單就網頁需要另開分頁時會遇上的問題來說~
網頁另開分頁有兩種方法
一種為HTML5的target="_blank"
另一種為JS的window.open('')
若不另外設定,則我們將打不開此頁面(無反應),以下是分別的解決辦法~
第一種是target="_blank"
開啟分頁的解法
這個方法的解釋是這樣的,當網頁跳轉遇到target="_blank"
(targetFrame == nil
)時,停止預設行為,直接在原頁開啟
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
// 若 target="_blank",targetFrame 會 = nil
if navigationAction.targetFrame == nil {
// 傳入 .cancel 停止 navigation 預設的行為
decisionHandler(.cancel)
webView.load(navigationAction.request)
return
}
//.allow 則是預設的行為
decisionHandler(.allow)
}
第二種window.open
開啟分頁的解法
window.open是js新開頁面的一種方法,會用新開視窗的方法去完成載入頁面,WKWebView假如沒有處理,點擊後也一樣會沒反應,所以需要在WKUIDelegate代理中的createWebViewWith新開一個WebView,當targetFrame == nil
或targetFrame?.isMainFrame == nil
時,處理return nil,這裡return nil是不開新的webview,而就在原頁加載
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil || navigationAction.targetFrame?.isMainFrame == nil {
webView.load(navigationAction.request)
}
return nil
}
以上就可以解決WebView跳轉URL時,遇到需要另開新分頁的狀況~~