ホームページ ウェブフロントエンド jsチュートリアル JavaScript は、refreshing_javascript スキルなしでブラウザの進む関数と戻る関数を実装します。

JavaScript は、refreshing_javascript スキルなしでブラウザの進む関数と戻る関数を実装します。

May 16, 2016 pm 04:32 PM
javascript ブラウザ

私は最近バックボーンを学んでいます。バックボーンを理解するには、まずスパを理解する必要があります。スパを理解するには、まずシングルページ アプリケーションがページを更新せずに URL を変更する方法を理解する必要があります。

AJAX は、別のページにジャンプする場合に比べて、ページの切り替えの間に白い画面が表示されることがなくなり、ユーザーのブラウジング エクスペリエンスを大幅に向上させたと言えます。しかし、初期の AJAX アプリケーションの多くはブラウザの前後機能をサポートしていないため、ユーザーが Web サイトのどこを閲覧しても、更新されるとすぐに元の位置に戻ってしまい、ユーザーはブラウザを使用できなくなりました。閲覧履歴を切り替えるための「進む」および「戻る」ボタン。

最初の問題については、Cookie または localStorage を使用してアプリケーションのステータスを記録し、ページを更新するときにこのステータスを読み取り、対応する ajax リクエストを送信してページを変更するだけで、比較的簡単に解決できます。しかし、2 番目の問題は非常に厄介です。まず、最新のブラウザの解決策について話しましょう。

HTML5 ソリューション

HTML5 が順方向と逆方向を実装する方法を理解するには、まず履歴オブジェクトと場所オブジェクトを理解する必要があります。

履歴オブジェクト

履歴オブジェクトのプロパティ

1.length: ユーザーが現在のタブのページにアクセスするたびに、ブラウザ履歴リスト内の URL の数が 1 ずつ増加します。プライバシー上の理由から、URL の特定の内容は表示されません。
2.state: 現在の URL に関連するオブジェクト。pushState および replaceState を通じてのみ追加または変更できます。これを使用して、URL に関連する情報を保存できます。

履歴オブジェクトメソッド

1.history.back()

このメソッドにはパラメーターがありません。トリガーされた後、前に閲覧したページに戻ります。これは、ブラウザーの「戻る」ボタンをクリックするのと同じです。

2.history.forward()

このメソッドにはパラメータがありません。トリガーされると、戻る前に閲覧していたページに戻ります。これは、ブラウザの進むボタンをクリックするのと同じです。

3.history.go(番号)

このメソッドは整数変数パラメータを受け入れます。history.go(-1) は 1 ページ戻ることと同等、history.go(1) は 1 ページ進むことと同等、history.go(0) は現在のページ。

4.history.pushState(状態、タイトル、URL)

ページを更新せずに URL を変更する鍵は次のとおりです。このメソッドは、現在のページの location.href を変更し、実行後、history.length が 1 増加します。このメソッドは 3 つのパラメータ

を受け入れます。

1.state: 現在の URL に関連するオブジェクト。
2.title: ページのタイトルですが、すべてのブラウザはこれを無視します。タイトルを変更するには、引き続き document.title を使用する必要があります。
3.url: 現在のページと同じドメイン内の URL、location.href がこの値になります。

5.history.replaceState(状態, タイトル, URL)

このメソッドは上記と同じですが、history.length は変更せず、history.state と location.href のみを変更します。

pushState と replaceState の 3 番目のパラメータはドメインを越えることができず、ブラウザの Popstate イベントと onhashchange イベントをトリガーしないことに注意してください (chrome33 でテスト済み)。

位置オブジェクト

進む/戻るボタンと履歴イベントをクリックするだけでなく、場所メソッドを通じて URL を変更したり、場所のプロパティを変更したりすることもできます。

位置オブジェクトの属性 (読み取りおよび書き込み):

1.host: ドメイン名ポート番号
2.ホスト名: ドメイン名
3.port: ポート番号
4.プロトコル: プロトコル
5.href: フルパス
6.origin: プロトコル ドメイン名 ポート
7.hash: #で始まるURL(ハッシュ)
8.pathname: ドキュメントパス ドキュメント名
9.検索:(?)

以降の内容

location.href または location.hash を変更することで、更新なしの目的を達成できます。

位置オブジェクトのメソッド:

1.assign: url の値を変更し、現在の URL を履歴に追加すると、history.length が 1 増加します。 location.asig(‘#’ x) は URL を変更しますが、ページは更新しません。
2.reload: ページを更新します。
3.replace: URL の値を変更しますが、history.length は変更されません。使用方法はassignと同様です。

ポップステートイベント

URL が変更されると、たとえば、ユーザーが進む/戻るボタン、history.go(n) (n は 0 に等しくありません)、location.hash = x (x は現在の場所に等しくありません) をクリックします。ハッシュ)により、このイベントがトリガーされます。これを使用して URL を監視し、さまざまな機能を実装できます。

コードをコピー コードは次のとおりです:

window.onpopstate = function(){
// sth
を実行します }

ハッシュチェンジイベント

