【问题标题】:calling opener function from popup while using iOS WKWebView popup window使用 iOS WKWebView 弹出窗口时从弹出窗口调用 opener 函数
【发布时间】:2021-01-08 02:12:36
【问题描述】:

我最近为基于 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 函数应该怎么做?

提前致谢。

【问题讨论】:

    标签: javascript ios uiwebview popup wkwebview


    【解决方案1】:

    大错特错!

    当弹出 webview 在func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? 中实例化时,我创建了一个 webview,添加为 subView 并返回 nil。这就是 window.opener 在 javascript 上为空的原因。

    所以方法和解决方案和this post完全一样。

    如果在 WKUIDelegate 中创建 webview 时返回了合适的 webview,则无需为window.opener 通信设置 JSContext。

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多