我是否必须为每个页面创建一个新面板?

我想在jqm网站中使用Panel来选择我的选择语言组件。 因此,每个页面都需要存在该组件。 以下是单页面板的设置。

来自jquerymobile.com (…我添加了一个标题按钮)

我认为我有3个解决方案:

jqm有办法将Panel从一个页面移动到另一个页面吗?

您最好的做法是为每个页面动态创建一个面板。

我给你做了一个工作的例子: http : //jsfiddle.net/Gajotres/pZzrk/

 $(document).on('pagebeforeshow', '[data-role="page"]', function(){ $(' 

几个描述:

  • $ .mobile.activePage是必需的,因为我们将在每个页面中都有相同的面板,并且所有这些面板都具有相同的ID。 如果我们打开它没有活动页面,我们将在DOM中打开它的第一个出现。

jQuery Mobile开发人员已经声明,在下一个主要版本面板小部件将不再需要成为页面的一部分,而是将其放置在与页面div相同的级别。 因此需要一个小组。 不幸的是,您需要动态创建它。

这是我提出的解决方案。 我将面板内容存储在隐藏的div中,并推迟jquery移动初始化。 加载文档时,我将面板内容附加到每个(jqm)页面元素,然后初始化jqm。 页面首次加载时会出现唯一的性能损失。

HTML:

 

One

show nav

Two

show nav

脚本:

 $.mobile.autoInitializePage = false; $(document).on("ready" function(evt) { var panelHtml = $("#panel-content").html(); var pages = $(".page"); for (var i = 0; i < pages.length; i++) { //done synchronously so we can initialize jquery mobile after the DOM is all setup $(pages[i]).append(panelHtml); } $("#panel-content").remove(); // this doesn't need to be in the DOM anymore $.mobile.initializePage(); }); 

我自己一直在努力解决这个问题,这是我正在使用的解决方案:

 $( ".page" ).on( "pageshow", function ( event, prevPage ) { var $page = $( this ), $prevPage = $( prevPage.prevPage ), $menuPanel = $( "#panel-menu", $prevPage ); $menuPanel .remove() .prependTo( $page ); $page.trigger( "create" ); } ); 

诀窍似乎是使用.remove()而不是.detach()来获取你想要移动的面板 – 没有任何存储的jQuery对象 – 这样jQuery Mobile就不会对标记做出假设。 此外,我觉得这个解决方案增加了DOM操作带来的巨大开销。 它并不理想,但确实有效。

编辑:请注意,它设置为适用于每个页面,并在加载第一页时触发,您可能会在其中开始菜单以及没有上一页对象的位置。 但你可能会把菜单放在别处,并在那里寻找它作为后备。

从Gajotres的灵感和AppFramework处理面板的方式我已经做到了这一点。 它的工作原理是将定义的面板复制到活动页面,面板由右侧面板中的id和页面div的左面板属性定义:

 $(document).on('pagebeforeshow', '[data-role="page"]', function(){ // remove unused tmp panels from DOM $("#tmpRightPanel").remove(); $("#tmpLeftPanel").remove(); // Hide buttons by default (I'm using a static header and footer on every page too) $("#openRightPanel").css("display", "none"); $("#openLeftPanel").css("display", "none"); // check if right-panel attribute is set on the page if ($(this).attr("right-panel")) { // if it is, it should append the defined right-panel to the page $("#"+$(this).attr("right-panel")).clone().appendTo($(this)); // rename it to tmpRightPanel $.mobile.activePage.find('#'+$(this).attr("right-panel")).attr("id", "tmpRightPanel"); // make it a panel $.mobile.activePage.find('#tmpRightPanel').panel(); // make it visible (the original right panel is set to display: none) $.mobile.activePage.find('#tmpRightPanel').css("display", "block"); // make the button to open the panel visible $("#openRightPanel").css("display", "block"); } // same as right-panel above if ($(this).attr("left-panel")) { $("#"+$(this).attr("left-panel")).clone().appendTo($(this)); $.mobile.activePage.find('#'+$(this).attr("left-panel")).attr("id", "tmpLeftPanel"); $.mobile.activePage.find('#tmpLeftPanel').panel(); $.mobile.activePage.find('#tmpLeftPanel').css("display","block"); $("#openLeftPanel").css("display", "block"); } }); // make the open panel buttons clickable $(document).on('click', '#openRightPanel', function(){ $.mobile.activePage.find('#tmpRightPanel').panel("open"); }); $(document).on('click', '#openLeftPanel', function(){ $.mobile.activePage.find('#tmpLeftPanel').panel("open"); }); 

制作一个这样的页面:

  
some page

并将面板放在页面外的某个位置,并将它们隐藏起来:

        

Panel是1.3中引入的新概念。 所以希望很快就会出现更多的教程。 至于你的问题,我想你在每个页面中编写一个面板会更好。 您可以实时更改页面,但请务必按​​照文档中的说明调用以下方法。

 $( "#mypanel" ).trigger( "updatelayout" ); 

我不确定其他方法是否可行。

我遇到了同样的问题,最后使用iframe从文件中加载持久化的语句(在我的例子中是一个复杂的搜索表单):

 

Search for Hotel

...

每当用户提交搜索条件时,sform.html就会向主页发送消息:

 window.parent.postMessage({action:"search",params:criteria},'*'); 

并且主页面捕获它:

 window.onmessage = function (e) { if (e.data.action == "search") { var criteria = e.data.params; loadHotelListPage(criteria); } }; 

我知道这很奇怪,但它确实有效

“面板不能放在页面之外,但在将来的版本中将删除此约束。” (来自http://view.jquerymobile.com/1.3.1/dist/demos/widgets/panels/ )

这种能力似乎是使面板作为整个应用程序导航设备最有用和方便的关键。

对于面板,页眉和页脚,我为每个元素创建了一个模板(我使用dustjs )。 在pagebeforecreate事件中,我将html附加到当前页面。 如果希望JQM“增强”html,则必须使用pagebeforecreate事件。 如果你不关心这个,你可以使用`pagecreate’事件。

我在使用单页模板时遇到了这个问题。 我只想要一个带有id菜单的div,并将其附加到单页模板的所有页面中。

我的菜单面板代码如下:

  

我的JS代码是:

 $(document).on('pagebeforeshow', '[data-role="page"]', function(){ // if the page hasn't got yet a menu panel, append a new menu if ($.mobile.activePage.find(".menu").length===0) { $('
').attr({'data-role':'panel',"class":"menu"}).appendTo($(this)); // copy the contents of the panel defined before $.mobile.activePage.find('.menu').html($("#menu").html()).panel(); } // if click the .showMenu button, open the menu $(document).on('click', '.showMenu', function(){ $.mobile.activePage.find('.menu').panel("open"); });

});

这段代码很完美,我很高兴得到了我一直在寻找两个小时或更长时间的问题的正确答案。

评论是否奏效。 来自西class牙的问候

我的方法类似于此处的其他答案,但足以保证一个post。

在我的多页项目中,我在第一页中构建我的导航面板,如下所示:

  

然后在后续页面中,我添加一个带有合适类名的div来识别它:

  

然后在app的第一页的pagebeforecreate事件中,我克隆导航面板并用它替换所有子容器:

 $(document).delegate("#index", "pagebeforecreate", function () { var navpanelCopy = $( "#nav-panel" ).clone(); $( ".navPanelChild" ).replaceWith(navpanelCopy); }); 

Jquery 1.4.4中,您可以简单地使用:

   

这适用于我的移动Web项目,我的移动Web应用程序教师今天就向我们展示了这一点。

Jquery Mobile Web Application上查看

页面代码的其余部分是:

   

Login

Panel responsive

This is a typical page that has two buttons in the header bar that open panels. The left panel has the push display mode, the right panel reveal. To make this responsive, you can make the page re-flow at wider widths. This allows both the panel menu and page to be used together when more space is available. This behavior is controlled by CSS media queries. You can create a custom one for a specific breakpoint or use the breakpoint preset by adding the class="ui-responsive-panel" to the page container. We have added this class on this demo page. Note that when using the preset class, we also hide the dismiss layer on wider screens if the panel has the push display mode.

View Source





back

Landing page

This is just a landing page.

back

Page 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pretium pretium nisi in semper. Integer lectus nibh, fermentum rutrum sagittis vel, sagittis in sem. Praesent condimentum, orci vitae dapibus laoreet, augue odio luctus arcu, eget ultrices lacus ligula non mi. Mauris aliquam et ligula vel mollis. Curabitur pulvinar quis augue id tempus. Phasellus rutrum rhoncus mauris, vel tincidunt sapien porttitor eget. Vivamus sagittis lacus non felis rhoncus, sed feugiat odio ornare. Praesent at sapien vel dolor gravida imperdiet. Nulla mi felis, elementum eget sapien ac, cursus lobortis risus. Aliquam in lacus in arcu placerat laoreet et quis nulla. Morbi et nunc ultricies, molestie augue a, tempor ipsum. Vestibulum non mi mattis, dapibus magna non, condimentum risus. Nam fermentum, ligula ultrices rhoncus vestibulum, augue diam feugiat elit, vitae tincidunt urna odio at erat. Maecenas in mattis libero.

Sed pulvinar nibh nulla, vitae dapibus odio faucibus id. Curabitur rutrum sodales dolor. Suspendisse mattis semper dapibus. Nullam iaculis tristique orci, ut consectetur augue accumsan eget. Duis turpis massa, egestas at lobortis nec, mollis eget sapien. Aliquam sed blandit lacus, ac fringilla nunc. Praesent quis faucibus magna, a imperdiet nulla. Pellentesque tristique, elit ut cursus tristique, ex turpis placerat dolor, non vehicula sem urna a nibh. In tristique hendrerit ex nec rutrum. Aenean sodales erat nisl, sed consequat enim consectetur id. Vivamus sit amet suscipit quam, a efficitur ante. Integer in luctus diam. Integer fringilla felis risus, vitae vehicula quam pharetra vel. Maecenas ligula lacus, lobortis a condimentum sit amet, faucibus sit amet nisi. Donec mattis scelerisque fringilla.

Page 3

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pretium pretium nisi in semper. Integer lectus nibh, fermentum rutrum sagittis vel, sagittis in sem. Praesent condimentum, orci vitae dapibus laoreet, augue odio luctus arcu, eget ultrices lacus ligula non mi. Mauris aliquam et ligula vel mollis. Curabitur pulvinar quis augue id tempus. Phasellus rutrum rhoncus mauris, vel tincidunt sapien porttitor eget. Vivamus sagittis lacus non felis rhoncus, sed feugiat odio ornare. Praesent at sapien vel dolor gravida imperdiet. Nulla mi felis, elementum eget sapien ac, cursus lobortis risus. Aliquam in lacus in arcu placerat laoreet et quis nulla. Morbi et nunc ultricies, molestie augue a, tempor ipsum. Vestibulum non mi mattis, dapibus magna non, condimentum risus. Nam fermentum, ligula ultrices rhoncus vestibulum, augue diam feugiat elit, vitae tincidunt urna odio at erat. Maecenas in mattis libero.

Sed pulvinar nibh nulla, vitae dapibus odio faucibus id. Curabitur rutrum sodales dolor. Suspendisse mattis semper dapibus. Nullam iaculis tristique orci, ut consectetur augue accumsan eget. Duis turpis massa, egestas at lobortis nec, mollis eget sapien. Aliquam sed blandit lacus, ac fringilla nunc. Praesent quis faucibus magna, a imperdiet nulla. Pellentesque tristique, elit ut cursus tristique, ex turpis placerat dolor, non vehicula sem urna a nibh. In tristique hendrerit ex nec rutrum. Aenean sodales erat nisl, sed consequat enim consectetur id. Vivamus sit amet suscipit quam, a efficitur ante. Integer in luctus diam. Integer fringilla felis risus, vitae vehicula quam pharetra vel. Maecenas ligula lacus, lobortis a condimentum sit amet, faucibus sit amet nisi. Donec mattis scelerisque fringilla.

Page 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pretium pretium nisi in semper. Integer lectus nibh, fermentum rutrum sagittis vel, sagittis in sem. Praesent condimentum, orci vitae dapibus laoreet, augue odio luctus arcu, eget ultrices lacus ligula non mi. Mauris aliquam et ligula vel mollis. Curabitur pulvinar quis augue id tempus. Phasellus rutrum rhoncus mauris, vel tincidunt sapien porttitor eget. Vivamus sagittis lacus non felis rhoncus, sed feugiat odio ornare. Praesent at sapien vel dolor gravida imperdiet. Nulla mi felis, elementum eget sapien ac, cursus lobortis risus. Aliquam in lacus in arcu placerat laoreet et quis nulla. Morbi et nunc ultricies, molestie augue a, tempor ipsum. Vestibulum non mi mattis, dapibus magna non, condimentum risus. Nam fermentum, ligula ultrices rhoncus vestibulum, augue diam feugiat elit, vitae tincidunt urna odio at erat. Maecenas in mattis libero.

Sed pulvinar nibh nulla, vitae dapibus odio faucibus id. Curabitur rutrum sodales dolor. Suspendisse mattis semper dapibus. Nullam iaculis tristique orci, ut consectetur augue accumsan eget. Duis turpis massa, egestas at lobortis nec, mollis eget sapien. Aliquam sed blandit lacus, ac fringilla nunc. Praesent quis faucibus magna, a imperdiet nulla. Pellentesque tristique, elit ut cursus tristique, ex turpis placerat dolor, non vehicula sem urna a nibh. In tristique hendrerit ex nec rutrum. Aenean sodales erat nisl, sed consequat enim consectetur id. Vivamus sit amet suscipit quam, a efficitur ante. Integer in luctus diam. Integer fringilla felis risus, vitae vehicula quam pharetra vel. Maecenas ligula lacus, lobortis a condimentum sit amet, faucibus sit amet nisi. Donec mattis scelerisque fringilla.

Page 5

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pretium pretium nisi in semper. Integer lectus nibh, fermentum rutrum sagittis vel, sagittis in sem. Praesent condimentum, orci vitae dapibus laoreet, augue odio luctus arcu, eget ultrices lacus ligula non mi. Mauris aliquam et ligula vel mollis. Curabitur pulvinar quis augue id tempus. Phasellus rutrum rhoncus mauris, vel tincidunt sapien porttitor eget. Vivamus sagittis lacus non felis rhoncus, sed feugiat odio ornare. Praesent at sapien vel dolor gravida imperdiet. Nulla mi felis, elementum eget sapien ac, cursus lobortis risus. Aliquam in lacus in arcu placerat laoreet et quis nulla. Morbi et nunc ultricies, molestie augue a, tempor ipsum. Vestibulum non mi mattis, dapibus magna non, condimentum risus. Nam fermentum, ligula ultrices rhoncus vestibulum, augue diam feugiat elit, vitae tincidunt urna odio at erat. Maecenas in mattis libero.

Sed pulvinar nibh nulla, vitae dapibus odio faucibus id. Curabitur rutrum sodales dolor. Suspendisse mattis semper dapibus. Nullam iaculis tristique orci, ut consectetur augue accumsan eget. Duis turpis massa, egestas at lobortis nec, mollis eget sapien. Aliquam sed blandit lacus, ac fringilla nunc. Praesent quis faucibus magna, a imperdiet nulla. Pellentesque tristique, elit ut cursus tristique, ex turpis placerat dolor, non vehicula sem urna a nibh. In tristique hendrerit ex nec rutrum. Aenean sodales erat nisl, sed consequat enim consectetur id. Vivamus sit amet suscipit quam, a efficitur ante. Integer in luctus diam. Integer fringilla felis risus, vitae vehicula quam pharetra vel. Maecenas ligula lacus, lobortis a condimentum sit amet, faucibus sit amet nisi. Donec mattis scelerisque fringilla.