2016-08-08 2 views
3

私は、ブラウザの履歴スタックに新しいエントリをプッシュするhistory.pushState(stateObject, title, url)を使用しています。その名前にもかかわらず、2番目のパラメータtitleは、ブラウザの履歴に表示されるエントリのタイトルを設定しません。私が正しく理解していれば、titleは将来のために予約されており、現在すべてのブラウザで無視されています。私はここで''を渡すことは安全で、私の発見はこれをサポートしています。したがってブラウザがhistory.pushStateに対して表示するエントリのタイトルを設定するにはどうすればよいですか?

、私は、ユーザーが自分の履歴に表示されるラベルを設定する方法だろうと私はdocument.titleは、仕事をするだろうと思いました。だから私のコードはこのように見える

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 

しかし、期待どおりに動作しません。より正確には、私は奇妙なオフ・バイ・ワンのエラーに遭遇します。 pushStateが新しいdocument.titleが、前のタイトルを使用して、新しい履歴エントリを作成していないようです。私は問題は、DOMがすぐに更新されないことですが、JSが現在の呼び出しスタックを残した後でなければなりません。従ってはpushStateの後に有効になります。 W3CのHTML5仕様のnote below bullet point 8 at chapter 5.5.2

は言う:

titleは純粋に助言です。ユーザーエージェントは、ユーザーインターフェイスのタイトルを使用する場合があります。

すべての主要なブラウザによって実装されるこれが動作です。 UIを強化し、新しいタイトルはJS関数が返った後にのみ更新されます。

すべてのソリューションはありますか?

答えて

0

popstateイベントがアクティブのとき履歴エントリの変更を解雇されました。ヒストリエントリがhistory.pushState()の呼び出しによって作成された場合、またはhistory.replaceState()の呼び出しによって影響を受けた場合、popstateイベントのstateプロパティには履歴エントリの状態オブジェクトのコピーが含まれます。

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

     document.title = "Title | "; 

}); 
+0

これは、ブラウザの履歴のエントリに使用されている正しいタイトルをどのように設定するのに役立ちますか? 私はHTML5仕様書の[5.5.2]の箇条書き8の注釈を参照しています[[https://www.w3.org/TR/html5/browsers.html#history-1]]。 「タイトルは純粋に勧告であり、ユーザーエージェントはユーザーインターフェイスでこのタイトルを使用するかもしれない」と述べている。しかし、問題は、UIがJS関数の終わりまで更新されないということです。 – user2690527

+0

push.pushState()の前にそのタイトルを変数に設定すると、EventListener内のタイトルにアクセスできます。非常に多くのロジックを使用できます。 – Shine

+1

私はあなたが問題を起こさなかったと信じています。問題は 'pushState'がブラウザの履歴に新しいエントリを作成し、間違った(古い)タイトルを使用してこのエントリを作成することです。したがって、履歴から項目を選択するWebアプリケーションのユーザーは、タイトル(ブラウザの履歴内)がオフラインであるため、別のページに誤解されます。これは、「popstate」イベントとはまったく関係ありません。多分、あなたはその質問をもう一度読むべきです。 – user2690527

関連する問題