从 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中webview loadUrl(String url,Map header)方法和postUrl(String url,byte[] postData)方法同时使用问题;