2016-08-08 104 views
3

Ich verwende history.pushState(stateObject, title, url), um neue Einträge in den Verlaufsstapel des Browsers zu schieben. Trotz seines Namens setzt der zweite Parameter title nicht den Titel des Eintrags, der im Verlauf des Browsers angezeigt wird. Wenn ich das richtig verstehe, ist title reserviert für die zukünftige Verwendung und derzeit von allen Browsern ignoriert. Es sollte sicher sein, hier '' zu bestehen und meine Ergebnisse unterstützen dies.Wie wird der Titel des Eintrags festgelegt, den der Browser für history.pushState anzeigt?

Daher frage ich mich, wie man die Bezeichnung, die der Benutzer in seiner Geschichte sehen wird, und ich dachte, document.title würde die Arbeit tun. So sieht mein Code in etwa so aus

var myTitle = /* code to generate title here */ 
var myURL = /* code to generate url here */ 
var myState = /* code to generate realizable state object here */  

document.title = myTitle; 
history.pushState(myState, '', myURL); // 2nd parameter can also be myTitle; this has no effect on all major browsers 

Allerdings funktioniert es nicht wie erwartet. Genauer gesagt, ich stoße auf einen merkwürdigen Doppelfehler. Es scheint, dass pushState keinen neuen Verlaufseintrag unter Verwendung des neuen document.title, sondern des vorherigen Titels erstellt. Ich schätze das Problem ist, dass das DOM nicht sofort aktualisiert wird, sondern nur, nachdem JS den aktuellen Aufruf-Stapel verlässt. So wird document.title = myTitle nach pushState wirksam.

Die note below bullet point 8 at chapter 5.5.2 der HTML5-Spezifikation des W3C sagt:

Die title rein beratende ist. Benutzeragenten verwenden den Titel möglicherweise in der Benutzeroberfläche.

Dies ist das Verhalten, wie es von allen gängigen Browsern implementiert wird. Die Benutzeroberfläche und der neue Titel werden jedoch nur aktualisiert, nachdem die JS-Funktion zurückgegeben wurde.

Irgendwelche Lösungen?

Antwort

0

Das Popstate-Ereignis wird ausgelöst, wenn sich der aktive Verlaufseintrag ändert. Wenn der zu aktivierende Protokolleintrag durch einen Aufruf von history.pushState() erstellt wurde oder von einem Aufruf von history.replaceState() betroffen war, enthält die state-Eigenschaft des Popstate-Ereignisses eine Kopie des Zustandsobjekts des Protokolleintrags.

window.addEventListener('popstate', function(e) { 
    var character = e.state; 

     document.title = "Title | "; 

}); 
+0

Und wie hilft dies, den richtigen Titel zu setzen, der für den Eintrag im Browserverlauf verwendet wird? Ich verweise auf den Hinweis unter Punkt 8 in Kapitel 5.5.2 der HTML 5-Spezifikationen [[https://www.w3.org/TR/html5/browsers.html#history-1]]. Es heißt: "Der Titel ist rein beratend. Benutzeragenten könnten den Titel in der Benutzeroberfläche verwenden." Das Problem ist jedoch, dass die Benutzeroberfläche erst am Ende der JS-Funktion aktualisiert wird. – user2690527

+0

Setzen Sie diesen Titel auf eine Variable vor push.pushState(), dann können Sie auf den Titel im EventListener zugreifen. Sie können hier so viele Logik verwenden. – Shine

+1

Ich glaube, du hast das Problem nicht bekommen. Das Problem ist, dass 'pushState' einen neuen Eintrag im Browserverlauf erstellt und den falschen (veralteten, vorherigen) Titel verwendet, um diesen Eintrag zu erstellen. Daher wird der Benutzer der Webanwendung, der ein Element aus dem Verlauf auswählt, auf eine andere Seite irregeführt, die er erwartet, weil der Titel (in der Historie des Browsers) einzeln angezeigt wird. Das hat absolut nichts mit dem 'Popstate'-Event zu tun. Vielleicht solltest du die Frage noch einmal durchlesen. – user2690527