ホームページ  >  記事  >  ウェブフロントエンド  >  jsのHistoryオブジェクトの解析

jsのHistoryオブジェクトの解析

不言
不言オリジナル
2018-07-17 15:24:391588ブラウズ

この記事では主に js の History オブジェクトの分析を紹介します。これには特定の参照値が含まれています。必要な友達はそれを参照できます

length

history.length 属性は履歴を保存します。記録された URL の数。初期状態では、この値は 1 です。 IE10以降のブラウザは最初に2を返すため、互換性の問題があるため、この値は一般的には使用されません

Jumpメソッド

go()、back()、forward()

移動した位置がアクセス履歴境界を超えた場合、上記の 3 つのメソッドはエラーを報告しませんが、通知なく失敗します

[注] 履歴レコードを使用する場合、ページは通常、サーバーに新しい Web ページの送信を再要求するのではなく、ブラウザーのキャッシュから読み込まれます。 onload はトリガーされません

レコードの追加と変更

HTML5 では、履歴オブジェクトに 2 つの新しいメソッド、history.pushState() とhistory.replaceState() が追加されます。これらは、閲覧履歴のレコードを追加および変更するために使用されます。 state 属性はレコード オブジェクトの保存に使用され、popstate イベントは履歴オブジェクトの変更の監視に使用されます

【注意】IE9 はサポートしていません

【pushState()】

history.pushState() メソッドは追加しますブラウザ履歴の状態。 PushState() メソッドは、状態オブジェクト、タイトル (現在は無視されています)、およびオプションの URL アドレスの 3 つのパラメーターを取ります

 history.pushState(state, title, url);

状態オブジェクト - 状態オブジェクトは、pushState() メソッドによって作成された状態オブジェクト、および履歴レコードです 関連JavaScript オブジェクト。ユーザーが新しい状態に誘導されると、popstate イベントがトリガーされます。イベントの状態プロパティには、履歴の状態オブジェクトが含まれます。このオブジェクトが必要ない場合は、null

title - 新しいページのタイトルを入力できますが、現在すべてのブラウザはこの値を無視するため、null

URL - このパラメータは、新しい歴史の記録。新しい URL は現在の URL と同じドメイン内にある必要があります。そうでない場合、pushState() は例外をスローします。このパラメータはオプションです。特にマークされていない場合、現在の URL が example.com/1.html であると仮定すると、pushState メソッドを使用して参照に新しいレコードを追加します。 Record (history object).

var stateObj = { foo: 'bar' };
history.pushState(stateObj, 'page 2', '2.html');

上記の新規レコードを追加すると、すぐにブラウザのアドレスバーにexample.com/2.htmlが表示されますが、2.htmlにはジャンプせず、2.htmlが存在するかどうかも確認しません。の最新の閲覧履歴となります。この時点で google.com にアクセスし、戻るボタンをクリックすると、ページの URL には 2.html が表示されますが、コンテンツは元の 1.html のままです。もう一度巻き戻しボタンをクリックすると、URL に同じ内容の 1.html が表示されます。 つまり、pushState メソッドはページの更新をトリガーせず、履歴オブジェクトが変更され、アドレス バーの表示アドレスが変更されるだけです。変更する場合、pushState の url パラメータに新しいアンカー値 (つまりハッシュ) を設定しても、新しい URL と古い URL のハッシュが異なるだけであっても、hashchange イベントはトリガーされません

クロスドメイン URL が設定されている場合、エラーが報告されます。この設計の目的は、悪意のあるコードがユーザーに別の Web サイトにいると思わせることを防ぐことです

【replaceState()】

history.replaceState メソッドのパラメーターは、pushState メソッドとまったく同じです。 replaceState() メソッドは、新しいエントリを作成するのではなく、現在の履歴エントリを変更します

現在の Web ページが example.com/example.html であると仮定します

history.pushState({page: 1}, 'title 1', '?page=1');
history.pushState({page: 2}, 'title 2', '?page=2');
history.replaceState({page: 3}, 'title 3', '?page=3');
history.back()
// url显示为http://example.com/example.html?page=1
history.back()
// url显示为http://example.com/example.html
history.go(2)
// url显示为http://example.com/example.html?page=3

