确定stringByEvaluatingJavaScriptFromString何时完成
我有一个确定stringByEvaluatingJavaScriptFromString何时完成,javascript,iphone,uiwebview,Javascript,Iphone,Uiwebview,我有一个UIWebView,它可以加载一个HTML页面。这个页面上有两个按钮,比如退出和提交。我不希望用户能够单击Exit按钮,因此一旦页面完成加载(即调用webViewDidFinishLoad),我就可以通过操纵HTML使用stringByEvaluatingJavaScriptFromString删除其中一个按钮。我还禁用了webViewDidStartLoad上的UIWebView上的用户交互,并在webviewdiffinishload上再次启用它 我发现的问题是stringByEva
UIWebView
,它可以加载一个HTML页面。这个页面上有两个按钮,比如退出和提交。我不希望用户能够单击Exit按钮,因此一旦页面完成加载(即调用webViewDidFinishLoad
),我就可以通过操纵HTML使用stringByEvaluatingJavaScriptFromString
删除其中一个按钮。我还禁用了webViewDidStartLoad
上的UIWebView
上的用户交互,并在webviewdiffinishload
上再次启用它
我发现的问题是stringByEvaluatingJavaScriptFromString
需要一两秒钟才能完成,而且似乎是在它自己的线程中完成的。因此,调用webViewDidFinishLoad
,在UIWebView
上启用用户交互,如果用户很快,他们可以在stringByEvaluatingJavaScriptFromString
完成之前单击退出按钮。由于stringByEvaluatingJavaScriptFromString
似乎是在它自己的线程上,无法知道它何时完成(它不调用webViewDidFinishLoad
),因此完全防止用户点击我看到的退出按钮的唯一方法是在延迟一段时间后只在UIWebView上启用用户交互,这是不可靠的(我怎么知道要延迟多久?)
我的stringByEvaluatingJavaScriptFromString
是在线程上完成的,我无法判断何时完成,这是正确的吗?对于如何解决这个问题,还有其他建议吗
EDIT:简而言之,我想知道的是,在执行stringByEvaluatingJavaScriptFromString
时,是否可以禁用UIWebView
,并在javascript完成后重新启用UIWebView
编辑2:这里有一篇文章似乎暗示你可以通过某种方式轮询JS引擎,看看它什么时候完成,但我找不到任何其他参考文献说同样的话:
编辑3根据Brad Smith的回答,似乎我实际上需要知道在javascript执行后UIWebView何时完成了自身加载。它看起来越来越像我只需要在那里设置一个延迟。您可以将注入的javascript放入页面,尝试将页面导航到其他位置(document.location=“foo”),并使用webView:ShouldLoadRequest:查找该请求并返回no以及触发所需的操作(通常返回yes)。stringByEvaluatingJavascriptFromString在返回时必须执行。它可以在不同的线程上执行(可能不会,因为它可以更改UI),但该方法在返回结果之前无法返回字符串结果。执行stringByEvaluatingJavascriptFromString后,您可以尝试以下代码来解决问题
webView.userInteractionEnabled = NO;
while (webView.loading) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.2]];
}
webView.userInteractionEnabled = YES;
让我知道它是否适合您。将onclick事件的存根函数直接内联到html元素上如何。您可以稍后在更合适的时候将html元素绑定到onclick事件处理程序函数
<button onclick="function () { };"/>
是的,我意识到在webview返回之前javascript无法完成。请查看我编辑的问题,以澄清我的问题。遗憾的是,这似乎对我不起作用。我在注入的javascript的最后添加了document.location调用,但似乎在退出按钮消失之前调用了它。我似乎JS已经运行了,但是WebView还没有完成更改。这里也是同样的问题!你的解决方案是什么?我相信我不得不求助于假设这将需要一定的时间,并将我的处理延迟至少相当长的时间。同样的问题。哎哟,必须有更好的方法来做到这一点。你能我有一些示例代码吗?仅凭您的描述就有点难以理解。顺便说一句,javascript是单线程的;浏览器使用任务调度程序(请参阅setTimeout())来模拟多个线程。据我所知,StringByEvaluating JavaScriptFromString异步运行(将某些逻辑/功能委托给任务调度器)并希望它同步运行(防止它在每个功能执行之前返回)。