Heim > Web-Frontend > js-Tutorial > Für die Rückgabe einer jQuery Mobile-Seite ist kein re-get_jquery erforderlich

Für die Rückgabe einer jQuery Mobile-Seite ist kein re-get_jquery erforderlich

WBOY
Freigeben: 2016-05-16 15:04:03
Original
1144 Leute haben es durchsucht

jQuery Mobile ist ein Front-End-Entwicklungsframework zum Erstellen mobiler Webanwendungen.

jQuery Mobile kann auf Smartphones und Tablets verwendet werden.

jQuery Mobile verwendet minimale HTML5- und CSS3-Skripte zum Layouten von Webseiten.

Kürzlich hat mir das Web-App-Projekt des Unternehmens die Ehre gegeben, weiterhin mit jQuery Mobile in Kontakt zu treten und es kennenzulernen. Dies ist in der Tat eine sehr gute Bibliothek für die mobile Entwicklung, die Ingenieuren, die sich mit der Webentwicklung auskennen, dabei hilft, schnell loszulegen und ihre eigenen mobilen Anwendungen zu erstellen. Aber in den letzten zwei Tagen bin ich auf ein Problem gestoßen, das dazu führte, dass ich viele Informationen überprüfte, aber keine gute Lösung finden konnte. Am Ende war ich gezwungen, den Quellcode von jQuery Mobile zu lesen und eine Erweiterung zu schreiben, um es zu lösen . Bitte lassen Sie es mich unten erklären.

Problembeschreibung

Angenommen, es gibt drei Seiten im Projekt, nämlich main.html, test1.html, test2.html (im Folgenden als main, test1 bzw. test2 bezeichnet), wobei die Hauptseite einen Link zur test1-Seite enthält (d. h. ein Tag), test1 hat einen Link mit dem Attribut data-rel="back" und einen Link zu test2, und test2 hat nur einen Link mit dem Attribut data-rel="back". Klicken Sie nach der Übertragung von „Haupt“ auf „Test1“ auf den „Zurück“-Link, um zu „Haupt“ zurückzukehren (entspricht dem Klicken auf die Zurück-Schaltfläche des Browsers). Es ist jedoch nicht erforderlich, die Get-Anfrage erneut zu senden, wenn Sie auf „Test2“ auf den „Zurück“-Link klicken Seite und möchten zu test1 zurückkehren, wird eine Get-Anfrage erneut gesendet. Das dadurch verursachte Problem besteht darin, dass alle von test1 ausgeführten Vorgänge nach der Rückkehr von test2 ungültig sind. Beispiel: A ist eine paginierte Listenseite. Wenn Sie zur zweiten Seite wechseln und dann zu B weiterleiten, können Sie bei der Rückkehr zu A nicht zur zweiten Seite wechseln.

Ursachenanalyse

Ich habe zuerst Firebug verwendet, um mir die Struktur des HTML anzusehen, und festgestellt, dass jQuery Mobile main und test1 zur Seitenstruktur hinzufügt. Wenn es von test1 zu test2 wechselt, wird test1 automatisch gelöscht, sodass der Dom-Baum entsteht Enthält nur main und test2. Wenn test2 also test1 zurückgibt, wird eine Get-Anfrage gesendet. Bedeutet das, dass dieses Problem gelöst werden kann, solange die historischen Seiten im Dom zwischengespeichert werden können (genau wie main und test1)?

Lösen Sie das Problem

Nach einigem Suchen habe ich auf der offiziellen Website von jQuery Mobile eine Beschreibung zum Thema „Seiten im DOM zwischenspeichern“ gesehen:

Seiten im DOM zwischenspeichern
Um alle zuvor besuchten Seiten im DOM zu behalten, setzen Sie die domCache-Option im Seiten-Plugin auf true, etwa so:
$.mobile.page.prototype.options.domCache = true;
Um nur eine bestimmte Seite zwischenzuspeichern, können Sie alternativ das Attribut data-dom-cache="true" zum Container der Seite hinzufügen:


Sie können eine Seite auch programmgesteuert wie folgt zwischenspeichern:
pageContainerElement.page({ domCache: true });
Der Nachteil des DOM-Caching besteht darin, dass das DOM sehr groß werden kann, was auf einigen Geräten zu Verlangsamungen und Speicherproblemen führt. Wenn Sie das DOM-Caching aktivieren, achten Sie darauf, das DOM selbst zu verwalten und auf einer Reihe von Geräten gründlich zu testen.

