问题描述
我最近将基于iOS WebView的应用程序的UIWebView
更改为WKWebView
。
WebView的javascript中有一个window.open
函数,并且弹出窗口调用了opener(parent)的函数,如下所示:
// In parent window's javascript
window.open('popup' .....)
function doIt(){
}
// In popup window's javascript
window.opener.doIt()
在UIWebView中,我使用jscontext,以便弹出窗口可以调用opener的javascript函数。
// Legacy code for communication between 2 UIWebView windows
// Not works when using WKWebView
jscontext *parentCtx = [parentWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
jscontext *childCtx = [popupWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
childCtx[@"window"][@"opener"] = parentCtx[@"window"];
但是,似乎jscontext
在使用WKWebView时不可用。在这种情况下,如何在javascript上下文中链接两个Webview?
在不更改旧版javascript代码的情况下,我该怎么做才能调用opener函数?
谢谢。
解决方法
真是个错误!
在func webView(_ webView: WKWebView,createWebViewWith configuration: WKWebViewConfiguration,for navigationAction: WKNavigationAction,windowFeatures: WKWindowFeatures) -> WKWebView?
中实例化弹出式Webview时,我创建了一个Webview,添加为subView并返回nil 。这就是window.opener
在javascript中为空的原因。
因此,方法和解决方案与this post完全相同。
如果在WKUIDelegate创建Webview期间返回适当的WebView,则无需为window.opener
通信设置JSContext。