2017-02-14 4 views
0

Ich erstelle eine Website, wo ich nahtlos zwischen den Seiten (wie eine App) Übergang wollte. Um dies zu tun, habe ich mich darauf festgelegt, den Inhalt, den ich von der angeforderten Seite benötige, mit einem Preloader dazwischen zu überbrücken. Ich habe den folgenden Code:Ajax'ing Seiteninhalt; zuvor geklickt Link verhält sich nicht das gleiche Mal das zweite Mal nach dem Zurück Button Hit

var url = ""; 
var historyUrl = ""; 

$('a').on('click', function(e){ 
    url = $(this).attr("href"); 
    historyUrl = window.location.pathname; 

    e.preventDefault(); 

    $('#wrap main').removeClass('active'); 

    $("#wrap main").load(url + " #wrap main", function (responseText, textStatus, XMLHttpRequest) { 
     if (textStatus == "success") { 

      setTimeout(function() { 
       $('#wrap main').addClass('active'); 
      }, 1000); 

      history.pushState(null, null, url); 

     } 
     if (textStatus == "error") { 
      // Error out 
     } 
    }); 

    e.stopPropagation(); 
}); 

$(window).on('popstate', function(){ 

    $('#wrap main').removeClass('active'); 

    $("#wrap main").load(historyUrl + " #wrap main", function (responseText, textStatus, XMLHttpRequest) { 
     if (textStatus == "success") { 
      setTimeout(function() { 
       $('#wrap main').addClass('active'); 
      }, 1000); 
     } 
     if (textStatus == "error") { 
      // Error out 
     } 
    }); 
}); 

Wie Sie sehen, ich bin Triggern auf alle a-Tags, um diese zu testen. Dieser Code funktioniert in den meisten Fällen gut. Wenn ich auf die erste Seite gehe und auf einen Link klicke, gehe ich erfolgreich auf die zweite Seite über, ohne dass der Browser neu geladen wird. Die URL ändert sich und der Verlauf wird verschoben. Wenn ich dann auf den Zurück-Button klicke, lande ich auch auf der ersten Seite.

Das Problem tritt danach auf; wenn ich dann fortfahre, auf denselben Link zu klicken, habe ich beim ersten Mal auf die erste Seite geklickt, wird die On-Click-Funktion ignorieren und einfach die zweite Seite als Standard-Browser laden.

Ich kann nicht herausfinden, warum das passieren würde. Ich denke, es hat etwas mit dem PushState zu tun, aber ich kann es nicht genau sagen.

Fehle ich etwas offensichtlich hier?

Dank

Antwort

1

Wenn Sie Inhalte dynamisch laden, werden die Ereignisse nicht automatisch auf Elemente gebunden. Deshalb gibt es nach dem dynamischen Wechsel zurück zur ersten Seite keinen Event-Handler für den Klick auf den Link.

ändern

$('a').on('click', function(e){ 

zu

$(document).on('click', 'a', function(e){ 

und sollte es funktionieren.

Dadurch wird das Klickereignis in das Dokument verschoben (das sich nicht ändert), und die Rückruffunktion wird ausgeführt, wenn der Selektor im zweiten Argument ('a') mit dem Ereignisziel übereinstimmt.

+0

Zertrümmert, Legende! Alles gelöst, danke! – OllyF

+0

Nebenbei bemerkt: das Verschieben von Elementen in das Dokument ist keine wirklich gute Übung, da jedes Klicken auf die ganze Seite immer dieses Ereignis auslöst, jQuery prüft das Ereignisziel und geht dann weiter oder bricht ab. Sie sollten also auf das schließende Elternelement verzichten, ohne die Funktionalität zu unterbrechen. Wenn Sie zum Beispiel nur Teile einer Seite in ein div-Element mit id = "Seiteninhalt" laden, können Sie das Klick-Ereignis nur an alle $ ('# Seiteninhalt' ') - Elemente im Erfolgsrückruf Ihres Ajax binden anfordern. Das wäre viel sauberer. – Connum

Verwandte Themen