从 Android 的 webview 同时处理 window.open() 时出现问题

Posted

技术标签:

【中文标题】从 Android 的 webview 同时处理 window.open() 时出现问题【英文标题】:Issue while handling simultaneous window.open() from Android's webview 【发布时间】:2020-02-12 18:38:12 【问题描述】:

我一直在通过实现 WebChromeClient 处理来自 javascript 的 window.open() 请求

myWebView.webChromeClient = MyChromeClient()

而且,MyChromeClient 看起来像:

inner class MyChromeClient : WebChromeClient() 
    override fun onCreateWindow(
        view: WebView?,
        isDialog: Boolean,
        isUserGesture: Boolean,
        resultMsg: Message?
    ): Boolean 
        showNewWindowDialog(resultMsg)
        return true
    


对于任何新窗口,我都会显示一个包含 WebView 的对话框。

当新窗口一次打开一个时,代码运行良好。我实现的 DialogFragment 按预期从新窗口打开 URL。如果有多个窗口,代码可以显示堆叠的多个对话框。

但是,如果在 Javascript 中同时触发多个 window.open(),则只有第一个对话框加载 url,其余对话框保持空白。

以下 JS 代码在 for 循环中打开多个窗口。 WebChromeClient 的 onCreateWindow 被多次调用。屏幕中显示了两个对话框(堆叠),但第二个对话框的 webview 没有加载任何 url。

var urls = ["https://facebook.com", "https://google.com"]
urls.forEach((url) => 
    window.open(url)
)

但是,如果 JS 有一些延迟,比如说 500 毫秒,它可以正常工作。两个对话框都加载各自的 url。

urls.forEach((url, i) => 
     setTimeout(()=>
         window.open(url)
     , 500 * i)      
)

由于我无法在原始代码中添加延迟,我该如何解决这个问题?这是 android 的 WebView 和 WebChromeClient 的限制吗?

【问题讨论】:

【参考方案1】:

看起来这是一个已知问题。我不得不在这里提出一个错误: https://issuetracker.google.com/issues/142909856

谷歌团队指出它是已知问题,他们一直在这里跟踪: https://crbug.com/1002727

【讨论】:

以上是关于从 Android 的 webview 同时处理 window.open() 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

处理文件选择器 android 6.0 webview

WebView性能优化--独立进程

android中webview loadUrl(String url,Map header)方法和postUrl(String url,byte[] postData)方法同时使用问题;

Android:在 Webview 中显示图像

在 android 应用中处理 textview 和 webview 链接

Android:控件WebView显示网页