【state】

history.state プロパティは、現在の Web ページの状態オブジェクトを返しますpage

history.pushState({page: 1}, 'title 1', '?page=1');
history.state// { page: 1 }

【popstateイベント】

Every 同じ文書の閲覧履歴(履歴オブジェクト)が変化すると、popstateイベントが発生します

【注意】pushStateメソッドやreplaceStateメソッドを呼び出すだけなので注意が必要ですこのイベントはトリガーされません。ユーザーがクリックして参照した場合のみです。戻るボタンと進むボタンを押した場合、または JavaScript を使用して back()、forward()、または go() メソッドを呼び出した場合にのみトリガーされます。なお、このイベントは同じドキュメントのみを対象とし、閲覧履歴が切り替わって異なるドキュメントが読み込まれた場合にはイベントはトリガーされません

  使用的时候,可以为popstate事件指定回调函数。这个回调函数的参数是一个event事件对象,它的state属性指向pushState和replaceState方法为当前URL所提供的状态对象(即这两个方法的第一个参数)

  上面代码中的event.state,就是通过pushState和replaceState方法,为当前URL绑定的state对象

  这个state对象也可以直接通过history对象读取

 var currentState = history.state;

往返缓存

  默认情况下,浏览器会在当前会话(session)缓存页面,当用户点击“前进”或“后退”按钮时,浏览器就会从缓存中加载页面

  浏览器有一个特性叫“往返缓存”(back-forward cache或bfcache),可以在用户使用浏览器的“后退”和“前进”按钮时加快页面的转换速度。这个缓存中不仅保存着页面数据,还保存了DOM和javascript的状态;实际上是将整个页面都保存在了内存里。如果页面位于bfcache中,那么再次打开该页面时就不会触发load事件

  [注意]IE10-浏览器不支持

  【pageshow】

  pageshow事件在页面加载时触发,包括第一次加载和从缓存加载两种情况。如果要指定页面每次加载(不管是不是从浏览器缓存)时都运行的代码,可以放在这个事件的监听函数

  第一次加载时,它的触发顺序排在load事件后面。从缓存加载时,load事件不会触发,因为网页在缓存中的样子通常是load事件的监听函数运行后的样子,所以不必重复执行。同理,如果是从缓存中加载页面,网页内初始化的JavaScript脚本(比如DOMContentLoaded事件的监听函数)也不会执行

  [注意]虽然这个事件的目标是document,但必须将其事件处理程序添加到window

  pageshow事件有一个persisted属性,返回一个布尔值。页面第一次加载时或没有从缓存加载时,这个属性是false;当页面从缓存加载时,这个属性是true

  [注意]上面的例子使用了私有作用域,以防止变量showCount进入全局作用域。如果单击了浏览器的“刷新”按钮,那么showCount的值就会被重置为0,因为页面已经完全重新加载了

  【pagehide】

  与pageshow事件对应的是pagehide事件,该事件会在浏览器卸载页面的时候触发,而且是在unload事件之前触发。与pageshow事件一样,pagehide在document上面触发,但其事件处理程序必须要添加到window对象

  [注意]指定了onunload事件处理程序的页面会被自动排除在bfcache之外,即使事件处理程序是空的。原因在于,onunload最常用于撤销在onload中所执行的操作,而跳过onload后再次显示页面很可能就会导致页面不正常

  pagehide事件的event对象也包含persisted属性,不过其用途稍有不同。如果页面是从bfcache中加载的,那么persisted的值就是true;如果页面在卸载之后会被保存在bfcache中,那么persisted的值也会被设置为true。因此,当第一次触发pageshow时,persisted的值一定是false,而在第一次触发pagehide时,persisted就会变成true(除非页面不会被保存在bfcache中)

function pushHistory(){
  var state = {
       title: "title",
       url: "#"     
    }
  window.history.pushState(state, "title", "#");   
}

pushHistory()

2、history.js用于兼容html4,也可以监听pushState与replaceSate

相关推荐:

JavaScript中的History历史对象_基础知识

以上がjsのHistoryオブジェクトの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。