2013-04-03 4 views
23

Ich habe $ .mobile.changepage verwendet, um die Weiterleitung in meinem phonegap + jquerymobile Projekte zu tun. Was mich jedoch verwirrt, ist, dass ich das Skript aller Seiten in die gleiche Datei index.html legen muss. Wenn nicht, kann die Weiterleitungsseite die Funktion nicht in ihrer Kopfzeile ausführen.Warum muss ich das ganze Skript zu index.html in jquery mobile setzen

zum Beispiel scheint mein index.html $(document).bind("deviceready",function(){$.mobile.changepage("test.html");})

dann zu sein, wird mein Gerät test.html umleiten, die

$("#btnTest").click(function(){alert("123");}) 
<button id="btnTest">Test</button> 

jedoch zu sein scheint, wird das Skript nie in Test ausführen .html. Dann setze ich das Skript auf index.html, was ich erwarte ist getan. Wie auch immer, wenn ich das ganze Skript auf dieselbe Seite lege, wird das Projekt immer schwerer zu erhalten sein. Wertschätzung für Ihre Hilfe.

Antwort

57

Intro

Dieser Artikel ist auch HERE als Teil meines Blogs zu finden sind.

Wie jQuery Mobile Seite Griffe ändert

diese Situation, die Sie verstehen müssen, um zu verstehen, wie jQuery Mobile funktioniert. Es verwendet Ajax, um andere Seiten zu laden.

Die erste Seite wird normal geladen. Seine HEAD und BODY in die DOM geladen, und sie sind es auch andere Inhalte zu erwarten.Wenn die zweite Seite geladen wird, wird nur der Inhalt in den DOM Inhalt geladen. Um genau zu sein, ist sogar BODY nicht vollständig geladen. Nur das erste div mit einem Attribut data-role = "page" wird geladen, alles andere wird verworfen. Auch wenn Sie mehr Seiten in einem BODY haben, wird nur der erste geladen. Diese Regel gilt nur für nachfolgende Seiten. Wenn Sie mehr Seiten in einem anfänglichen HTML haben, werden alle geladen.

Aus diesem Grund wird Ihre Schaltfläche erfolgreich angezeigt, aber Klickereignis funktioniert nicht. Gleiches Klickereignis, dessen Eltern HEAD während des Seitenwechsels ignoriert wurde.

Hier ist eine offizielle Dokumentation: http://jquerymobile.com/demos/1.2.0/docs/pages/page-links.html

Leider Sie werden nicht diese in ihrer Dokumentation beschrieben zu finden. Äther denken sie, das ist ein allgemeines Wissen oder sie haben vergessen, dies wie meine anderen Themen zu beschreiben. (jQuery Mobile Dokumentation ist groß, aber es fehlt an vielen Dingen).

Lösung 1

In Ihrer zweiten Seite, und jede andere Seite, bewegen Sie SCRIPT Tag in das BODY Inhalt, wie folgt aus:

<body> 
    <div data-role="page"> 
     // And rest of your HTML content 
     <script> 
      // Your javascript will go here 
     </script> 
    </div> 
</body> 

Dies ist eine schnelle Lösung ist aber nach wie vor ein hässlicher.

Arbeitsbeispiel kann hier in meiner anderen Antwort zu finden: Pageshow not triggered after changepage

Ein weiteres Arbeitsbeispiel: Page loaded differently with jQuery-mobile transition

Lösung 2

Verschieben Sie alle Ihre Javascript in die ursprünglichen ersten HTML. Sammle alles und lege es in eine einzige js-Datei, in eine HEAD. Initialisiere es, nachdem jQuery Mobile geladen wurde.

Am Ende werde ich beschreiben, warum dies ein Teil einer guten Lösung ist.

Lösung 3

Verwenden rel = "external" in Ihre Tasten und alle Elemente, die Sie Seite zu ändern verwenden. Aus diesem Grund wird Ajax nicht zum Laden von Seiten verwendet und Ihre jQuery Mobile App verhält sich wie eine normale Webanwendung. Leider ist dies in Ihrem Fall keine gute Lösung. Phonegap sollte niemals als normale Web-App funktionieren.

