2017-10-16 8 views
0

私は周りを検索しようとしましたが、わかりやすいトピックが見つかりませんでした。 私はJavascriptや一般的なコーディングに慣れていません。jQuery-Mobile外部パネルは常にページ間で開きます

私はjqueryのモバイル1.4.5を使用していますが、これは私の問題です:

私は外部のパネルが正常に動作させることはできません。最初のページにパネルが表示されますが、ページを変更すると意図したとおりに表示されません。私の計画は、パネルをJqueryモバイルデモページと同じように動作させることです。

リンク:あなたはパネルが常に彼らが何であるかのページに関係なく表示されていない見ることができますJquery Mobile Demo

ここで、私は彼らがそのサイト上の外部パネルを使用していないが分かったが、それはまだ可能でなければなりません。私のサイトは、現時点ではどのように動作する

  1. パネルの作業だけで罰金、新しいページ(#page_kodiまたは#page_download)を入力すると、最初のページ(#page_home)
  2. をロードし、それが自動的に表示されません。思惑通り。
  3. 私は#page_kodiまたは#page_downloadを入力して、手動で意図したとおり、これは奇妙な部分です
  4. 起動したまま、それを持ち出す:私は(パネル開いて)から行くときは、(メインページを#page_homeする#page_kodiする#page_download ) できます。
  5. #page_homeから別のページに移動すると動作しません。

これは私のパネル用のJSコードですが、これを書くには良い方法があると確信していますが、そのいくつかは必要ありません。

Javascriptを:私は私のHTMLファイル内のすべてのこれらを配置している

<script> 
    <!-- Creates the panels & navbars/Tabs --> 
    $(document).on("pagecreate", function() { 
     $("body > [data-role='panel']").panel(); 
     $("body > [data-role='panel'] [data-role='listview']").listview(); 
    }); 
    $(document).on("pageshow", function() { 
     $("body > [data-role='header']").toolbar(); 
     $("body > [data-role='header'] [data-role='navbar']").navbar(); 
    }); 
    </script> 

<script> 
$(document).on("pagebeforeshow", function(event, data) { 
    $('#leftpanel').panel("open"); 
}) 
</script> 

<script> 
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) { 
$(document).on("pagebeforecreate", "#page_home", function() { 
    $("#leftpanel").panel({ dismissible: true }); 
    $("#leftpanel").panel("close"); 
}); 
} 
</script> 

<script> 
$(document).on("pagecreate", "#page_home", function() { 
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) { 
setTimeout(function(){ 
    $('#leftpanel').panel("close"); 
}, 500); 
} 
}); 
</script> 

<script> 
$(document).on("pagebeforecreate", "#page_home", function() { 
    $("#leftpanel").panel({ dismissible: false }); 
}); 
</script> 

<script> 
$(document).on("pagebeforecreate", "#page_download", function() { 
    $(".leftpanel").panel("option", "dismissible", false); 
    $('#leftpanel').panel("open"); 
}); 
</script> 

<script> 
$(document).on("pagebeforecreate", "#page_kodi", function() { 
    $("#leftpanel").panel("option", "dismissible", false); 
    $('#leftpanel').panel("open"); 
}); 
</script> 

<script> 
/* Left & Right swipe gestures to open panels*/ 
$(document).on("pagecreate", function() { 
if(/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent)) { 
    $(document).on("swipeleft swiperight", function(e) { 
     if ($(".ui-page-active").jqmData("panel") !== "open") { 
      if (e.type === "swipeleft") { 
       $("#rightpanel").panel("open"); 
      } else if (e.type === "swiperight") { 
       $("#leftpanel").panel("open"); 
      } 
     } 
    }); 
    } 
}); 
</script> 

HTMLパネル:それはあなたがJSを手動で設定する、またはので、私が読んだ時にどのような作品ですので、私はそれをこのように入れている

<div style="margin-top: 0px; background-color: #212120;" class="customlist panel-open" data-role="panel" data-position="left" data-dismissible="" data-display="overlay" data-theme="none" id="leftpanel"> 
    <ul data-role="listview" data-inset="false"> 
MY CONTENT HERE 
</ul> 
</div> 

データdismissible =「」。私がそれを偽にしたり、真実にしたりするとうまくいかなかった。

