被`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`?的主要内容,如果未能解决你的问题,请参考以下文章
Delphi Seattle 中运行时 DPI 更改后如何处理菜单缩放