javascript jquery mobile中的内存管理与phonegap

时间:2013-06-10 21:01:07

标签: javascript jquery-mobile memory-management cordova

我正在构建一个jquery mobile + phonegap应用程序来捆绑iOS。 JQM站点/应用程序在Web浏览器上正常工作。但是,当捆绑phonegap并在手机上测试时,它似乎忘记了javascript功能。 例如,我在滑动时打开/关闭面板。在几次滑动之后,~10打开/关闭,它不再响应滑动。我无法打开面板。其他按钮仍然可以使用,但我无法获得该面板。

在计算机或网络应用程序上,我可以整天完成,而不会冻结。我的javascript中是否有可能清除函数的东西?或者我应该以不同的方式定义它们吗?

$(document).on('pageinit', '#page', function() {
  $(document).on("swipeleft swiperight", "#page", function(e) {
    console.log('swiped!!')
  });
});

有什么想法吗?

更新:

显然它只是“忘记”这个功能,当我连续来回做~10次尝试时。如果我在每次滑动之间留下〜2-3秒的暂停,它似乎可以工作更长时间。也许新的滑动事件正在发生,而较旧的滑动事件仍在完成功能???这会导致他们纠结并冻结?我一直坚持这个。任何关于phonegap应用程序的javascript内存管理的帮助/见解都会很好。

1 个答案:

答案 0 :(得分:0)

所以,我找到了解决办法。

$(document).on('pageinit', '#page', function() {
 $(document).on("swipeleft swiperight", "#page", function(e) {
   console.log('swiped!!')
 });
});

这是我发布的伪代码。事实证明,每次滑动都会调用console.log msg,但上面代码中省略的面板打开/关闭调用却没有。

这是完整的旧代码:

$(document).on('pageinit','#page', function(){
  $(document).on("swipeleft swiperight", "#page", function(e) {
    console.log('swiped!!')
    // We check if there is no open panel on the page because otherwise
    // a swipe to close the left panel would also open the right panel (and v.v.).
    // We do this by checking the data that the framework stores on the page element (panel: open).
    if ($.mobile.activePage.jqmData( "panel" ) !== "open") {
      if ( e.type === "swipeleft"  ) {
        $( "#right-panel" ).panel( "open" );
      } else if ( e.type === "swiperight" ) {
        $( "#left-panel" ).panel( "open" );
      }
    }
    else if ($.mobile.activePage.jqmData( "panel" ) == "open"){
      $( "#left-panel" ).panel( "close" );
      $( "#right-panel" ).panel( "close" );
    }
  });
}

这些更改修复了代码: 将选择器从swipeleft swiperight功能中取出 $(document).on("swipeleft swiperight", "#page", function(e) {}成为$(document).on("swipeleft swiperight", function(e) {} 我在活动上添加了e.stopPropagation()。我认为必须是JQM事件传播冒泡DOM并打破一切。

    $(document).on('pageinit', '#page', function() {
  $(document).on("swipeleft swiperight", function(e) {
    e.stopPropagation();
    console.log('swiped!!')
    // We check if there is no open panel on the page because otherwise
    // a swipe to close the left panel would also open the right panel (and v.v.).
    // We do this by checking the data that the framework stores on the page element (panel: open).
    if ($.mobile.activePage.jqmData( "panel" ) !== "open") {
      if ( e.type === "swipeleft"  ) {
        $( "#right-panel" ).panel( "open" );
      } else if ( e.type === "swiperight" ) {
        $( "#left-panel" ).panel( "open" );
      }
    }
    else if ($.mobile.activePage.jqmData( "panel" ) == "open"){
      $( "#left-panel" ).panel( "close" );
      $( "#right-panel" ).panel( "close" );
    }
  });
    }