2012-01-20 42 views
10

我将多个UIWebView并排放入UIScrollView中。每个UIWebView都包含一个显示本地HTML文件的“Web浏览器”视图。不幸的是,我不知道如何在后台加载Web视图,并且同时阻止或停止执行包含在HTML文件中的JavaScript函数。我的意思是“在背景中”,因为我看着前几个面板,同时其余面板只是懒惰地加载。我看到了不同的应用程序(如pugpig)这样做 - 它懒惰地加载HTML页面并停止JavaScript动画 - 它可以以某种方式阻止JavaScript来动画整个淡入淡出效果,我经常在我的HTML页面中使用Tab切换和当前我加载它继续淡出动画的面板。在UIWebView中暂停JavaScript执行

所以,问题是:

如何暂停一个JavaScript动画和使用Objective-C代码,防止内存的问题,我如何能继续的动画渐变一旦我显示面板?

回答

4

您是否尝试过注射的JavaScript(即- (NSString*) stringByEvaluatingJavaScriptFromString: (NSString *)script)是观察onblurwindowonfocus,或pageshowpagehideThis post提出了一些解决方案。

所以,你可以尝试像

$(window).blur(function(){ 
    // when the web view loses focus 
}); 
$(window).focus(function(){ 
    // when the web view gains focus 
}); 

如果失败,你可以尝试pagehidepageshow事件:

function pageShown(evt) 
{ 
    if (evt.persisted) 
     // The page was just restored from the Page Cache 
    else 
     // The initial load. This is the same as the page load event 
} 

function pageHidden(evt) 
{ 
    if (evt.persisted) 
     // The page was suspended and placed into the Page Cache 
    else 
     // This is the same as the page unload event 
} 

window.addEventListener("pageshow", pageShown, false); 
window.addEventListener("pagehide", pageHidden, false); 
0

也许你可以(使用stringByEvaluatingJavaScriptFromString)有目的,有故障请评价JavaScript代码片段并导致js解释器窒息?

<script> var j =  // note: missing value, error! 
</script> 
1

我想你可以控制在HTML中运行的动画javascripts(你说的页面是本地的)。我要做的是将动画封装在一个JS函数中,该函数可以从Cocoa调用(在StackOverFlow上有很多引用,例如- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script)。

然后,我会创建一个堆栈,为每个想要延迟加载的HTML页面创建一个记录。在每个UIScrollView scrollViewDidScroll:上,我会检查整个webview大小的滚动是否已经执行,如果是的话,我会从堆栈中弹出该记录并调用我们之前在下一个webview中提到的Javascript startAnimation函数。

如果您需要双向通信(从javascript到可可),例如以表明动画已完成,您可以使用JSBridge。 (How do I call an Objective-C method from JavaScript on UIWebView?