确定stringByEvaluatingJavaScriptFromString何时完成

时间:2011-01-14 07:07:17

标签: javascript iphone uiwebview

我有UIWebView加载HTML页面。此页面上有两个按钮,例如退出和提交。我不希望用户能够单击“退出”按钮,因此一旦页面加载完毕(即。webViewDidFinishLoad被调用),我使用stringByEvaluatingJavaScriptFromString删除其中一个按钮,通过操作HTML。我还在UIWebView上的webViewDidStartLoad上禁用了用户互动,并在webViewDidFinishLoad上再次启用。

我发现的问题是stringByEvaluatingJavaScriptFromString需要一两秒才能完成,而且它似乎是在它自己的线程中完成的。所以发生的事情是调用webViewDidFinishLoad,在UIWebView上启用用户交互,如果用户很快,他们可以在stringByEvaluatingJavaScriptFromString完成之前单击退出按钮。由于stringByEvaluatingJavaScriptFromString似乎是在它自己的线程上,无法知道它何时完成(它不会调用webViewDidFinishLoad),完全阻止用户点击我可以看到的退出按钮的唯一方法是经过一段时间的延迟后才能在UIWebView上启用用户交互,这是不可靠的(我怎么能真正知道延迟多长时间?)。

我是否正确,因为stringByEvaluatingJavaScriptFromString是在线程上完成的,我无法告诉它什么时候结束?关于如何解决这个问题的任何其他建议?

编辑:简而言之,我想知道的是,在执行UIWebView时是否可以禁用stringByEvaluatingJavaScriptFromString,并重新启用{{1当javascript完成时。

编辑2:这里有一篇文章似乎暗示你可以以某种方式轮询JS引擎以查看它何时完成,但我找不到任何其他引用说同样的事情:{{ 3}}

编辑3 根据Brad Smith的回答,似乎我确实需要知道UIWebView在javascript执行后何时完成加载。它看起来越来越像我只需要在那里放一些延迟。

4 个答案:

答案 0 :(得分:2)

你可以将javascript注入页面,尝试在其他地方导航页面(document.location =“foo”),并使用webView:ShouldLoadRequest:查找该请求并返回no以及触发什么你需要(并且通常返回是)。

答案 1 :(得分:2)

执行stringByEvaluatingJavascriptFromString后,您可以尝试下面的代码来解决您的问题

webView.userInteractionEnabled = NO;
while (webView.loading) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
webView.userInteractionEnabled = YES;

让我知道它是否适合你。

答案 2 :(得分:2)

如何直接在html元素上为onclick事件内联存根函数。您可以在以后更合适时将html元素绑定到onclick事件处理函数。

<button onclick="function () { };"/>

答案 3 :(得分:1)

stringByEvaluatingJavascriptFromString在返回时必须完成。它可以在不同的线程上完成(可能不会因为它可以更改UI),但是该方法在返回结果之前不能返回字符串结果。