暂停UIWebView中的JavaScript执行

时间:2012-01-20 19:42:16

标签: javascript objective-c ios animation uiwebview

我将多个UIWebView并排放入UIScrollView。每个UIWebView都包含一个显示本地HTML文件的“Web浏览器”视图。不幸的是,我不知道如何在后台加载webview,同时阻止或阻止JavaScript函数执行包含在HTML文件中。我的意思是“在后台”我观看前几个面板,同时剩下的面板只是懒得加载。我看到不同的应用程序(如pugpig)这样做 - 它延迟加载HTML页面并停止JavaScript动画 - 它可以某种方式阻止JavaScript动画我在我的HTML页面中切换选项卡之间经常使用的整个淡入淡出效果我加载面板继续淡入淡出动画。

所以,问题是:

如何使用Objective-C代码暂停JavaScript动画并防止出现内存问题?如何在显示面板后继续淡入淡出动画?

3 个答案:

答案 0 :(得分:4)

您是否尝试过注入{onblur}来观察onfocuswindowpageshow的{​​{1}}和pagehide- (NSString*) stringByEvaluatingJavaScriptFromString: (NSString *)script为此提出了几个解决方案。

所以,你可以试试像

这样的东西
$(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);

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

也许你可以尝试评估(使用stringByEvaluatingJavaScriptFromString)一个故意错误的javascript代码片段并导致js-interpreter窒息?

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