Sie können diesem Zitat entnehmen, dass diese drei Methoden die Seite im Dom zwischenspeichern können, daher habe ich die zweite Methode verwendet, die darin besteht, data-dom-cache=“ zum Attribut „div“ der Seite hinzuzufügen. aber die folgenden zwei Probleme sind aufgetreten:

1. Wie in der Abbildung unten gezeigt, können Sie mit Firebug sehen, dass test2 vorhanden ist, wenn mein Zugriffspfad main->test1->test2->test1 ist (test2 wird von History.back() zurückgegeben). noch im DOM vorhanden ist, ist das Ergebnis wie im roten Teil beschrieben: Das DOM wird sehr groß, was auf einigen Geräten zu Seitenverlangsamung und Speicherfehlern führt.

2. Wenn ich eine solche Seite habe, zeigt sie unterschiedliche Inhalte über unterschiedliche Parameter an, und auf der Seite befindet sich ein JS-Skript, das die Elemente auf der Seite verarbeitet, und unsere übliche Methode ist die Verwendung von ID. Um das Zielelement zu erhalten, führt dies zu js-Ereignissen oder Betriebsverwirrungen, da wir den Cache zum Zwischenspeichern der Seite verwenden. Hier habe ich zum Beispiel eine test1_1-Seite hinzugefügt. Ihr Inhalt ist fast derselbe wie test1. Beide haben Divs mit derselben ID und Schaltflächen mit derselben Ereignisverarbeitung Der Pfad ist main ->test1->test1_1. Klicken Sie auf die Schaltfläche test1_1. Sie werden feststellen, dass dieses Ereignis nicht ausgelöst zu werden scheint. Tatsächlich wurde es ausgelöst, aber der Inhalt wird dem Div in test1 hinzugefügt. wie in der Abbildung unten gezeigt

所以对于目前大多数应用,这个方案是不可取的,除非自己管理dom中页面的生命周期。

优化方案

通过上面的实验,我也知道了需要满足我的需求,就只能自己管理dom中页面的生命周期了。那么就涉及到一个问题:页面什么时候过期(即从dom中删除)呢?根据我的需求,当从test2返回到test1时,就应该从dom中删除test2,同理从test1返回main时,从dom中删除test1。如果再次从main导航到test1,就得发起一个get请求,我认为这是合理的,因为用户不会认为点击链接到新页面还需要缓存。所以我应该在页面显示前或者显示后,删除它之后的history,于是我就在pagebeforeshow、pageshow的时候做了删除操作,即如下脚本(插件形式):

(function($, undefined) {
$.fn.subpage = function(options) {
$(document).bind(
"pagebeforeshow",
function() {
var forword = $.mobile.urlHistory.getNext();
if (forword) {
var dataUrl = forword.url;
var forwordPage=$.mobile.pageContainer
.children(":jqmData(url='" + dataUrl + "')");
if(forwordPage){
forwordPage.remove();
}
}
$.mobile.urlHistory.clearForward();
});
};
$(document).bind("pagecreate create", function(e) {
$(":jqmData(role='page')", e.target).subpage();
});
})(jQuery); 
Nach dem Login kopieren

结果事与愿违,在页面返回时,出现了js脚本错误,如下图:

那么是什么原因呢?不在这个事件里做处理,那在哪里处理呢?于是我仔细研读了一下jQuery Mobile源码,发现了下面一段:

transitionPages( toPage, fromPage, settings.transition, settings.reverse )
.done(function() {
removeActiveLinkClass();
//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
if ( settings.duplicateCachedPage ) {
settings.duplicateCachedPage.remove();
}
//remove initial build class (only present on first pageshow)
$html.removeClass( "ui-mobile-rendering" );
releasePageTransitionLock();
// Let listeners know we're all done changing the current page.
mpc.trigger( "pagechange", triggerData );
}); 
Nach dem Login kopieren

页面在切换完后,会触发pagechange事件,于是我把pagebeforeshow改成了pagechange,一切都按预期运行,并且没有错误,终于大功告成了。

总结

在使用该插件时,请注意以下几点:

1、必须在引用该脚本之前,引用jquery和jquery mobile脚本文件;

2、必须在page上增加data-dom-cache="true"。

以上所述是小编给大家介绍的jQuery Mobile页面返回不需要重新get 的相关说明,希望对大家有所帮助!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage