Android Webview:脚本可能只关闭由它打开的窗口

Android Webview:脚本可能只关闭由它打开的窗口,第1张

概述我正在加载特定的网址例如.webview.loadUrl("some.domain.com")余言之后,我将其重定向到其他域,然后返回到我的域.然后,我尝试在我的JavaScript(window.close())中关闭窗口.在chrome开发人员工具上进行远程调试时,出现以下错误Scriptsmaycloseonlythewindowsthatwer

我正在加载特定的网址

例如.

webvIEw.loadUrl("some.domain.com")

余言之后,我将其重定向到其他域,然后返回到我的域.然后,我尝试在我的JavaScript(window.close())中关闭窗口.在Chrome开发人员工具上进行远程调试时,出现以下错误

Scripts may close only the windows that were opened by it.

即使我在打开它的同一个域中,也遇到了以上错误.

任何帮助将不胜感激.谢谢.

解决方法:

这个答案将从AndroID App Developer的角度来看.
希望对您有所帮助.

对我来说,问题非常相似:我正在通过webvIEw打开一个网站,并且某些链接在新窗口中打开.问题是webvIEw不能与Web窗口一起使用.我的意思是,这是可能的,但是却没有达到预期的效果(以我为例,当从JavaScript角度在单独的窗口中打开链接时,它覆盖了先前打开的页面,并且无法用JavaScript的window.close()关闭,最终导致前一页出现状态丢失).

因此,在我的案例中,任务是在窗口中打开单个链接,然后返回上一页而不会造成任何状态损失.那是我的解决方案.
我有两个单独的WebVIEw,一个是主要的,另一个是用于窗口链接的.
为了能够对“新窗口中的链接”事件做出反应,我将使用以下代码配置主webVIEw:

    webVIEw.settings.JavaScriptEnabled = true    webVIEw.settings.JavaScriptCanopenwindowsautomatically = true    webVIEw.settings.setSupportMultiplewindows(true)    webVIEw.webChromeClIEnt = object : WebChromeClIEnt() {    overrIDe fun onCreateWindow(vIEw: WebVIEw?, isDialog: Boolean, isUserGesture: Boolean,                                resultMsg: Message?): Boolean {        handleCreateWebWindowRequest(resultMsg)        return true    }}

我们只需要onCreateWindow回调在主webVIEw Chrome客户端中进行覆盖,因为它只会打开新窗口.并且还允许在webVIEw.settings中提供多窗口支持.当onCreateWindow回调触发时,请执行以下 *** 作:

@Suppresslint("SetJavaScriptEnabled")overrIDe fun handleCreateWebWindowRequest(resultMsg: Message?) {    if (resultMsg == null) return    if (resultMsg.obj != null && resultMsg.obj is WebVIEw.WebVIEwTransport)         {        val transport = resultMsg.obj as WebVIEw.WebVIEwTransport        windowWebVIEw = WebVIEw(this)        windowWebVIEw?.layoutParams = VIEwGroup.LayoutParams(                VIEwGroup.LayoutParams.MATCH_PARENT,         VIEwGroup.LayoutParams.MATCH_PARENT)        windowWebVIEw?.settings?.JavaScriptEnabled = true        windowWebVIEw?.settings?.JavaScriptCanopenwindowsautomatically = true        windowWebVIEw?.settings?.setSupportMultiplewindows(true)        windowWebVIEw?.webVIEwClIEnt = WebVIEwClIEnt()        windowWebVIEw?.webChromeClIEnt = object : WebChromeClIEnt() {            overrIDe fun onCloseWindow(window: WebVIEw?) {                super.onCloseWindow(window)                handleCloseWebWindowRequest()            }        }        container.addVIEw(windowWebVIEw)        webVIEw.visibility = VIEw.GONE        transport.webVIEw = windowWebVIEw        resultMsg.sendToTarget()    }}

基本上,我们是将此(创建窗口)请求发送到单独的webVIEw.在其中,我们还应该允许多窗口支持并附加Chrome客户端,在此情况下,我们仅应侦听onCloseWindow事件,因为此webVIEw应该充当窗口.当onCloseWindow触发时,我们只是关闭(隐藏/删除)应该作为窗口的webVIEw,然后返回到主窗口.这里isWebWindowOpened方法调用仅检查windowWebVIEw是否不为null且不可见.

private fun handleCloseWebWindowRequest() {    if (!isWebWindowOpened()) return    container.removeVIEw(windowWebVIEw)    webVIEw.visibility = VIEw.VISIBLE    windowWebVIEw = null}

我唯一能提到的是,当打开windowWebVIEw时,onBackpressed *** 作应将其关闭,并调用handleCloseWebWindowRequest.

总结

以上是内存溢出为你收集整理的Android Webview:脚本可能只关闭由它打开的窗口全部内容,希望文章能够帮你解决Android Webview:脚本可能只关闭由它打开的窗口所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1092089.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存