2

iOS用にバンドルするjquery mobile + phonegapアプリを構築しています。JQM サイト/アプリは、Web ブラウザー上で正常に動作します。ただし、phonegap にバンドルして電話でテストすると、javascript 関数を忘れているようです。たとえば、スワイプでパネルを開閉します。数回スワイプした後、〜10回開閉すると、スワイプに反応しなくなります。パネルが開けません。他のボタンはまだ機能していますが、パネルを取得できません。

コンピューターまたは Web アプリでは、フリーズすることなく 1 日中実行できます。私のjavascriptから関数をクリアするものはありますか? それとも、別の方法で定義する必要がありますか?

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

何か案は?

アップデート:

どうやら、約10回の試行で一貫して行ったり来たりすると、機能を「忘れる」だけです。各スワイプの間に〜2〜3秒の一時停止を残すと、はるかに長く正常に機能するようです. 古いスワイプイベントがまだ機能を完了している間に、新しいスワイプイベントが発生している可能性がありますか??? そして、それが彼らを絡ませて凍らせているのですか?私はこれにちょっと行き詰まっています。phonegap アプリの JavaScript のメモリ管理に関するヘルプ/洞察があれば幸いです。

4

1 に答える 1

0

それで、私は修正を見つけました。

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

これは私が投稿した疑似コードです。スワイプごとに console.log メッセージが呼び出されていましたが、上記のコードで省略されていたパネルの開閉呼び出しは呼び出されていませんでした。

完全な古いコードは次のとおりです。

$(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" );
    }
  });
    }
于 2013-06-17T16:54:22.240 に答える