Angenommen, Sie möchten eine Website erstellen, auf der das Klicken von Schaltflächen in der Navigation dynamisch Inhalte lädt. So ähnlich wie bei den Organic Tabs, nur dass die Inhalte dynamisch geladen werden. Sagen wir, etwas wie das hier

Demo anzeigen Dateien herunterladen
Das HTML: Es funktioniert alles ohne JavaScript
Es gibt keine Entschuldigung dafür, dass die Navigation einer Website ohne aktiviertes JavaScript komplett kaputt ist. Daher ist der beste Ansatz, einfach diese Seiten und die Navigation als ganz normales semantisches HTML zu erstellen. Wissen Sie, so als wäre es 2001.
Die Links der Navigation verweisen auf die Dateien, die diesen Inhalt enthalten, und sind für sich allein voll funktionsfähige Seiten.
<nav>
<ul>
<li><a href="index.php">Home</a></li>
<li><a href="about.php">About</a></li>
<li><a href="contact.php">Contact</a></li>
</ul>
</nav>
CSS
Dies ist eigentlich kein Tutorial über CSS, aber wenn Sie einen Blick darauf werfen möchten, nur zu. Ein großes Dankeschön an Mike Rundle, der mir neulich auf Twitter die CSS für diese Buttons gezeigt hat, als ich daran arbeitete, und ich habe sie gestohlen.
jQuery JavaScript
Das JavaScript ist hier der spaßige Teil! Das ist der Plan in einfachen Worten
- Wenn ein Navigationsbutton geklickt wird…
- Ändere den Hash-Tag der URL
- Wenn sich der Hash-Tag in der URL ändert…
- Blende den alten Inhalt aus
- Lade und blende den neuen Inhalt ein
- Aktualisiere die aktuelle Hervorhebung der Navigation
Warum also der Aufwand mit dem Ändern des „Hash-Tags“? Mehrere Gründe
- Durch die Verwendung des hashchange Event-Plugins von Ben Alman können wir die Zurück/Vorwärts-Buttons des Browsers aktivieren. Super moderne Browser unterstützen dashashchangeEvent selbst, dieses Plugin ermöglicht die Unterstützung für ältere Browser.
- Wir können den Hash beim Laden der Seite suchen und die entsprechende Seite laden (d. h. „Deep Linking“)
Voraussetzung
Wir verwenden die jQuery-Bibliothek, das onhashchange-Plugin und laden dann unser eigenes Skript zuletzt.
<script type='text/javascript' src='//ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js'></script>
<script type='text/javascript' src='js/jquery.ba-hashchange.min.js'></script>
<script type='text/javascript' src='js/dynamicpage.js'></script>
Code-Dump
$(function() {
var newHash = "",
$mainContent = $("#main-content"),
$pageWrap = $("#page-wrap"),
baseHeight = 0,
$el;
$pageWrap.height($pageWrap.height());
baseHeight = $pageWrap.height() - $mainContent.height();
$("nav").delegate("a", "click", function() {
window.location.hash = $(this).attr("href");
return false;
});
$(window).bind('hashchange', function(){
newHash = window.location.hash.substring(1);
if (newHash) {
$mainContent
.find("#guts")
.fadeOut(200, function() {
$mainContent.hide().load(newHash + " #guts", function() {
$mainContent.fadeIn(200, function() {
$pageWrap.animate({
height: baseHeight + $mainContent.height() + "px"
});
});
$("nav a").removeClass("current");
$("nav a[href='"+newHash+"']").addClass("current");
});
});
};
});
$(window).trigger('hashchange');
});
Wirklich nicht viel. Es sind nur 41 Zeilen mit einigen Leerzeilen zur besseren Lesbarkeit. Dies beinhaltet sogar die Anpassung der Höhe des gesamten Containers, um sie an den neuen Inhalt anzupassen.
IFrames… Echt jetzt?
Warum jQuery verwenden?
Die gesamte jQuery-Hash-Change-Funktionalität scheint bereits in PHP durch die Verwendung von Switch und GET integriert zu sein. Sie landen also bei ?x=subpage, zum Beispiel. Die Verwendung dieser Methode eröffnet auch viele andere Möglichkeiten für dynamische Inhalte, die weder JavaScript noch die jQuery-Bibliothek zum Ausführen benötigen würden.
Ich mag die animierten Übergänge, aber das scheint viel Code nur für dynamische Unterseiten zu sein…
Ich glaube, ich bin ein wenig verwirrt darüber, was Sie sagen. Der Sinn dieses Demos ist es, neue Inhalte dynamisch auf einer Seite zu laden, ohne die Seite neu zu laden. Das ist AJAX-Territorium, Client-seitige Technologie. PHP ist serverseitige Technologie, unfähig, dynamisch Inhalte selbstständig zu einer Seite hinzuzufügen.
Sie haben Recht, es ist serverseitig und es lädt die Seite neu.
Mein Punkt ist einfach, dass die Funktionalität in beiden Fällen im Grunde die gleiche ist – wenn ein Benutzer auf einen bestimmten Link klickt, wird nur ein bestimmter Teil des Inhalts (in Ihrem Beispiel div#guts, in meinem Beispiel ein include) in die Seite geladen; ein völlig neues Dokument (z. B. about.html) muss nicht geladen werden.
Damit diese „selektive Ladung“ in Ihrem Schema stattfinden kann, muss der Benutzer JavaScript aktiviert haben, die jQuery-Bibliothek, ein Plugin und ein paar Dutzend Zeilen JavaScript laden.
Mit PHP ist nichts davon notwendig. Es sei denn, es geht nur um Animation (was, sicher, cool ist), ich sehe nicht, warum die jQuery-Methode besser ist.
Wirklich, es sind nur unterschiedliche Methoden – gut für verschiedene Dinge. Ich denke nur, in den meisten Fällen ist dies wahrscheinlich nicht der beste Weg, um Navigation zu handhaben.
Wie auch immer, wie immer ein großartiges Tutorial.
@Philip,
Ich verstehe Ihren Punkt als Entwickler, aber der Benutzer auf einer Website wie Sie sagten („dynamisches PHP“) würde nicht wirklich erkennen, dass der Inhalt dynamisch geladen wird, wenn ich es auf Ihre Weise tun würde… aber wenn Sie es mit JS/jQuery machen, sieht der Benutzer „wow, ausblenden, hochschieben, neue Inhalte“ (riesiger Daumen hoch, erzählt allen seinen Freunden von der Website)… jetzt sagen Sie mir, was wichtiger ist =).
Also, wie ich schon sagte, der gesamte Sinn dieses gesamten Tutorials ist, dass der Inhalt dynamisch geladen wird, d. h. ohne Seitenaktualisierung. Wenn das keine Rolle spielt, gibt es eine Million verschiedener serverseitiger Technologien, die Websites mit Navigation erstellen können. Sehen Sie zum Beispiel jedes einzelne CMS, das jemals in einer serverseitigen Sprache erstellt wurde.
Und warum ist das kein guter Weg, um Navigation zu handhaben? Es funktioniert einwandfrei, mit oder ohne JavaScript.
Meine Güte. Ja, ja, ich weiß: ohne Seitenaktualisierung, CMS, yada yada. Ich weiß.
Ich sagte nicht, dass dies „kein guter Weg ist, um Navigation zu handhaben“. Es ist in einigen Fällen eine absolut gute Methode.
Ich sagte, dass es in den meisten Fällen wahrscheinlich nicht die beste Methode ist. Warum? Weil ich bezweifle, dass es so effizient ist wie andere, einfachere Methoden der dynamischen Seitenbefüllung (mit dynamisch meine ich nicht nur „ohne Seitenaktualisierung“, was mir wie eine enge Beschreibung erscheint).
Verwenden Sie die meisten Websites, die Sie erstellen, diese Methode? Wenn die Antwort nein lautet, dann stimme ich Ihnen wahrscheinlich schon zu.
Ich würde nicht einmal sagen „in den meisten Fällen“. AJAX ist das „In“-Ding – ähnlich wie jQuery – und es gibt viele Fälle, in denen es die bevorzugte Vorgehensweise wäre.
Diese Demo berührt es nicht wirklich (nicht ihr Punkt), aber die Reduzierung der Serverlast und die Verkürzung der Antwortzeit sind ein paar gute Gründe.
Schauen Sie sich zum Beispiel Facebook an. Dort passiert VIEL serverseitige Arbeit (Datenbankabfragen, Verarbeitung usw.), und wenn sie reine serverseitige Interaktionsmethoden verwenden würden, müssten Sie warten, während die GESAMTE Seite bei jeder Betrachtung eines Fotos neu verarbeitet und neu geladen wird.
Mit AJAX muss der Server nur den Teil der Seite bearbeiten, der sich tatsächlich ändert.
Auf jeden Fall ist es immer gut, eine Vielzahl von Möglichkeiten zu haben. Manche Leute möchten diese Art von dynamischer Interaktion auf ihren Websites nutzen, haben aber keinen Host, der ihnen serverseitiges Scripting erlaubt (z. B. einen kostenlosen Host – oder wie in meinem Beispiel oben, eine Seite auf Facebook).
Und schließlich,
Chris antwortet nur auf Ihre Kommentare und bittet um Klärung, wo er sie benötigt.
Ich habe mir den herunterladbaren Code noch nicht angesehen, aber basierend auf dem, was ich im Video gesehen habe, lädt das JavaScript eine ganze Seite, bevor es #guts extrahiert und den Rest wegwirft. Daher muss ich Philip zustimmen, dass es effizienter (oder zumindest gleich effizient) ist, dies mit einer Vorlage auf dem Server zu tun. Außer man würde den „nahtlosen“ Effekt verlieren, natürlich.
Es würde jedoch nicht viel Arbeit erfordern, auf ein PHP-Skript mit einem kleinen Parameter zu verweisen, der angibt, ob nur die „Guts“ gesendet werden sollen oder, standardmäßig, diese in eine Vorlage für die direkten Links zusammenzuführen. Dies würde auch einige clientseitige Analysen eliminieren.
Also, wie ich schon sagte
„Wirklich, es sind nur unterschiedliche Methoden – gut für verschiedene Dinge.“
Ich glaube, Traq meint damit, dass Ihre Formulierung den Eindruck erweckt, als wären Sie persönlich von Chris' Tutorial/Vorschlag beleidigt, Sie wirken unhöflich – nur meine zwei Cents.
Nun, Philip, ich verstehe Ihre Position zu Server-Side Includes. Ich glaube auch nicht, dass Sie unhöflich sein wollen. Worauf ich hinauswill, ist, dass Sie Chris' Antworten beiseiteschieben, die Aussage ist, dass dieses Tutorial nicht einfach nur eine „Lösung“ für die Einbindung einer Website-Navigation ist, sondern eine Methode zum dynamischen Importieren, Ersetzen und Übergängen zwischen externen Inhalten auf der Client-Seite zeigt. PHP kann das nicht (was kein Nachteil ist – es zeigt nur, dass es eine andere Umgebung bedient). Clientseitiges Scripting ist eine ganz andere Dimension des interaktiven Webdesigns.
Das unmittelbarste Beispiel, das mir einfällt, ist die Änderung einzelner Inhaltsteile auf einer Seite (nicht unbedingt der gesamten Seite), auf eine Weise, die visuell elegant ist und eine vollständige Neuladung der Seite vermeidet – was auch die Belastung für den Browser des Clients und den Server reduziert. Wenn Sie viele zusammengehörige Inhalte auf einer einzigen Seite haben, wäre Ihr Instinkt, diese in mehrere Seiten aufzuteilen, oder eine Art „Tab“- oder „Akkordeon“-Funktion zu verwenden, um die Unübersichtlichkeit zu beseitigen? Und wenn Sie es leicht wartbar halten wollten, wäre es dann nicht sinnvoll, jeden Abschnitt in eine eigene externe Datei (oder Datenbankeintrag) zu legen?
Ich denke, hier muss man zwischen „Befüllung“ und „Interaktion“ unterscheiden. Beide Methoden sind dynamisch – ich habe Chris' Kommentar nicht so verstanden, dass er seine Definition „einschränkt“. Letztendlich verfolgen sie jedoch ihre eigenen Ziele.
Richtig – ich glaube, ich habe mich ein wenig zu stark ausgedrückt. Mein anfänglicher Kommentar war eine aufrichtige Frage und nicht nur rhetorisch
Warum jQuery verwenden?
Man sieht diese Art von Navigation nicht oft über Websites hinweg. Ajax-Methoden werden verwendet, um Seitenabschnitte zu laden, aber normalerweise keine ganzen Seiten.
Lassen Sie mich meine Frage noch einmal formulieren
Wenn ich meine Website effizient und ihre inneren Abläufe sauber und logisch gestalten möchte, wäre es dann besser, diese Methode zu verwenden (bei der die „Nachteile“ das Laden einer JavaScript-Bibliothek, eines Plugins sowie einiger Dutzend Zeilen zusätzlicher Skripte sind) oder PHP zu verwenden (was im Nachteil mehr Serveranfragen und die gesamte Seitenaktualisierung bedeutet)? Ist die Verwendung von Ajax-Methoden zum Laden einer neuen Seite (auch wenn nicht die gesamte Seite geladen wird) wirklich ein besserer/effizienterer Ansatz als die Verwendung von PHP-Switch-Navigation? Was ist, wenn die Seite mehr Daten enthält als nur Text oder ein Formular?
Ich weiß es ehrlich gesagt nicht. Ich neige dazu zu vermuten, dass PHP für allgemeine Navigation effizienter ist, aber ich könnte falsch liegen.
Aber vielleicht gibt es auch eine Möglichkeit, beide Methoden zu nutzen, wobei der JavaScript-„Fallback“ eine PHP-„Unterseite“ ist.
Vielen Dank für Ihre Meinungen – es ist immer gut, verschiedene Perspektiven zu erhalten.
Grabe tiefer.
Hier ist ein kleiner Vorschlag: Warum nicht das Ladebild verwenden, um dem Benutzer anzuzeigen, dass im Hintergrund etwas passiert. Schließlich sind Benutzer daran gewöhnt, das zu sehen, wenn der Inhalt der Seite aktualisiert wird; wie zum Beispiel in einer AJAX-Webanwendung.
Schöne Grüße, Kumpel… und danke für den netten Artikel :)
Ich finde, dass das Ausblenden eine ziemlich gute Anzeige dafür ist, dass etwas passiert. Aber AJAX-Ladebilder sind auch cool. Hier ist eine Ressource
http://www.ajaxload.info/
Außerdem können Sie Ladezeichen verwenden
Tolle Ressourcen, das ist es, wonach ich immer gesucht habe, danke Chris!
Ja, aber hier aktualisierst du nur einfachen Text. Was ist mit diesen Seiten, die Bilder und andere Inhalte enthalten, die das Laden der Seite verlangsamen könnten? Wie würde das Ganze dann aussehen?
Übrigens, danke für die nützlichen Ressourcen :)
Ähm, ich glaube nicht, dass das funktionieren würde. Ich meine..
Leute mit einer guten Internetverbindung (wie alle in den Niederlanden) sehen den Loader nicht. Weil es so schnell aktualisiert werden würde. Daher denke ich, dass die fadeOut-fadeIn-Option die beste Idee wäre. Dann sehen alle (langsame oder schnelle Verbindungen), dass die Seite aktualisiert wird. Und dass neue Informationen vorhanden sind.
Vielleicht wäre es für die Bildladung eine gute Lösung. Aber auch hier denke ich, dass das Einblenden von Bildern noch besser wäre.
Dies ist eine wirklich coole Funktion für die Verwendung innerhalb einer bestimmten Seite, z. B. wenn Sie einige Produktbilder und Beschreibungen anzeigen möchten. Aber als eigentliche Website-Navigation in „meiner Meinung nach“ ist es ein schlechter Zug, nur weil ich mein SEO mag und nur eine Seite nicht mein Ding wäre, wenn es um die Optimierung meiner Website geht.
Aber immer noch wirklich gut und reibungslos, gefällt mir. Habe etwas Ähnliches auf meiner Portfolio-Seite verwendet, wo unter der Hauptportfolio-Navigation verschiedene Abschnitte waren und jeder Container eine Liste von Websites/Grafiken enthielt.
Ich werde vielleicht die hier von Ihnen verwendete nehmen, sie scheint reibungsloser zu funktionieren als der aktuelle Code, den ich habe! Auch dieser Link zu ajax-load ist ein großer Bonus, ich denke, eine Ladeanzeige fügt noch das gewisse Extra hinzu :)
Ich bin kein SEO-Experte, aber alle drei dieser Seiten sind voll funktionsfähige, eigenständige Seiten, die in der Navigation verlinkt sind. Das ist es, was ein Such-Bot sehen und folgen und lesen würde, genau wie jede andere Website.
Ich würde es wahrscheinlich nicht für die Navigation verwenden – ich denke, es ist besser geeignet für kleine Abschnitte einer Seite, die unabhängig interaktiv sein könnten.
Aber da die Navigation gut abfällt, sehe ich nichts Falsches daran (besonders da es nur eine Demo ist).
Hey Chris!
Ich hatte die gleiche Sorge und vielleicht kann ich das SEO-Problem klären. Es sieht so aus, als würden Bots allen Ihren Navigationslinks folgen und neuen Inhalt finden und ihn erfolgreich indizieren. Der primäre SEO-Fokus liegt jedoch immer auf Tags, daher frage ich mich, ob es möglich ist, diesen Ansatz für eine ganze Website zu verwenden und dynamische Titel-Tags für den dynamischen Inhalt zu haben.
Prost!
Brian
Guter Beitrag und bitte sagen Sie mir, wie ich ein Ladebild anstelle von Fading-Effekten anzeigen kann.
Wenn Sie wirklich auf das AJAX-Lade-GIF-Ding stehen, können Sie sich gerne den Code auf dieser Website ansehen, wo ich diesen Weg gegangen bin
http://boulderacousticsociety.net/
füge dies am Anfang der Funktion ein
finde diese Zeile
ersetze mit
Vielen Dank für die schnelle Hilfe
Nettes Tutorial. Ich freue mich sehr auf die Neuauflage Ihrer WordPress-Tutorials.
Weißer Text auf gelbem Hintergrund?
Ich werde das vergraben, weil ich keine Ahnung habe, worauf Sie sich beziehen.
Das ist großartig!
Ist es technisch möglich, die Zeilen .fadeIn und .animate irgendwie zu vertauschen, damit der Inhalt nach der Größenänderung des Containers eingeblendet wird.
Ich erkenne an, dass das mit dem Code, wie er ist, verrückt klingen mag, da der Container von der Höhe des Inhalts abhängt, um geladen zu werden, bevor er seine Größe ändert.
Es scheint visuell richtiger, wenn es umgekehrt ist, damit der Inhalt nicht überläuft, bevor der Container seine Größe ändert.
Es muss einen anderen Weg geben, die Höhe des Inhalts zu ermitteln, bevor er eingeblendet wird… Verstehen Sie, was ich meine?
:)
Das ist genau das Problem mit diesem in Chrome. Die finale Seite mit dem Formular darauf zeigt für eine Sekunde eine leere Seite an, bevor sie ihre Größe ändert und das Formular lädt.
Hallo Chris, könntest du erklären, warum die Zeile „$pageWrap.height($pageWrap.height());“?
Das habe ich nicht verstanden…
Danke!
Sicher.
Das div #page-wrap hat keine festgelegte Höhe von Anfang an, daher wächst es standardmäßig einfach auf die Höhe, die es für den darin enthaltenen Inhalt benötigt. Diese Zeile misst diese Höhe und weist ihr einen statischen Höhenwert zu. Sie werden keine Veränderung bemerken. Aber dann… wenn die Inhalte ausgeblendet werden, um sich auf neue Inhalte vorzubereiten, wird sich das #page-wrap nicht auf sich selbst zusammenklappen, da es jetzt eine feste Höhe hat.
Hey! Ich habe es verstanden!
Danke für die Aufmerksamkeit :)
Ich wollte gerade dasselbe fragen. Toller Trick. Danke Chris
Guter Tipp. Als ich mir den Code zum ersten Mal ansah, habe ich das auch nicht verstanden. Dachte nicht, dass sich das page-wrap ohne Angabe des Höhenattributs zusammenklappt.
Vielen Dank für das Tutorial und die Erklärung.
Gut gemacht, Chris.
Ich genieße immer deine Tuts und obwohl sie in keiner Version von IE gut aussehen, sind sie doch sehr sexy!
Die Knöpfe, um genau zu sein.
Ja, das ist das IE+CSS3-Problem. Die Dinge sehen in Safari, Chrome, Firefox wunderschön aus, aber IE ist immer der Ausreißer bei Browser-Technologie.
Wow, das liebe ich. Hat wirklich meinen Geist für einige nette Möglichkeiten geöffnet. Ich liebe den Effekt bei der Boulder Acoustic Society… ein tolles praktisches Beispiel.
Ich bin sehr dankbar für JQuery für Lösungen wie diese. (Oh, und ich bin heimlich in HTML5 und CSS3 verliebt, aber sag es JQuery nicht!)
Sehr schöne Arbeit, danke für das Tutorial
Hmmm…. scheint viel zu sein, um etwas relativ triviales zu erreichen.
Wie wäre es damit?
var $j = jQuery.noConflict();
$j(document).ready(function(){
$j(‘a’).click(function(){
$j.ajax({
url: $j(this).attr(‘href’),
success: function(response) {
$j(‘#content’).html(response);
}
});
return false;
});
});
Vielleicht hätte ich es als vollständiges Element machen sollen…
Das scheint etwas langwierig…
Vielleicht einfacher?
var $j = jQuery.noConflict();
$j(document).ready(function(){
$j(‘a’).click(function(){
$j.ajax({
url: $j(this).attr(‘href’),
success: function(response) {
$j(‘#content’).html(response);
}
});
return false;
});
});
Vielleicht hätte ich es als vollständiges Element machen sollen…
<html>
<head>
<script type=’text/javascript’ src=’http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js’></script>
var $j = jQuery.noConflict();
$j(document).ready(function(){
$j(‘a’).click(function(){
$j.ajax({
url: $j(this).attr(‘href’),
success: function(response) {
$j(‘#content’).html(response);
}
});
return false;
});
});
</head>
<body>
<div id=”menu”>
<ul>
<li><a href=”page1.htm”></li>
<li><a href=”page2.htm”></li>
<li><a href=”page3.htm”></li>
</ul>
</div>
<div id=”content”></div>
</body>
</html>
Danke Chris, tolles Tutorial :)
Спасибо Крис классный урок :)
@Chris Coyier
Ich weiß nicht, ob ich Ihnen deswegen mailen soll oder es hier posten soll. Aber Sie haben in den letzten Monaten viele (sehr gute) Artikel über kleine Probleme usw. gemacht.
Könnten Sie vielleicht irgendwann einen Artikel darüber schreiben, wie Sie Ihr jQuery/JS in Klassen strukturieren würden. Insbesondere wenn viel JS involviert ist. Es wäre sehr interessant, einen „fortgeschritteneren“ Artikel über JS/jQuery zu sehen und wie Klick-/Live-Events implementiert werden/sollten.
Viele Grüße!
Sie ändern nur class=”current” im Gedanken, jQuery behebt das :).
Danke für das Tutorial, großartige Sachen:)
Ich wünschte, ich wüsste auch nur die Hälfte davon!
Ich muss darauf hinweisen, dass die Kontaktseite in Chrome nicht richtig animiert.
Chris. Neugierig. Der Endeffekt für den Kunden ist, drei Webseiten anzuzeigen. Was ist die Verbesserung der Bandbreite/Serververarbeitung/Antwortzeit (für den Website-Besucher) Ihrer Methode im Vergleich zum einfachen Prozess von drei separaten Seiten mit Button-Href-Links?
Die Tatsache, dass es verwendet werden könnte, um jedes CMS mit AJAX-Funktionalität für einige Teile seines Inhalts zu versehen, zum Beispiel.
Denken Sie darüber nach, Tag-Clouds, die Listen im Handumdrehen rendern, Bildgalerien, die Seiten ohne vollständiges Neuladen wechseln, Suchergebnisse, die schneller zu Ihnen kommen.
oO Süßigkeit.
Unter Firefox 3.5.9 auf einem XP-Rechner hat die Inhaltsbox einen sehr blauen Stich und nicht grau wie Ihr Screenshot.
In Chrome hingegen sieht es fast genauso aus wie auf Ihrem Screenshot.
aber da dies kein CSS-Beispiel ist... süßes jQuery-Beispiel! lol
Meine Entschuldigung...
Ich habe ein paar Tippfehler gemacht
<html> <head> <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js'></script> <script type='text/javascript'> var $j = jQuery.noConflict(); $j(document).ready(function(){ $j("a").click(function(){ $j.ajax({ url: $j(this).attr("href"), success: function(response) { $j("#content").html(response); } }); return false; }); }); </script> </head> <body> <div id="menu"> <ul> <li><a href="page1.html">page 1</a></li> <li><a href="page2.html">page 2</a></li> <li><a href="page3.html">page 3</a></li> </ul> </div> <div id="content"></div> </body> </html>Das ist theoretisch dasselbe, nur etwas umständlicher...
1) Wir verwenden hier keine mehr als eine JavaScript-Bibliothek, kein .noConflict() nötig
2) Sie laden die gesamte zurückgegebene Antwort in die #content-Div, sodass Sie im Grunde eine "Seite in einer Seite" haben. Die .load()-Funktion nutzt sowieso .ajax(), erlaubt Ihnen aber, einzugrenzen, was Sie zurückbekommen möchten, in unserem Fall nur den Inhalt.
3) Dies hat nichts von der dynamischen Höhenanpassung und dem Ausblenden, das die Demo reibungslos funktionieren lässt.
4) Da Sie drei Click-Handler anhängen, sollten Sie stattdessen .live oder .delegate in Betracht ziehen.
Aber ansonsten... sieht es so aus, als hätten Sie ein gutes Verständnis dafür, wie all das funktioniert, also einen goldenen Stern!
Die Kontrolle über widersprüchliche Bibliotheken durch Zuweisung eines Handlers an jQuery ist für mich gute Praxis.
Animationen während des AJAX-Aufrufs hinzuzufügen wäre genauso effektiv ohne die zusätzlichen Bibliotheken, da ich keinen Grund sehe, unseren href-Wert in einen Anker zu verwandeln.
Die Verwendung von .live oder .delegate sind ebenfalls Optionen, aber warum nicht die Funktion für das verwenden, wofür sie entwickelt wurde?
Die Anwendung von Höhen- und Breitenattributen auf das angegebene Div mit CSS erreicht dasselbe, was ich nicht hinzugefügt habe, um das JavaScript einfach zu halten.
Jedem das Seine, nehme ich an. Ich denke, weniger Bibliotheken und Code reduzieren die Dateigröße, was zu schnelleren Ladezeiten führt.
Vielen Dank für das Tutorial.
Hallo Chris,
Danke für dieses Tutorial, es ist großartig.
Ich hatte die gleiche Frage wie skhot^ oben, die nicht beantwortet wurde. Ist es möglich, dass sich die Inhaltsbox vor dem Ausblenden des neuen Inhalts vergrößert?
Danke..
Wenn Sie bemerken, dass die neue Inhaltsmenge größer ist als die alte (z. B. zwischen dem "Über uns"- und dem "Kontakt"-Panel), passt sich die Box *zuerst* an. Wenn das kein Problem ist (von größer zu kleinerem Inhalt wechseln), finde ich es in Ordnung, den Inhalt vor der Größenänderung erscheinen zu lassen – spart Wartezeit.
... und natürlich passiert das nicht mehr konsistent, nachdem ich auf Senden geklickt habe. : )
richtig, aber wenn Sie von "Über uns" zu "Startseite" wechseln, schauen Sie genau hin, und Sie können den Text sehen, bevor die Box die Größe ändert... gibt es eine Möglichkeit, das zu umgehen, oder nicht?
Danke..
Ja, das habe ich gesehen, sobald ich gepostet habe. jQuery ist nicht meine Spezialität, aber ich würde vermuten, dass es behoben werden könnte.
Ich bin heute bei meinen Eltern und schaue mir das auf deren Internetverbindung an, die langsamer als der Durchschnitt ist, und bemerke, dass die Kontaktseite ziemlich langsam lädt. Liegt das daran, dass es sich um eine Wufoo-Seite handelt und sie von deren Server geladen werden muss, bevor sie zu Ihrem gelangt?
Schlecht auf Internet Explorer, schlecht auf Safari, teilweise ok auf Firefox. Andere Browser unbekannt.
Wenn Sie die Seite ohne Hash laden, ist die aktuelle Navigation nicht eingerückt. Außerdem, wenn Sie innerhalb dieser hash-losen URL zur Über-uns-Seite navigieren, erhalten Sie
/DynamicPage/index.php#about.php
Die Navigation funktioniert immer noch, aber ich finde es schöner ohne eine siamesische Seiten-URL :)
Wie auch immer, ich liebe die Screencasts, Chris! Wirklich ehrlich und inspirierend.
+1
Ich bin kein Programmierer, und es gibt wahrscheinlich einige "versteckte" Probleme, warum Sie das alte Skript aktualisiert haben... aber ich denke, das war besser und sah besser aus. :-) Allerdings dauert es lange, bis es auf meiner Webseite geladen wird. Warum?
Interessant. Ich sehe ähnliche Techniken immer öfter verwendet. Ich persönlich mag es. Es ist nicht gut für SEO, aber funktioniert in bestimmten Situationen.
Normalerweise würde ich das löschen oder vergraben, weil ich es nicht mag, wenn Leute einen lächerlichen SEO-Begriff als ihren "Namen" verwenden... Allerdings möchte ich hier die Dinge richtigstellen.
Die Verwendung dieser Technik ist aus SEO-Sicht **absolut akzeptabel**. Die Navigation und der Inhalt sind ganz normale Links wie jede andere Website. Der schicke AJAX-Kram ist reine progressive Verbesserung, die darauf aufbaut.
Ich muss Herrn Coyier zustimmen... SEO hat wirklich nichts mit dem Navigationsinhalt der Verwendung von Ajax zum Laden von Inhalten in einem Div zu tun.
Suchmaschinenoptimierung findet hauptsächlich im Header-Inhalt der Seite statt, der sich in diesem Fall nicht ändert.
Im Gegenteil, Sie könnten verschiedene Header-Inhalte nicht nur im primären Header, sondern auch im dynamisch geladenen Inhalt nutzen.
Meta-Tags, URL-Einreichungen, Link-Backs und Sitemap sind Ihre Ziele bei SEO, nicht dynamische Inhalte, es sei denn, es ist natürlich Flash.
Dies würde definitiv gut von Suchmaschinen erfasst werden, aber ich denke, Sie würden ein wenig PageRank bei den sekundären Seiten verlieren, da es zwei verschiedene Links für denselben Inhalt gäbe.
Offensichtlich haben eingehende Links viel damit zu tun, wie Google die Wichtigkeit bestimmt. Sie hätten Ihre Über-uns-Seite als /about.php, während jemand, der Ihre Seite organisch besucht und auf 'Über uns' klickt, index.php#about.php sehen würde und diese wahrscheinlich zum Verlinken verwenden würde.
Es hilft immer noch dem Ranking Ihrer Seite, es vermasselt nur ein wenig das Ranking des internen Inhalts. Ich würde sagen, dass sich 99,9 % der Webentwickler mehr um tatsächlich gute Inhalte als um Müll wie diesen kümmern sollten.
Ich habe JavaScript aktiviert, und doch ist ein Nebeneffekt von "auch für Nicht-JavaScript-Benutzer gemacht"
Wenn Sie mit der mittleren Maustaste auf einen Button klicken, funktioniert er immer noch wie erwartet (in einem neuen Tab/Fenster öffnen)!
Das ist also auch für JavaScript-Benutzer ziemlich wichtig!
Hallo, ich interessiere mich immer für Ihre Tutorials, aber ich kann nicht ganz verstehen, wie das alles funktioniert. Könnten Sie in Ihrer Freizeit ein vollständiges Tutorial-Video erstellen, das erklärt, wie man das Demo-Layout erstellt? Nur damit es klarer wird.
Ich bin mir nicht sicher, wenn ich ein Layout entwerfe, ob ich diesen Code berücksichtigen muss oder ihn normal mit CSS codieren und einfach den Java-Code mit 41 Zeilen zufällig in die Haupt-.html-Startseite einfügen muss und ob er dann so funktioniert, wie er soll.
Feedback ist sehr willkommen<3 :3
Sie haben es vielleicht schon selbst gefunden, aber Chris hat einen Screencast, der diese Demo im Detail erklärt.
Danke, dass Sie dies noch einmal überarbeitet haben, Chris. Ich wollte es ausprobieren.
Obwohl ich nichts direkt zu diesem Artikel beitragen kann, möchte ich mich dafür bedanken, dass Sie ständig so großartige Inhalte produzieren. Ich besuche Ihre Seite täglich (warum ich den Artikel, den ich gesucht habe, verpasst habe, ist mir ein Rätsel). Ich mag es, wie Sie reale Probleme, auf die Sie bei Ihrer Arbeit stoßen, aufgreifen und die Lösungen mit uns teilen; es ist eine nette Abwechslung zu vielen Blogs.
/ Ende des Lobes
Ist es nicht besser für SEO, diese Links so zu gestalten
subpage.php
Statt
?x=subpage
Ich denke, das ist das Wichtigste. Ich habe mich immer von diesen Ein-Seiten-Ideen ferngehalten, die Inhalte mit einer sanften Animation laden, aber Chris hat hier eine gute Lösung.
Wenn Suchmaschinen denken, sie crawlen verschiedene Seiten, und der Betrachter denkt, er ist die ganze Zeit auf derselben Seite. Das ist großartig...
– Brandon Rager
Hallo, ich versuche, die Slimbox-Funktion darauf anzuwenden, aber es gelingt mir nicht. Gibt es etwas, das das verursacht?
Danke!
Keine Sorge, ich habe es geschafft =) Wenn Sie es sehen möchten, können Sie auf den Link meines Namens klicken, und Sie werden es sehen :D
danke trotzdem..
Sehr schön, ich habe das getestet und es gefällt mir sehr gut, aber ich muss den meisten Beiträgen zustimmen. Ich würde es nur nicht als Hauptnavigation verwenden, da nicht alle Leute Java aktiviert haben. Es funktioniert aber sehr gut für kleine Informationsschnipsel innerhalb einer Seite, sehr schön. Ich freue mich auf weitere tolle Tipps wie diesen, da es sehr gut zu lernen war, danke
Großartiges Tutorial, wie immer.
Das ist sehr gut für statische AJAX-ähnliche Webseiten.
Danke
Hallo Chris,
Tolles Tutorial hier, gut zu sehen, wie es überarbeitet und mit neuen Techniken aktualisiert wurde, wie im Screencast erwähnt.
Schade, dass einige Leser das Bedürfnis verspüren, jedes Detail zu zerpflücken.
Ich sehe diese Methode als absolut akzeptabel für eine ganze Website – sie funktioniert **mit und ohne Javascript**, was einige Kommentatoren hier offensichtlich übersehen haben.
Das Javascript wird nur verwendet, um das DOM/Browser-Standardverhalten zu manipulieren und den Inhalt zu ändern, wie in diesem Beitrag klar erklärt.
Die Tatsache, dass die Vor-/Zurück-Schaltfläche funktioniert und Sie direkt auf Seiten verlinken können, macht dies zu einer sehr vorteilhaften Lösung für alle Projekte, bei denen ich dies möglicherweise verwenden muss.
@Brandon, Die Änderungen am Seiteninhalt werden als Anker an die URL angehängt. Dies hat keine Auswirkungen auf SEO oder Indexierung, da es sich um einzelne Seiten handelt, die als solche indiziert werden. Es wurde hier in den Kommentar-Threads klar erklärt.
Prost!
Danke für das großartige Tutorial/Screencast, Chris.
Wieder einmal hat sich das hässliche Haupt des Monsters "Wenn es für mich gut genug ist, warum es anders angehen" gezeigt.
Natürlich ist diese Technik vielleicht nicht für alle Fälle und Szenarien geeignet, wie z. B. Seiten, die stark auf Anzeigen-Impressions für Einkommen angewiesen sind, aber sie hat ihren eigenen Platz und ich mag sie wirklich.
Danke Chris, du hast mir gerade die perfekte Idee gegeben, um das Aussehen der Schulwebseite für Kinder aufzuwerten!
Hallo Chris!
Ich liebe Ihr Tutorial! Es ist genau das, was ich gesucht habe, um meine neue Website zu erstellen!
Ich habe ein Problem, schwebende Divs in den "Innereien" des Divs zu platzieren, es scheint, dass die dynamische Größenänderung der Seite mit schwebenden Divs nicht mehr funktioniert.
Haben Sie Tipps, wie ich das zum Laufen bringen könnte?
Vielen Dank nochmals für das tolle Tutorial! Leute wie Sie machen das Web zu einem besseren Ort!
Ich habe das gleiche Problem. Hat jemand eine Lösung???
Ich habe diesen Code implementiert und sobald ich auf eine neue Seite klicke, werden alle meine anderen jQuery-codierten Animationen deaktiviert. Sieht das noch jemand?
Tom, ich habe ein ähnliches Problem. Ich versuche, ein Galerie-Skript zu einer Seite hinzuzufügen, und es funktioniert nicht. Ich habe Flash-, AJAX-, JavaScript- und PHP-Galerien ausprobiert :( Hat jemand eine Idee, wie dieses Problem behoben werden kann?
Gibt es eine Möglichkeit, das innerhalb des Inhalts einer Seite zu tun? Ich möchte nicht für jede meiner Portfolio-Seiten separate Seiten erstellen müssen. Ich habe das auf anderen Websites gesehen, aber ich kann das nicht zum Laufen bringen.
Irgendwelche Ideen?
Ich frage mich nur, wenn ich das auf einer Website verwenden möchte, muss ich dann auf Ihre Website zurückverlinken?
Die einzige Übersehen dieser Methode ist die Handhabung von HTTP-Fehlern. Das Hinzufügen eines nicht existierenden Dateinamens hinter dem Hash führte zu einer leeren Seite – keine Fehlermeldung, nichts, um den Benutzer zu alarmieren/zu informieren.
Vielleicht muss der AJAX-Handler erweitert werden, um diese Fehler zu behandeln.
Ich habe eine leichte Modifikation am Code in dynamicpage.js vorgenommen, um Fehler zu behandeln.
Wo hast du das eingefügt (in die dynamicpage.js)? Könnte ich auch eine Seite (.html) laden, anstatt die Fehlermeldung in das JS zu codieren?
Damit die Fehlererkennung dasselbe tut, nur indem die 404-Seite und so weiter geladen wird.
Danke für diese Modifikation...!
Hallo Chris,
Danke für den Screencast. Ich habe etwas daraus gelernt :-)
Warum müssen wir das 'delegate'-Ereignis überhaupt an die -Tags binden? Weil das Browser-Standardverhalten genau das ist, was wir in dieser Funktion tun, oder?
Ok, Entschuldigung. Jetzt verstehe ich. Es gibt kein # in der href des Links
Danke für das großartige Tutorial, Chris.
Ich versuche, Ihr Tutorial für Magento zu verwenden, aber ich kann es mit Vorlagen nicht zum Laufen bringen. Ich weiß nicht, ob Sie mit der Plattform vertraut sind, aber ich frage mich, ob Sie irgendwelche "Aha"-Schritte/-Tricks kennen, mit denen ich anfangen oder die ich bei der Gestaltung für Magento vermeiden sollte.
Ich werde aber weiter basteln! Danke.
Meine bisherigen Fortschritte
Ich habe eine Vorlage aus Ihrem index.html-Beispiel erstellt und habe zwei CMS-Seiten, die die neue Vorlage (dynamic.html) verwenden. Jeder Inhaltsbereich des CMS ruft statische Blöcke ab.
Aber als ich Code zurückfüge, stelle ich fest, dass mein jQuery noConflict-Snippet das dynamicpage.js (und/oder hashchange.js) kaputt macht.
Ich habe die Funktion $ zu jQuery geändert, aber die Seiten haben immer noch einen vollständigen Seitenrefresh gemacht, anstatt des dynamischen Ladens. Wie würde man noConflict mit diesem Setup zum Laufen bringen?
Danke, Chris.
Hey, sehr gut, Mann, danke für das Tutorial. Eine Sache, die ich bemerkt habe, ist, dass es besser funktioniert, wenn Sie ein paar Codezeilen vertauschen. Machen Sie es stattdessen so....
Ich möchte den Code mit dem PrettyPhoto-Galerie-Skript verwenden. Ist das mit einem "noConflict"-Befehl möglich?
Chris,
Vielen Dank für diesen exzellenten Artikel. Ich habe nur ein großes Problem, das ich unten beschreiben werde.
Vielleicht bin ich es nur, aber wenn ich auf einen Link in Ihrer Demo klicke, um zur "Über uns"-Seite zu gelangen (1 Aktion), wenn ich dann sofort die Zurück-Schaltfläche benutze (um wieder zur "Startseite" zu gelangen), passiert nichts.
Wenn ich jedoch auf "Über uns" und dann auf "Startseite" klicke (2 Aktionen), kann ich dann die Zurück-Schaltfläche verwenden, um zu "Über uns" zurückzukehren.
Aus meinem schnellen Test lässt der Code nicht zu, dass ein Benutzer mit der Zurück-Schaltfläche von nur einer Seitenaktion zurückkehrt. Ein Benutzer muss mindestens zwei Seiten navigieren, bevor die Zurück-Schaltfläche funktionsfähig ist.
Wie kann ich diesen Fehler beheben? Oder ist das etwas, das ich nur auf meiner Plattform erlebe: Mac OSX 10.6.4, Safari 5? Das scheint unwahrscheinlich.
Sehr nützlich, danke.
Habe gerade eine Seite wie diese erstellt und hash.js verwendet, was großartig ist.
Das ist genau das, wonach ich gesucht habe. Wirklich exzellente und robuste Implementierung. Nur zur Information, falls jemand anderes Probleme mit diesem Code auf seinem System hat, versuchen Sie, den Teil
$("nav").delegate("a", "click", function() {zu bearbeiten. Aus irgendeinem Grund wurde dies nur ausgelöst, wenn ich auf den Button klickte, der der aktuellen Seite entsprach (d. h. es funktionierte für den "Kontakt"-Button, wenn ich auf der Kontaktseite war; wenn ich von der "Kontakt"-Seite aus auf einen der anderen Buttons klickte, wurde die Funktion nicht ausgelöst). Danke Chris!!!Vielen Dank, das ist, was ich wollte. Ich brauche noch eine Hilfe, wie kann ich einen Preloader hinzufügen, während die Seiteninhalte geladen werden.
Hallo Chris,
Dieses Tutorial ist wunderbar, vielen Dank.
Ich fragte mich, ob Sie kurz erklären könnten, wie man während des Ladens des Inhalts ein Lade-GIF (oder eine CSS-Animation) implementiert?
Beste Grüße,
Oliver
Hallo zusammen, toller Artikel... 4 Jahre alt und immer noch lebendig!
Hoffentlich kann mir jemand bei einem Problem helfen, das ich habe. Ich habe #page-wrap auf overflow:hidden gesetzt, und eine der Seiten, die ich lade, hat ein verstecktes Div, das ich mit slideDown() anzeigen möchte.
Das Problem ist, dass aufgrund von overflow:hidden das Div nicht angezeigt wird, und wenn ich die :hidden-Regel entferne, wird es angezeigt, aber hinter dem Footer-Inhalt, der wegen $pageWrap.height($pageWrap.height()); an Ort und Stelle bleibt.
Was ich erreichen möchte, ist, den versteckten Inhalt anzuzeigen und dabei den Footer nach unten zu schieben.
Ich habe diesen Fiddle erstellt, um das Problem zu veranschaulichen: http://jsfiddle.net/V2URZ/1/
Ich freue mich über jede Hilfe, die ich bekommen kann, das macht mich wahnsinnig : )
Chris, das erste Mal, dass ich poste, aber ich bin schon lange dabei, tolle Seite hast du.
Beste Grüße