Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确定Android WebView何时完成加载?_Javascript_Android_Webview - Fatal编程技术网

Javascript 如何确定Android WebView何时完成加载?

Javascript 如何确定Android WebView何时完成加载?,javascript,android,webview,Javascript,Android,Webview,我想知道如何确定Web视图何时完全加载完毕 让我完整地定义 所有重定向都已发生 页面已显示,但尚未加载任何内容 这个问题的错误答案是: WebViewClient.onPageFinished()-如果存在加载页面的重定向,则会触发多次。它还将在显示页面之前激发 PictureListener.onNewPicture()-每次屏幕更改和每次重定向时都会触发此命令。我怎么知道哪一枪是最后一枪 WebChromeClient.onProgressChanged()-问题与onPageFinis

我想知道如何确定Web视图何时完全加载完毕

让我完整地定义

  • 所有重定向都已发生
  • 页面已显示,但尚未加载任何内容
这个问题的错误答案是:

WebViewClient.onPageFinished()
-如果存在加载页面的重定向,则会触发多次。它还将在显示页面之前激发

PictureListener.onNewPicture()
-每次屏幕更改和每次重定向时都会触发此命令。我怎么知道哪一枪是最后一枪

WebChromeClient.onProgressChanged()
-问题与onPageFinished相同。(在David提出以下解决方案后添加)

Thread.sleep(5000)
-应该是显而易见的,为什么这是不可接受的

当然,将上述方法巧妙地结合起来,效果会更好

你问我为什么要知道这个?
因为我想在webview加载完成后一次性注入一些javascript。

您是否考虑过设置自己的WebChromeClient

它看起来可能会在页面完全加载时通知您


这似乎是Android内置浏览器使用的方法。

感谢David Caunt提出的查看响应标题的建议

我发现以下方法非常有效:


与其让webview执行HTTP请求,不如自己执行,这样您就可以检查HTTP状态代码中的重定向。遵循重定向链。当您收到一个不是重定向的请求时,设置一个标志,并通过
webview.loadDataWithBaseURL
将数据发送到webview。该标志在
WebViewClient.onPageFinished()
中被选中,因此它知道所有重定向都已完成。此时可以注入javascript。当然,此时页面本身可能正在进行一些javascript操作,这很难知道,因此向javascript添加延迟(比如500毫秒)可以让DOM稳定下来<代码>设置超时(函数(){/*您的代码*/},500)

谢谢您的建议。不幸的是,这与WebViewClient.onPageFinished()存在相同的问题,由于重定向,它会多次触发。例如,在“gmail.com”上,当进度=100时,它会触发3次。下一个0进度值何时出现?如果它在响应发出重定向后立即触发,则可以安全地使用超时并假定您是最后一个请求。否则,我会寻找一种方法来获取响应头或类似的东西。知道这些很有用!至于页面自己的javascript,很难检测何时完成。@Carlos Rendon+1提供了一个很好的提纲。我很惊讶WebView或其任何卫星接口都没有实现这一点。这个特性是如此的需要,然而WebView的人们唯一能做的就是反对PictureListener。知道为什么吗?当我这么做的时候,我发现我并不是唯一一个梦寐以求的人。添加到你的
WebViewClient.onPageFinished()
“错误答案”:根据,如果你在一个页面中有多个iFrame,它也会触发多次。@Carlos Man与你的位置完全相同。唯一让我的情况更糟的是PictureListener被弃用了。你能想出解决办法吗?我必须计算webview中需要将内容宽度除以屏幕宽度的页面总数。但我不能这样做,直到页面完全呈现在屏幕上。有什么解决办法吗?@ArunavhKrishnan我上次看这个是三年前的事了。最后,我想我做了一些类似于公认答案的事情。祝你好运您可以使用立即调用的函数表达式(IIFE)或添加侦听DOM就绪事件的事件侦听器,而不是在页面加载完成后注入JavaScript。有
DOMContentLoaded
以及
window.onload
document.ready