被`webView.uiDelegate`打开后如何处理`window.close`?

Posted

技术标签:

【中文标题】被`webView.uiDelegate`打开后如何处理`window.close`?【英文标题】:How to handle `window.close` after being opened by the `webView.uiDelegate`? 【发布时间】:2018-04-18 05:52:54 【问题描述】:

我正在为 ios 开发一个 WKWebView-App,它增加了现有网站的功能,但我无法更改该网站的源代码。

当用户点击某些按钮时,它们会触发window.open。 我已经相应地成功覆盖了委托函数:

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? 
    let contentController = WKUserContentController()
    let popups = getJSfromURL(url: Bundle.main.path(forResource: "popups", ofType: "js")!)
    contentController.addUserScript(popups)

    let webConfiguration = WKWebViewConfiguration()
    webConfiguration.userContentController = contentController

    let popupView = WKWebView(frame: .zero, configuration: webConfiguration)
    popupView.load(navigationAction.request)
    view = popupView
    return nil

在此弹出窗口中,有一个按钮调用this.close(),但浏览器抱怨说,它无法关闭,因为它不是由 javascript 打开的。

另一个按钮想要设置一些用户已经设置的参数,但浏览器抱怨,opener-参数是nil

我可以在打开弹出窗口之前以某种方式使用注入的 javascript 来设置开启器吗?

【问题讨论】:

【参考方案1】:

我通过将呈现网站的来源设置为弹出窗口的 src 解决了这个问题。

现在弹出窗口显示在相同的上下文中,并且可以毫无问题地回发给定的信息。

例如:

触发弹出窗口../training/NewTraining.aspx的按钮New调用javascript函数showNew()

现在我只是简单地将这个函数添加到我注入的 javascript 中,以便执行它:

function showNeu() 
    parent.parent.frames[1].location.href='../training/TrainingNeu.aspx';

我还更改了关闭弹出窗口的按钮Abort 的javascript:

var btnAbort = document.getElementById('ASPxRoundPanel3_btnAbort');
if (btnAbort) 
    btnAbort.onclick = function () parent.window.location = "/MainPage.aspx";;

【讨论】:

以上是关于被`webView.uiDelegate`打开后如何处理`window.close`?的主要内容,如果未能解决你的问题,请参考以下文章

url中特殊字符被转义成编码后如何处理

从 QIODevice.read() 读取后如何处理数据?

OC与JS交互-WKWebView篇

Delphi Seattle 中运行时 DPI 更改后如何处理菜单缩放

iOS:当 WKWebView 获取运动传感器时显示一个白色方块

iOS WkWebview不支持 window.open的解决方法