2011-01-14 57 views
13

我有一个加载了HTML页面的UIWebView。此页面上有两个按钮,说退出和提交。我不希望用户能够点击退出按钮,因此一旦页面完成加载(即调用webViewDidFinishLoad),我使用stringByEvaluatingJavaScriptFromString通过操作HTML来删除其中一个按钮。我还禁用webViewDidStartLoad上的UIWebView上的用户交互,并在webViewDidFinishLoad上再次启用它。确定stringByEvaluatingJavaScriptFromString何时完成

我发现的问题是stringByEvaluatingJavaScriptFromString需要一两秒钟才能完成,而且似乎是在它自己的线程中完成的。所以发生的是webViewDidFinishLoad被调用,用户交互在UIWebView上被启用,并且如果用户很快,他们可以在stringByEvaluatingJavaScriptFromString完成之前单击退出按钮。由于stringByEvaluatingJavaScriptFromString似乎是在它自己的线程上,无法知道它何时完成(它并没有调用webViewDidFinishLoad),所以完全阻止用户点击Exit按钮的唯一方法是我只能在UIWebView之后启用用户交互有些延迟,这是不可靠的(我怎么才能知道延迟多久?)。

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

编辑:总之,我想知道的是,如果有可能禁用UIWebViewstringByEvaluatingJavaScriptFromString正在执行,并在JavaScript是完成重新启用UIWebView

编辑2:这里有一篇文章,这似乎意味着你能以某种方式查询JS引擎看的时候,它的完成,但我无法找到任何其他文献说同样的事情:http://drnicwilliams.com/2008/11/10/to-webkit-or-not-to-webkit-within-your-iphone-app/

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

+2

同样的问题在这里!你的解决方案是什么? – 2013-04-09 11:35:29

+0

我相信我不得不假设它会花费一定的时间,并延迟至少这段时间的处理。 – 2013-04-09 23:42:36

+1

同样的问题。哎唷,必须有更好的方法来做到这一点。 – 2013-07-01 22:56:57

回答

2

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

1

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

2

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

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

让我知道它为你工作或没有。

2

如何直接在html元素上为onclick事件内联一个存根函数。稍后,您可以将html元素绑定到onclick事件处理函数。

<button onclick="function() { };"/> 
相关问题