草庐IT

安卓 WebView : Scripts may close only the windows that were opened by it

coder 2023-12-28 原文

我正在加载一个特定的 url

例如。

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

后记我将它重定向到其他域,然后返回到我的域。然后我尝试在我的 javascript (window.close()) 中关闭窗口。在 chrome 开发者工具上远程调试时出现以下错误

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

即使我在打开它的同一个域中,我也会收到上述错误。

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

这个答案将从 Android 应用开发者的角度出发。 我希望它会对某人有所帮助。

这个问题对我来说非常相似:我通过 webview 打开一个网站,一些链接在新窗口中打开。问题是 webview 不能开箱即用地使用 web 窗口。我的意思是,这是可能的,但不像预期的那样(在我的例子中,当从 javascript 的角度在一个单独的窗口中打开一个链接时,它会覆盖以前打开的页面,并且不能用 window.close( ) 来自 javascript,最终导致前一页的状态丢失)。

所以我的任务是在一个窗口中打开一个链接并返回到上一页而不会丢失任何状态。那是我的解决方案。 我有两个单独的 WebView - 一个作为主视图,另一个用于窗口中的链接。 为了能够对“新窗口中的链接”事件使用react,我将使用以下代码配置主 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 是否不为空且可见。

private fun handleCloseWebWindowRequest() {
    if (!isWebWindowOpened()) return

    container.removeView(windowWebView)
    webView.visibility = View.VISIBLE
    windowWebView = null
}

我唯一可以提及的是,当 windowWebView 打开时,onBackPressed 操作应该调用 handleCloseWebWindowRequest 关闭它。

关于安卓 WebView : Scripts may close only the windows that were opened by it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989427/

有关安卓 WebView : Scripts may close only the windows that were opened by it的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. 微信小程序 webview页面分享弹窗 - 2

    微信小程序webview中使用cover-view展示分享弹窗公司业务需要在webview中添加分享弹窗,可以发送给朋友及生成海报分享,因为好几个详情都需要这个功能,因此抽离了share-sheet的组件,ui效果如下图:点击分享,显示以下弹窗share-sheet.wxml如下:{!show}}"catchtouchmove="poptouchmove">发送给朋友生成海报取消share-sheet.js如下:Component({options:{addGlobalClass:true,},/***组件的属性列表*/properties:{//控制弹窗显示与否show:{type:Bool

  3. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  4. javascript - 从 atom Electron 中的 webview 访问 DOM - 2

    是否可以从原子Electron桌面开发工具包中的webview元素中抓取html,我正在尝试访问DOM但我什么也没得到,我在运行时尝试了控制台中的document.links但我得到了空属性和对象作为返回?window.onresize=doLayout;varisLoading=false;onload=function(){varwebview=document.querySelector('webview');doLayout();vart=webview.executeJavaScript("console.log(document.links);");document.que

  5. java - 从 JavaFX 程序为 WebView 执行 Javascript 函数 - 2

    我正在尝试从Java程序执行Javascript函数。Javascript函数获取HTML文件的内容并突出显示特定单词的出现。是否可以从webview对象调用Javascript函数? 最佳答案 要在WebView中运行javascript,您可以使用WebEngine.executeScript()方法。并且有很多方法可以通过javascript突出显示文本。例如。HighlightwordinHTMLtext(butnotmarkup)一起:WebViewwebView=newWebView();finalWebEngineen

  6. javascript - 在 WebView 源代码中执行 JavaScript - 2

    有人知道如何(如果可能的话)在ReactNative的WebView“内部”执行JS吗?场景:我的WebView中显示了这个远程登录页面(网站),该网站有一系列与用户事件相对应的事件。所有事件都触发一个回调,WebView必须监听(这不是问题)。在每个回调中都有一个对JavaScript函数的引用,它必须在WebView内部调用(这就是问题所在!)。因此,我需要从我的ReactNative应用程序调用这个JavaScript函数,该函数位于我的WebView中加载的网站页面(源)上。我有什么:我用onShouldStartLoadWithRequest监听回调并以此操作WebView的

  7. javascript - 如何从 Electron 中的 webview.executeJavaScript 获取返回值 - 2

    大家好,在我的项目中,我有三个js文件,ma​​in.js、browser.js和inject.js,在browser.js我已经实现了所有与我的webview相关的点击操作和许多功能,从这里我有一个点击操作来从加载到webview的网页中获取用户名,为此我在中创建了一个函数>inject.js从页面获取内容和元素我在Inject.js文件中得到了值,但在Browser.js文件中我得到了未定义的值这里是我的示例代码:browser.jsvarproName=webview.executeJavaScript('__myInjection.profileName()');inject.

  8. javascript - 谷歌浏览器应用 : Webview behavior - 2

    在研究上的问题时在Chrome扩展上,在Chrome应用程序中引起了我的注意并引起了我的兴趣。所以我决定做一个我在上面临的问题的小例子看看是否解决它。根据我对观看Chrome开发视频的理解,webview在与您的应用程序不同的进程中运行;它没有与您的应用程序相同的权限。所以我假设如果运行中的内容以某种方式与“主线程”(应用程序)分开,我猜他们的内容将彼此分开执行而不阻塞应用程序或另一个,以防它们中的任何一个可能有可能长时间运行的js执行。因此我做了以下事情:背景.jschrome.app.runtime.onLaunched.addListener(function(){//Telly

  9. javascript - 如何在 Electron 中使用 <webview> 方法 - 2

    关于Electrondocumentation有一个可以与该对象一起使用的方法列表。当我尝试运行任何一种方法时,它们都不起作用。当我查看的属性时检查器中的元素,它说它的原型(prototype)是webview.(__proto__:webview)所有方法都存储在该原型(prototype)中。因此,当我使用这些方法时,我的元素基本上应该从其原型(prototype)继承这些方法(例如myWebview.openDevTools())。但是!当我使用Object.getProptotypeOf(myWebview)我得到HTMLElement,不是webview就像它在检查器中显示的

  10. javascript - Webview 的 Electron 预加载脚本不起作用? - 2

    我有这样加载的webview:在preload.js文件中:我有这个console.log("test");这根本行不通..谁能解释一下? 最佳答案 我只是尝试了相同的场景,它按预期工作。你有吗?开发工具打开了吗?作为有自己的开发工具,这是我能看到预加载脚本没有显示console.log的唯一原因输出。它们可以通过以下方式打开:varwebview=document.getElementById("link-view");webview.openDevTools();或者您的脚本路径不正确,我对此表示怀疑,因为您似乎对此很确定。

随机推荐