【问题标题】:Issue while handling simultaneous window.open() from Android's webview从 Android 的 webview 同时处理 window.open() 时出现问题
【发布时间】: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 的限制吗?

【问题讨论】:

    标签: android android-webview popupwindow window.open webchromeclient


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多