ハッシュ値を変更すると、popstate イベントがトリガーされますが、popstate イベントをトリガーしても、必ずしも onhashchange イベントがトリガーされるわけではありません。テスト済み:

1.hash は変更されるが location.pathname は変更されない場合、history.pushState(", ", ‘#abc’); などの onhashchange イベントがトリガーされます。
2.history.pushState(”, ”, ‘a#abc’);

のように、ハッシュと location.pathname が一緒に変更された場合はトリガーされません。

古いブラウザでの書き方

古いブラウザは、pushState と replaceState もサポートしていないため、popstate を介して URL の変更を監視することはできません (実際、このメソッドはサポートされていません)。この場合、url# の後のコンテンツを変更することによってのみ非更新を実現できますが、onhashchange はサポートされていないため、URL の変更には無関心です (ページがページの ID に対応する位置までスクロールすることを除く)。その場合は、ポーリング、setInterval を設定して URL の値を監視するという大きなトリックに頼るしかありません。このように:

コードをコピーします コードは次のとおりです:

var prevHash = window.location.hash
var callback = function(){...}
window.setInterval(function() {
If (window.location.hash != prevHash) {
prevHash = window.location.hash
コールバック(prevHash)
}
}, 100);

もちろん、この方法で記述するのは非常に面倒です。ページ上の ID を持つタグをクリックしてハッシュを変更することを考慮しない場合は、デザイン パターンを使用して監視 URL をエレガントに実装できます。たとえば、古典的なオブザーバー パターンでは、ハッシュを変更する機能を実装するためにクラスが特別に使用され、URL の変更を監視するすべてのクラス (オブザーバー) がこの (監視対象) クラスにサブスクライブします。

コードをコピーします コードは次のとおりです:

// URL のクラスを変更します
function UrlChanger() {
var _this = this;
This.observers = [];
//オブザーバーを追加
This.addObserver = function(obj) {...}
//オブザーバーを削除
This.deleteObserver = function(obj) {...}
//オブザーバーに通知
This._notifyObservers = function() {
var length = _this.observers.length;
console.log(長さ)
for(var i = 0; i _this.observers[i].update();
}
}
//URLを変更
This.changeUrl = function(hash) {
window.location.hash = ハッシュ;
_this._notifyObservers();
}
}
//リスニングクラス
function oneOfObservers() {
var _this = this;
This.update = function() {...}
}
//実装
var o1 = 新しい UrlChanger();
var o2 = 新しい oneOfObservers();
o1.addObserver(o2);
o1.changeUrl('fun/arg1/arg2/');
//o2 は sth を実行します...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Webページにローカルにインストールされている「Jingnan Mai Round Body」を正しく表示するにはどうすればよいですか? Webページにローカルにインストールされている「Jingnan Mai Round Body」を正しく表示するにはどうすればよいですか? Apr 05, 2025 pm 10:33 PM

最近、Webページにローカルにインストールされたフォントファイルを使用して、インターネットから無料のフォントをダウンロードし、システムに正常にインストールしました。今...

JavaScriptまたはCSSを介してブラウザ印刷設定でページの上部と終了を制御する方法は? JavaScriptまたはCSSを介してブラウザ印刷設定でページの上部と終了を制御する方法は? Apr 05, 2025 pm 10:39 PM

JavaScriptまたはCSSを使用して、ブラウザの印刷設定のページの上部と端を制御する方法。ブラウザの印刷設定には、ディスプレイが...

ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? ネガティブマージンが場合によっては効果がないのはなぜですか?この問題を解決する方法は? Apr 05, 2025 pm 10:18 PM

なぜマイナスマージンが場合によっては有効にならないのですか?プログラミング中、CSSの負のマージン(負...

Webページにローカルにインストールされたフォントファイルを使用する方法は? Webページにローカルにインストールされたフォントファイルを使用する方法は? Apr 05, 2025 pm 10:57 PM

Webページにローカルにインストールされたフォントファイルを使用する方法Webページ開発でこの状況に遭遇しましたか:コンピューターにフォントをインストールしました...

フレックスレイアウトの下のテキストは省略されていますが、コンテナは開かれていますか?それを解決する方法は? フレックスレイアウトの下のテキストは省略されていますが、コンテナは開かれていますか?それを解決する方法は? Apr 05, 2025 pm 11:00 PM

フレックスレイアウトとソリューションの下でのテキストの過度の省略によるコンテナの開口部の問題が使用されます...

CSSで要素を回転させることにより、水平オプションの水平スクロール効果を実現する方法は? CSSで要素を回転させることにより、水平オプションの水平スクロール効果を実現する方法は? Apr 05, 2025 pm 10:51 PM

CSSにおける水平オプションの水平スクロール効果を実現する方法は?最新のWebデザインでは、水平方向のタブのような効果を実現し、マウスをサポートする方法...

適応設計でREMユニットを調整して、高さの問題を解決する方法は? 適応設計でREMユニットを調整して、高さの問題を解決する方法は? Apr 05, 2025 pm 11:03 PM

適応設計の高さ調整の問題を解決する方法は?適応設計では、高さの調整はしばしば困難な問題です。特に同様に対処するとき...

See all articles