私がここでやろうとしていることは、常に大きな画面ではパネルを開き、小さい画面ではスワイプで開くようにすることです。これは今のところうまくいきます。私が抱えている問題は、ページを変更するときにパネルが意図したとおりに動作せず、フロントページから別のページに移動するときに閉じることです。パネル - - いくつかのポップアップ

page_download

page_kodi

page_home

PS:私はまた、このように私のページのうちの2つの間にパネルを入れています

あなたがテキストの壁に与えることができ、ごめんなさい、すべての助けを前もってありがとう。

+0

'$(document).ready'の中でパネルを作成してください。ご利用のページイベントを理解するには、[jQuery Mobileの "ページ"イベント - 何を、なぜ、どこで、いつ&どのように? "(https://jqmtricks.wordpress.com/2014/03/26)を読んでください。/jquery-mobile-page-events /) – deblocker

+0

こんにちは、ありがとうございます。私は今それを読んだが、まだそれを働かせなかった。 ページを変更するとパネルが自動的に消えてしまい、ページを変更しても開いたままにしています。サイドナビゲーションバーとして。 あなたがリンクしたサイトのヒントでそれを見たが、正しく機能しません。何か案は? – Connor

+0

...もう1つのオプションは、1ページだけを使用し、コンテンツにajaxを使用することです。ここでは、外部パネルと応答のあるコンテンツを持つページを表示する謎です:http://jsfiddle.net/e6Cnn/38/ – deblocker

答えて

0

単一ページモデルを使用していると仮定すると、PanelのJQMプロジェクト用の単純なスタブは、異なるページ間で開いたままにすることができます。デフォルト動作は、mobile.panelウィジェットの_bindPageEvents関数をオーバーライドすることによってパラメータ化されています。そのため、フラグを設定することができます。

useragent文字列をスプーフィングするか、ビューポートの幅を確認することで(おそらくそれ以上)、stayAlwaysOpenフラグを好きなように設定できます。また、その目的のためにCSSブレークポイントをチェックすることもできます。

ヘッダーナビゲーションを維持してパネルをいくらか快適にするために、jQuery mobile panel between header and footer(クレジット:Omar)の関数scalePanelToContentも使用しました。

var stayAlwaysOpen = true; 
 

 
$.widget("mobile.panel", $.mobile.panel, { 
 
    _bindPageEvents: function() { 
 
    var self = this; 
 

 
    this.document 
 
     // Close the panel if another panel on the page opens 
 
     .on("panelbeforeopen", function(e) { 
 
     if (self._open && e.target !== self.element[0]) { 
 
      self.close(); 
 
     } 
 
     }) 
 
     // On escape, close? might need to have a target check too... 
 
     .on("keyup.panel", function(e) { 
 
     if (e.keyCode === 27 && self._open) { 
 
      self.close(); 
 
     } 
 
     }); 
 
    if (!this._parentPage && this.options.display !== "overlay") { 
 
     this._on(this.document, { 
 
     "pageshow": function() { 
 
      this._openedPage = null; 
 
      this._getWrapper(); 
 
     } 
 
     }); 
 
    } 
 
    // Clean up open panels after page hide 
 
    if(stayAlwaysOpen) return; 
 
    if (self._parentPage) { 
 
     this.document.on("pagehide", ":jqmData(role='page')", function() { 
 
     if (self._open) { 
 
      self.close(true); 
 
     } 
 
     }); 
 
    } else { 
 
     this.document.on("pagebeforehide", function() { 
 
     if (self._open) { 
 
      self.close(true); 
 
     } 
 
     }); 
 
    } 
 
    } 
 
}); 
 

 
function scalePanelToContent() { 
 
    var screenH = $.mobile.getScreenHeight(); 
 
    var headerH = $(".ui-header").outerHeight() - 1; 
 
    var footerH = $(".ui-footer").outerHeight() - 1; 
 
    var panelH = screenH - headerH - footerH; 
 
    $(".ui-panel").css({ 
 
    "top": headerH, 
 
    "bottom": footerH, 
 
    "min-height": panelH 
 
    }); 
 
} 
 

 
$(document).ready(function() { 
 

 
    $("[data-role='header'], [data-role='footer']").toolbar({ 
 
    theme: "a", 
 
    position: "fixed", 
 
    tapToggle: false 
 
    }); 
 

 
    $("#nav-panel").panel({ 
 
    theme: "b", 
 
    display: "overlay", 
 
    position: "left", 
 
    positionFixed: true, 
 
    swipeClose: false, 
 
    dismissible: false 
 
    }).enhanceWithin(); 
 

 
    $("#nav-panel").on("panelbeforeopen", function(event, ui) { 
 
    scalePanelToContent(); 
 
    $(".ui-content").animate({ 
 
     "margin-left": "17em" 
 
    }, 300, "swing"); 
 
    }); 
 

 
    $("#nav-panel").on("panelbeforeclose", function(event, ui) { 
 
    $(".ui-content").removeClass("panel-shrink").animate({ 
 
     "margin-left": "0" 
 
    }, 300, "swing", function() { 
 
     $(this).removeAttr("style"); 
 
    }); 
 
    }); 
 

 
    scalePanelToContent(); 
 
}); 
 

 
$(window).on("resize", function() { 
 
    scalePanelToContent(); 
 
}); 
 

 

 
$(document).on("pagecontainerbeforeshow", function(e, ui) { 
 
    var isPanelOpen = $("#nav-panel").hasClass("ui-panel-open"); 
 
    $(".ui-content").toggleClass("panel-shrink", isPanelOpen); 
 
});
.panel-shrink { 
 
    margin-left: 17em !important; 
 
}
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> 
 
    <link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.css"> 
 
    <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> 
 
    <script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.js"></script> 
 
</head> 
 

 
<body> 
 
    <div data-role="header"> 
 
    <a href="#nav-panel" data-icon="bars" data-iconpos="notext">Menu</a> 
 
    <h2>Header</h2> 
 
    </div> 
 
    <div data-role="footer"> 
 
    <h2>Footer</h2> 
 
    </div> 
 

 
    <div data-role="page" id="page-1"> 
 
    <div data-role="content"> 
 
     <form> 
 
     <fieldset data-role="controlgroup"> 
 
      <legend>Vertical:</legend> 
 
      <input name="checkbox-v-2a" id="checkbox-v-2a" type="checkbox"> 
 
      <label for="checkbox-v-2a">One</label> 
 
      <input name="checkbox-v-2b" id="checkbox-v-2b" type="checkbox"> 
 
      <label for="checkbox-v-2b">Two</label> 
 
      <input name="checkbox-v-2c" id="checkbox-v-2c" type="checkbox"> 
 
      <label for="checkbox-v-2c">Three</label> 
 
     </fieldset> 
 
     </form> 
 
    </div> 
 
    </div> 
 
    <div data-role="page" id="page-2"> 
 
    <div data-role="content"> 
 
     <ul data-role="listview" data-inset="true"> 
 
     <li><a href="#">Acura</a></li> 
 
     <li><a href="#">Audi</a></li> 
 
     <li><a href="#">BMW</a></li> 
 
     <li><a href="#">Cadillac</a></li> 
 
     <li><a href="#">Ferrari</a></li> 
 
     </ul> 
 
    </div> 
 
    </div> 
 
    <div data-role="page" id="page-3"> 
 
    <div data-role="content"> 
 
     Page 3 
 
    </div> 
 
    </div> 
 
    <div data-role="panel" id="nav-panel"> 
 
    <ul data-role="listview"> 
 
     <li><a href="#page-1">Link #1</a> 
 
     </li> 
 
     <li><a href="#page-2">Link #2</a> 
 
     </li> 
 
     <li><a href="#page-3">Link #3</a> 
 
     </li> 
 
    </ul> 
 
    </div> 
 

 
</body> 
 

 
</html>

ただ、最後のヒント:

パネルはまた、モバイルデバイスとデスクトップのブラウザで同じ動作を維持するように、あなたは、あなたのスワイプイベント内で同じstayAlwaysOpenフラグを使用することができます小さなウィンドウサイズの場合

+0

ありがとうございました!私は朝、まずそれを試してみる。私は、私が間違っていたことをもう少し理解していると思うが、明日より詳細に行きます。私はこれを述べたはずですが、私はフッターやヘッダーをもう使用しません。サイドパネルのナビゲーションが必要な理由の一部です。私は私のサイトのためのより多くの "ダッシュボード"の感触を構築しようとしています。しかし、スタイリングはCSSで起こるので、私はそれを理解します。私はそれについてすべて間違って行った、それは確かです。だから、ありがとう! – Connor

関連する問題