iPhone:我如何知道UIWebView已完全加载?

7

是的,我知道UIWebView有didFinishedLoad和didStartLoad代理。

然而,didFinishedLoad并不意味着完全加载完成。当UIWebView完成加载其中一个项目时,它可能会调用该方法。也就是说,加载单个页面时,UIWebView可能会多次调用此代理。

那么,有什么方法可以检查UIWebView是否已经完全加载?

谢谢

J


你先看过这个吗?https://dev59.com/A3I-5IYBdhLWcg3wc4Gw - phi
3个回答

11

我对DOM的经验很差,但是在搜索后,我发现document.readyState是一个很好的选择。

来自w3schools:

定义和用法 readyState属性返回当前文档的(加载)状态。

该属性返回四个值之一:

uninitialized - 尚未开始加载

loading - 正在加载

interactive - 已经加载了足够的内容,用户可以进行交互

complete - 完全加载

所以我使用它来知道UIWebView何时已加载文档:

- (void)readyState:(NSString *)str
{ NSLog(@"str:%@",str);

if ([str isEqualToString:@"complete"]||[str isEqualToString:@"interactive"]) {
    NSLog(@"IT HAS BEEN DONE");
    [pageLoadingActivityIndicator stopAnimating];
}

}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
 //other code...
 [self readyState:[browserWebView stringByEvaluatingJavaScriptFromString:@"document.readyState"]];
}

if ([str isEqualToString:@"complete"]||[str isEqualToString:@"interactive"]) 是唯一对我有效的方法! - Mohamed A.Karim
1
我从一个网页上仅获得了“已完成”日志27次。因此,我无法说它按照我的期望工作。 - Yucel Bayram
当网页有iframe或其他内部元素时,实际上是与请求的网页同时加载的网页,则“完成”消息将会被传递多次。此外,还可能有其他修改“document.readyState”的因素。这种方法对于简单的网页效果很好。 - Stanislav S.
感谢 @StanislavS。 - Yucel Bayram

6

http://www.codingventures.com/2008/12/using-uiwebview-to-render-svg-files/ 关于JavaScript与Objective-C代码通信的使用方法。

也许可以使用文档位置哈希。

并在Web视图HTML正文中添加:

<body onload="document.location.hash='myapp:myobject:myfunction';">

我知道这样有点hacky,但它是有效的。并且可以在基于ajax的内容中使用,因为你可以在你想要调用准备方法的时候自己决定。或者它可以用作完整的通信方案。


0
你可以在可见的状态栏上显示一个网络指示器,以此来展示正在加载页面。当页面正在加载时,指示器将继续旋转,直到页面完全加载完成。当页面完全加载完成后,指示器将停止旋转并变为不可见。
看一下这个例子:网络指示器

2
是的,@Nitish,我知道那个网络指示器。但我的问题是如何通过代码找到UIWebView的完全加载状态,而不是通过肉眼观察。谢谢。 - Jackson Tale
它的可见性是否可以查询? - Timo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接