<a href="#second" class="ui-btn-right" rel="external">Next</a> 

Offizielle Dokumentation, suchen Sie nach einem Kapitel: Linking without Ajax

realistische Lösung

realistische Lösung Lösung 2 verwenden würde. Aber im Gegensatz zu Lösung 2 würde ich dieselbe index.js-Datei verwenden und sie in einer HEAD jeder möglichen anderen Seite initialisieren.

Jetzt können Sie mich fragen WARUM?

Phonegap wie jQuery Mobile ist verwanzt, und früher oder später, es geht um einen Fehler und Ihre Anwendung fehlschlagen wird (darunter geladene DOM), wenn Ihr jeden Inhalt js ist in einer einzigen HTML-Datei. DOM könnte gelöscht werden und Phonegap wird Ihre aktuelle Seite aktualisieren. Wenn diese Seite kein Javascript hat, wird sie nicht funktionieren, bis sie neu gestartet wird.

Abschließende Worte

Dieses Problem kann leicht mit einer guten Seite Architektur festgelegt werden. Wenn jemand interessiert ist, habe ich eine ARTICLE über gute jQuery Mobile Seite Architektur geschrieben. In einer Nussschale diskutiere ich, dass das Wissen darüber, wie jQuery Mobile funktioniert, das Wichtigste ist, was Sie wissen müssen, bevor Sie Ihre erste App erfolgreich erstellen können.

+0

eine perfekte Antwort! Unsere Schlussfolgerung ist, dass wir nicht jede js-Datei in jede Seite trennen können? Das macht unsere App wirklich schwer zu erhalten. Ich habe Angst, ob es bedeutet, dass ein JavaScript-Bug die ganze App mit JqueryMobile zum Absturz bringen würde. –

+0

In Lösung 1, ist es so hässlich, eine externe Skriptdatei einzuschließen? – ogborstad

+0

Das ist sicherlich keine schlechte Idee, ich bevorzuge alles in einer externen Datei. – Gajotres

1

Im Gegensatz zu normalen HTML-Seiten verwendet jQuery Mobile die ajax-Technologie, wenn zwischen den Seiten navigiert wird. Stellen Sie also sicher, dass Sie alle Ihre JS-Dateien und Bibliotheken in alle Ihre HTML-Seiten importieren.

Wenn Sie genau hinsehen, werden Sie sehen, dass JS-Dateien von der vorherigen Seite beim Laden der zweiten Seite berücksichtigt werden. Wenn Sie jedoch die aktuelle Seite erzwingen, werden die js-Dateien der aktuellen Seite wirksam.

Also wie ich schon sagte, stellen Sie sicher, dass Sie die JS-Dateien in alle HTML-Dateien importieren.

Auch ruft keine Notwendigkeit, deviceready, Verwendung folgende Syntax Ihrer Seite spezifische js Funktionen

$(document).on('pageshow', '#YourPageID', function(){ 
    // Your code goes here 
}); 
1

JQuery Mobile verwendet Ajax ruft eine "Seite" zu laden. Eine "Seite" ist hier ein div mit Datenrolle = Seite. Wenn Sie eine physische Seite index.html laden, können Sie mithilfe von "changePage" zu jedem "Seiten" -Div innerhalb dieser Seite navigieren.

Wenn Sie jedoch eine "Seite" von einer anderen physischen Seite laden möchten, lädt jQM nur das erste "Seiten" -div von dieser Seite. Was wirklich passiert, ist, dass Sie die Seite nicht ändern, jQM laden Sie einfach diese bestimmte "Seite" div mit Ajax und injizieren Sie es auf Ihre aktuelle Seite.

Sie haben zwei mögliche Architektur, wo Sie alle Ihre "Seiten" in eine HTML-Seite und navigieren Sie von dort aus. Oder Sie können mehrere Seiten Architektur haben. Du kannst das immer mischen.

Um die Seite physisch zu ändern, müssen Sie rel = external zu Ihrem Link hinzufügen.

Verwandte Themen