###実現したいこと
WKWebViewでtarget="_blank"なリンクを開き、また元のサイトに戻れるようにしたい。
WKWebViewで表示している元のサイトから、外部リンクへ飛ぶためのリンクがあります。
<div class="show-url"><p></i><%= link_to @post.url, @post.url, target: "_blank" %></p></div>
下記のサイトを参考し、実装してみているのですが、リンク先へ飛ぶことが叶っても、飛んだリンク先に"戻るボタン"、"完了ボタン"、"閉じるボタン"などがない場合、元のサイトに戻れません。
https://qiita.com/m__ike_/items/f2f9edf1dd9dfad70f13
何か良い案がある方、ぜひ助言を宜しくお願い致します。
###これまで試した結果
1.同じWebView内で開く
結果 → window.close()ができないです。また、元の画面に戻るボタンなど無いため、戻れなくなります。
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame?.isMainFrame != true { webView.load(navigationAction.request) } return nil }
2.新しいWebViewで開く
結果 → 元の画面に戻るボタンなど無い場合、戻れなくなります。(今のところ一番惜しいです)
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { if navigationAction.targetFrame?.isMainFrame != true { let newWebView = WKWebView(frame: webView.frame, configuration: configuration) newWebView.load(navigationAction.request) newWebView.uiDelegate = self webView.superview?.addSubview(newWebView) return newWebView } return nil } func webViewDidClose(_ webView: WKWebView) { webView.removeFromSuperview() }
3.スクプリトで書き換える
結果 → リンク先へ飛びません。
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { let script = """ var elements = document.body.getElementsByTagName("*"); for (var i = 0; i < elements.length; i++) { if (elements[i].target == '_blank') { elements[i].target = '_self' } } """ webView.evaluateJavaScript(script, completionHandler: nil) }
あなたの回答
tips
プレビュー