[HTML/JQUERY] Dynamischer Content durch hashchanges

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [HTML/JQUERY] Dynamischer Content durch hashchanges

    Auf wunsch von Mythen gibts ein kleines Tutorial wie man Webseiten mit Dynamischem Inhalt mit hilfe von Hashtags realisiert.

    [messagebox=info]Dies ist nur eine von viele möglichkeiten das zu machen.[/messagebox]

    Für alle die Nicht wissen worum es hierbei geht:
    Gemeint ist einfach, das die Seite nicht über url's wie z.b www.meine-domain.de/index.html, www.meine-domain.de/projekte.html und www.meine-domain.de/kontakt.html erreichbar ist, sondern über www.meine-domain.de#start, www.meine-domain.de#projekte, www.meine-domain.de#kontakt und sich dabei der Inhalt Dynamisch ändert ohne die Seite neu zu laden. Wer jetzt immernoch nicht weiss was ich meine, schaut euch z.b Twitter an, meine Homepage oder die Seite an der ich gerade arbeite an (Ein bisschen Werbung in eigener Sache muss ja auch mal sein :D).

    Also, als erstes gibt es da 3 Wichtige Dinge die wir bedenken müssen:
    1. Die Seite muss auch erreichbar sein wenn Javascript im Browser deaktiviert ist.
      Ironischer weise geht das bei meinen Seiten nicht, weil ich dafür schlicht und ergreifend zu faul bin xD, und Twitter arbeitet auch nicht vernünftig ohne JS. Das soll euch aber nicht davon ab halten.
    2. Der Jeweilige Content muss trotzdem über einen Direktlink erreichbar sein. Das heisst, wenn ich zur Kontaktseite möchte, will ich nicht erst auf der Startseite landen und mich dann durch klicken müssen, sondern ich will direkt über z.b www.meine-domain.de#kontakt dort hin gelangen.
    3. Der Zurück Button muss funktionieren. Das heißt, wenn ich auf der Startseite bin, und dann auf die Kontaktseite wechsel, will ich über den Zurück Button auch wieder auf der Startseite landen.


    Nun fangen wir erstmal mit dem HTML Grundgerüst an:

    HTML-Quellcode

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    5. <title>Meine Dynamische Homepage | Home</title>
    6. <!-- jQuery einbinden -->
    7. <script type="text/javascript" language="JavaScript" src="http://code.jquery.com/jquery.min.js"></script>
    8. <!-- Hashchange Plugin einbinden -->
    9. <script type="text/javascript" language="JavaScript" src="jquery.ba-hashchange.min.js"></script>
    10. <!-- Unser Javascript einbinden -->
    11. <script type="text/javascript" language="JavaScript" src="dynamicpage.js"></script>
    12. </head>
    13. <body>
    14. <header>
    15. <a href="#start">Startseite</a>
    16. <a href="#projekte">Meine Projekte</a>
    17. <a href="#kontakt">Kontakt</a>
    18. </header>
    19. <section id="main">
    20. </section>
    21. </body>
    22. </html>
    Alles anzeigen

    Wie ihr seht verzichte ich für dieses Tutorial auf großartige Style Sachen, da es mir hauptsächlich um den Inhalt geht. Im head bereich seht ihr erstmal das einbinden von jQuery direkt von deren Homepage. Danach das hashchange-plugin, welches ihr euch hier runterladen müsst. Und zu guter letzt noch unsere JS Datei.
    Im body bereich sehen wir nur die Links zum wechseln der Seite, und den section-tag mit der id "main". Dies dient zur Identifizierung, da dort nachher der Inhalt der Seite rein kommt.

    Nun gehts an unsere Javascript Datei. Wir erstellen eine neue js datei und nennen sie "dynamicpage.js". Dort kommt erstmal folgender inhallt rein:

    JavaScript-Quellcode

    1. $(function(){
    2. $(window).hashchange( function(){
    3. //do something
    4. });
    5. });

    Dort sehen wir erstmal nur das hashchange event, welches aufgerufen wird wenn sich der hash ändert. Nun holen wir uns den hash:

    JavaScript-Quellcode

    1. var hash = (location.hash).replace('#', '');//Normal wäre der hash z.b "#startseite", aber wir wollen die raute nicht, weshalb wir sie durch replace entfernen, bzw. durch ncihts ersetzen.

    Jetzt sollten wir erstmal abfragen ob überhaupt ein hash angegeben wurde. Denn wenn ich z.b nur www.meine-domain.de aufrufe, ist ja noch kein hash gegeben. Ich möchte aber trotzdem dass dann eine Seite angezeigt wird, z.b die Startseite.
    Also fragen wir ab ob der hash leer ist, und wenn ja setzen wir den hash auf "#startseite" und ändern die URL dementsprechend.

    JavaScript-Quellcode

    1. if(hash == '') { //Wenn der hash leer ist
    2. hash = '#startseite'; //übergeben wir "#startseite" an die variable
    3. location.hash = '#startseite'; //und ändern die URL
    4. }

    So, nun gehts ans laden der Seite.
    Erstmal wandeln wir den hash in kleinbustaben um, damit #startseite das gleiche ist wie #StArTsEiTe oder #STARTSEITE.

    JavaScript-Quellcode

    1. hash = hash.toLowerCase();

    Nun wird main erstmal versteckt, damit, falls vorher eine andere seite geladen wurde, nun platz für was neues ist. Natürlich muss das nicht umbedingt sein, aber es sieht schöner aus, und eventuell möchte der eine oder andere ja mit ein paar effekten arbeiten, wie z.b langsamen ausblenden der seite, oder dem hochscrollen.

    JavaScript-Quellcode

    1. $('#main').hide(); //main verstecken
    2. /*
    3. natürlich kann man anstatt hide() (dem einfachen ausblenden) auch
    4. $('#main').slideUp() / $('#main').slideDown() benutzen wenn die Seite hoch/runter scrollen soll, oder
    5. $('#main').fadeOut() um sie langsam verblassen zu lassen.
    6. */

    Nu is die Seite weg, und wir machen uns ans laden der neuen Seite. Das ganze geht über die Funktion load.

    JavaScript-Quellcode

    1. $('#main').load('beispiel.html', function(response, status, xhr) {
    2. // do something
    3. });

    Hier laden wir den Inhalt der Datei "beispiel.html" in unser #main element. Natürlich wollen wir nicht beispiel.html, sonern z.b startseite.html. Deshalb tragen wir dort unsere hash variable ein.
    Über die funktion können wir dann prüfen ob es einen fehler gab, weil die Seite nicht existierte. Wenn z.b jemand aus langeweile "www.meine-domain.de#sadfasdfadf" eingegeben hat, wird ja versucht der Inhalt von sadfasdfadf.html zu laden. Da diese Datei nicht existiert, wird ein Fehler ausgegeben. So können wir z.b eine 404 Seite angeben o.ä.
    Zusätlich haben wir nun aber auch das Problem, das wir nur html Datein laden würden, und ein großteil der Modernen webseiten html benötigt (für was auch immer). Auch da ist die error abfragen für uns von vorteil.
    hash.html laden. Wenn Seite nicht gefunden -> hash.php laden. Wenn Seite nicht gefunden -> 404 Seite laden.
    Natürlich könnten wir das auch mit Zahlreichen abfragen machen. Wenn hash == soundso, lade seite xyz. Aber ich habs gern sparsam und von natur aus faul, und muss so nicht jede Seite die neu dazu kommt nachtragen.
    Nun kommt noch dazu, das es etwas unordentlich werden könnte wenn alle html datein um wurzelverzeichniss rum lungern, deshalb platzieren wir dort nur die index.html, und der rest kommt in /pages. Das müssen wir natürlich auch beim laden beachten.
    Also sieht es nun folgendermaßen aus:

    JavaScript-Quellcode

    1. $('#main').load('pages/' + hash + '.html', function(response, status, xhr) { //versuche pages/XYZ.html zu laden
    2. if (status == "error") { //Seite wurde nicht gefunden
    3. $('#main').load('pages/' + hash + '.php', function(response, status, xhr) { //versuche pages/XYZ.php zu laden
    4. if (status == "error") { //Seite wurde nicht gefunden
    5. $('#main').load('pages/404.html'); //404 Seite laden
    6. }
    7. });
    8. }
    9. });

    Nun ist der inhalt aus der Datei im #main element. Aber es ist immernoch ausgeblendet, also lassen wir es jetzt wieder anzeigen. Auch hier habt ihr wieder die möglichkeit, neben dem normalen show() die seite rein zu scrollen, oder langsam einfaden zu lassen.

    JavaScript-Quellcode

    1. $('#main').show(); //main anzeigen

    Das hashchange event wird immer dann aufgerufen, wenn sich der hash ändert. Da das aber beim ersetn Seiten aufruf nicht der fall ist, müssen wir es deshalb noch selbst aufrufen. Dafür fügen wir, nach dem hashchange event, noch folgendes hinzu:

    JavaScript-Quellcode

    1. $(window).hashchange(); //Wir rufen das hashchange event beim ersetn seiten besuch auf

    So, theoretisch sind wir jetzt fertig. Aber ich möchte noch ein Paar dinge dazu sagen die vielleicht dem ein oder anderen helfen:
    • Warscheinlich möchtet ihr, das, wenn jemand auf einen Link im Menu geklickt hat, auch das Menu als "aktiv" angezeigt wird. Im idealfall habt ihr dafür eine CSS klasse, die ihr mithilfe von removeClass & addClass und eine each schleife bequem aktivieren könnt. Bei fragen dazu bitte als antwort Posten, da ich es schlecht erklären kann weil das ja bei jedem unterschiedlich gestaltet ist.
    • Weiteres folgt, sobald jemand was fragt^^
    Dateien
    • dynamicpage.txt

      (1,46 kB, 438 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Maddin () aus folgendem Grund: Etwas hinzugefügt und die Datei aktualisiert (Danke an Mythen der mich darauf aufmerksam gemacht hat)

  • Ich bin ja ein Fan davon bevor man so etwas mit Frameworks erledigt ersteinmal weiß was man da tut. Und das sehe ich hier leider nicht gegeben. Ich fände es schön wenn man im Anchluss hieran noch ein kleines Tutorial macht in dem es um javascript allgmein bzw Ajax geht.

    Ansonsten finde ich es schön gemacht ;)
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden
  • Javascript/Ajax != Framework. Das Framework ist jQuery. Wer keine Ahnung von JS hat, hat auch nichts bei solch einem Tutorial zu suchen. Und wer Ahnung hat, kennt die Syntax und merkt direkt, wie sie sich bei jQuery unterscheidet.
    Thema Ajax: Das zu erklären würde den Rahmen sprengen und wäre auch völlig am Thema vorbei, da man hier keinen manuellen Request startet sondern das vom Framework erledigen lässt, dann muss man nichts weiter dazu wissen. Wer sich nun dennoch dafür interessiert, kann dieses Tutorial lesen.

  • Hast du meinen Post eig gelesenen?

    Das Framework in meinem Post ist jQuery. Und nur darauf bezog sich meine Nachricht. Ich schrieb das man bevor man etwas mit einem Framework macht (extra für dich: jQuery) ersteinmal wissen sollte wie es ohne geht. Ich habe verschiedene Sachen auf eine andere Weise gerlent (das eine ohne Framework und das andre ohne) und ich muss sagen das mir die sachen die ich ohne FW gelernt habe leichter fallen. Wenn ich "nur" eine Seite dynamisch nachladen lassen will, binde ich doch nicht das komplette Framework ein.

    und unterlasse bitte solche Anschuldigungen wie deine Letzte.
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden
  • Hab ich gesagt das es ein Problem ist?
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden
  • nein. Nur das man zumindest die Technik mal erwähnen soll. Und die wäre hier nunmal Ajax. Das sollte jedem der das Tuotrial liest reichen. Übrigens: Der Wikipediartikel zu Ajax erklärt ziemlich komprimiert was Ajax ist und auch wie man Seiten dynamisch nachlädt. Außerdem ist dort Wikibooks verlinkt welches das Nachladen ohne Framework nochmal ausführlicher erklärt.

    Ein einfacher Satz am Anfang würde mir reichen: Dieses Tutorial soll euch zeigen wie man mit Hilfe von Ajax auf der Basis von jQuery Seiten dynamisch nachlädt ohne die Seite neuladen zu müssen.

    Die Verlinkung von Ajax und/oder jQuery wäre mir auch schon zu viel. Wer nicht weiß was es ist sondern einfach nur per Google auf den Thread stößt, sollte dann auch in der Lage sein die beiden Wörter zu googlen.
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden
  • Könntest du das Ganze villeicht auch noch für Protoype machen?

    Beide Frameworks werden ja stark genutzt. Auch wenn ich jetzt einfach mal behaupte das jquery mehr genutzt wird ...
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NurPech ()

  • Ich auch nicht. Deshalb hoffte ich das du es machen könntest ;)

    Vielleicht bemüht sich ja jemand anderes ...

    Generell Prototype fände ich nicht ganz verkehrt. Müsste mal langsam anfangen mich damit auseinander zu setzen. Hab aber keine Lust mich stundenlang durch Code und Doku zu wühlen :(
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NurPech ()

  • Vorgabe vom Auftragsgeber bzw dem verwendeten System. Das kann ich leider nicht ändern.
    [tabmenu]
    [tab='Werbung in eigener Sache']
    Du suchst einen Instant Messenger dessen Verbindung voll verschlüsselt ist? Weiterhin soll er mit anderen Instant Massenging Protokollen verknüpfbar sein? Außerdem möchtest du weltweit erreichbar sein (ähnlich icq und msn)? - Dann schick mir Post und erhalte ein unverbindliches, auf alle Fälle kostenloses, Angebot:
    [Blockierte Grafik: http://easy-scripting.net/icon/vCollection/pmEmptyS.png]
    [tab='Vorstellung']
    NurPech
    [tab='meine Tutorials']
    [subtab='C#']

    [subtab='PHP']

    [/tabmenu]

    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von [Blockierte Grafik: http://i.creativecommons.org/l/by-nc-nd/3.0/80x15.png] verwendet werden

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von NurPech ()

  • Hallo Maddin,

    Habe da ein kleines Problem..

    Habe jetzt mal das Tutorial befolgt und in der .js von mir folgendes drin stehen:

    JavaScript-Quellcode

    1. $(function(){
    2. $(window).hashchange( function(){ //das hashchange event, welches aufgerufen wird wenn sich der hash ändert.
    3. var hash = (location.hash).replace('#page/', ''); //normal wäre der hash z.b "#startseite", aber wir wollen die raute nicht, weshalb wir sie durch replace entfernen, bzw. durch ncihts ersetzen.
    4. if(hash == '') { //Wenn der hash leer ist
    5. hash = '#page/home'; //übergeben wir "#startseite" an die variable
    6. location.hash = '#page/home'; //und ändern die URL
    7. }
    8. hash = hash.toLowerCase(); //den hash in kleinbustaben umwandeln
    9. $('#main').hide(); //main verstecken
    10. /*
    11. natürlich kann man anstatt hide() (dem einfachen ausblenden) auch
    12. $('#main').slideUp() / $('#main').slideDown() benutzen wenn die Seite hoch/runter scrollen soll, oder
    13. $('#main').fadeOut() um sie langsam verblassen zu lassen.
    14. */
    15. $('#main').load('pages/' + hash + '.html', function(response, status, xhr) { //versuche pages/XYZ.html zu laden
    16. if (status == "error") { //Seite wurde nicht gefunden
    17. $('#main').load('pages/' + hash + '.php', function(response, status, xhr) { //versuche pages/XYZ.php zu laden
    18. if (status == "error") { //Seite wurde nicht gefunden
    19. $('#main').load('pages/404.html'); //404 Seite laden
    20. }
    21. });
    22. }
    23. });
    24. $('#main').show(); //main anzeigen
    25. });
    26. });
    Alles anzeigen


    Das klappt soweit auch, doch wenn ich jetzt dann z.b. die Seite so aufrufe index.html#page/home oder auch einfach nur index.html bleibt mein main bereich leer ?(
    das gleiche auch wenn ich versuche meine anderen Seiten aufzurufen index.html#page/test etc.. hoffe du könntest mir helfen.
  • Was für einen Browser verwendest du? So gut wie alle Modernen Browser besitzen eine Console die die meisten Javascript Fehler ausgeben sollte.
    Bei Chrome ist es STRG+SHIFT+J , bei Firefox weis ich es leider nicht so genau.

    Du kannst auch versuchen das Skript zu debuggen, indem du zwischendurch den hash per console.log ausgeben lässt. Also

    JavaScript-Quellcode

    1. console.log(hash);
    Dann steht in der console der hash der geladen werden soll.
    Ich nehme mal an das er bei dir die Seite nicht laden kann, das sollte aber dann wie gesagt in der Console stehen. Sieht dann ungefähr so aus: