【问题标题】:Pause JavaScript execution in UIWebView在 UIWebView 中暂停 JavaScript 执行
【发布时间】:2012-01-20 19:42:16
【问题描述】:

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

所以,问题是:

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

【问题讨论】:

    标签: javascript objective-c ios animation uiwebview


    【解决方案1】:

    您是否尝试过注入观察onbluronfocuswindowpageshowpagehide 的JavaScript(即- (NSString*) stringByEvaluatingJavaScriptFromString: (NSString *)script)? This 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);
    

    【讨论】:

      【解决方案2】:

      我猜你可以控制在 HTML 中运行的动画 javascripts(你说页面是本地的)。我要做的是将动画包装在一个 JS 函数中,该函数将从 Cocoa 调用(在 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?)

      【讨论】:

        【解决方案3】:

        也许您可以尝试评估(使用stringByEvaluatingJavaScriptFromString)故意出错的 javascript 代码片段并导致 js-解释器阻塞?

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

        【讨论】:

          猜你喜欢
          • 2019-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-08
          • 1970-01-01
          • 2019-04-23
          相关资源
          最近更新 更多