検索
ホームページウェブフロントエンドjsチュートリアルAjax を使用してブラウザ履歴を保持する 2 つのソリューション

私はいつも github から何かをダウンロードします。github のインターフェース全体はよくできており、ソースコードのスライドの特殊効果が最も気に入っています。最初はこれが単なる ajax リクエストの効果だと思いました。この特殊効果がブラウザのアドレスバーの変更に追従し、進むボタンと戻るボタンをクリックした後にコードを前後にスライドさせることができることがわかりました~~それでは、勉強してみましょう~

1. アンカーポイントハッシュを通じて実装:

実際、この点は中国では古くから行われており、アドレスバーの後に # アンカーポイントを追加することでブラウザがアンカーポイント単位で履歴を識別できるようになっている。ただし、ページ自体にこのアンカー ポイントがあるという意味ではありません。アンカー ポイントのハッシュは、ブラウザーがこのレコードを履歴スタックの一番上にプッシュするようガイドするだけです。

小さなデモを作ってみましょう:

    <style type="text/css">
        #tab1_header,#tab2_header{
            cursor:pointer;
            border:1px solid;
            width:50px;
        }
        #tab1,#tab2{
            width:90%;
            height:200px;
            border:1px solid;
        }
    </style>
    <p id="tab_header">
    	<span id="tab1_header">Tab1</span>
    	<span id="tab2_header">Tab2</span>
    </p>
    <p id="tab1">1</p>
    <p id="tab2">2</p>

非常に単純なタブ スイッチ (通常の状況で直接の場合):

$("#tab1_header").click(function() {
            $("#tab2").hide();
            $("#tab1").show();
});
$("#tab2_header").click(function() {
            $("#tab1").hide();
            $("#tab2").show();
});

ただし、タブ 2 をクリックしたときに戻るボタンを使用してタブ 1 に戻りたい場合は、ブラウザの動作がユーザーの考えにまったく基づいていないため、機能しません。この場合、# を追加できます。新しいページをシミュレートするアンカー。なぜシミュレーションの場合、js を介して window.location を直接変更すると、ブラウザはページを再読み込みしますが、# を追加すると再読み込みされず、履歴に保存されます。 JS は window.location.hash を使用して、URL の背後にあるアンカー ポイント # を制御します。

コードを次のように変更します:

$(function(){
			showTab();
			$(window).bind(&#39;hashchange&#39;, function(e){
				showTab();
			});
			$("#tab1_header").click(showTab1);
			$("#tab2_header").click(showTab2);
		});

        function showTab() {
            if (window.location.hash == "#tab2"){
				showTab2();
			} else {
				showTab1();
			}
        }
        function showTab1() {
            $("#tab2").hide();
            $("#tab1").show();
            window.location.hash = "#tab1";
        };
        function showTab2() {
            $("#tab1").hide();
            $("#tab2").show();
            window.location.hash = "#tab2";
        };

window.location.hash = "#tab1" を追加するだけです。タブをクリックした後、ブラウザが URL の変更を検出すると、#tab1 がアドレス バーの後に追加されます。がトリガーされると、ユーザーがクリックして戻るときに取得できるイベントは window.location.hash を通じて判断され、ajax 操作を実行できます。ただし、haschange イベントはすべてのブラウザーで使用できるわけではないため、ポーリングは最新のブラウザーでのみ使用できます。低レベルのブラウザでは URL が変更されているかどうかを検出するために必要です。これについてはここでは詳しく説明しません。

2. HTML5 の拡張された History オブジェクト (Pjax など) を通じて実装されます

window.history.pushState メソッドを使用して更新せずにブラウザのアドレス バーを更新できます。このメソッドは、アドレス バーの更新中にアドレスを履歴スタックにプッシュします。スタックのトップ ページを削除するには、popstate イベントを使用します。それは〜

github 環境をシミュレートしてみましょう。github の各 URL は完全な実際のページに対応しているため、ajax でページをリクエストするときは、ターゲット ページの指定された ID コンテナー内のコンテンツを非同期的に取得する必要があります。 たとえば、次のような 2 つのページがあります:

Index.html

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=gbk">
        <title>index</title>
    </head>
    <body>
    	<script>document.write(new Date());</script>
    	<p id="cn">
        	<a href="second.html">加载前</a>
        </p>
    </body>
</html>

Second.html

rreee

同期 http リクエストで開くと、2 ページになります。2 つのページに多くの類似点がある場合は、このメソッドを使用して DOM を変更する ajax リクエストを実装できます。<script>document.write(new) Date());</script> ステートメントは、その変更を通じて 2 つの http リクエストから取得されたかどうかを知ることができます

外部 Ajax リクエストでは時間表示は変更されません。

りー

上記のステートメントでは、#cn 要素がクリックされると、pushState メソッドを通じて状態が履歴スタックにプッシュされ、3 番目のパラメーターでブラウザーの URL ボックスが 2 番目のページを指し、2 番目のページが非同期で読み込まれます。 ajax に対応する部分をコンテナに追加して、非同期読み込みを実現し、同様にユーザーがクリックして戻ると、popstate がトリガーされます。先ほどの PushState メソッドの最初のパラメーターの状態です。ここで渡される仮パラメータ e の属性は、開発用に var st = e.state を通じて取得されます。同時に、インデックス ページ内の対応するコンテンツがロードされます。時間の関係上、この js は再構築されていないため、$.ajax を直接記述しました。実際、特別な効果が必要なく、単に jQ で非同期にロードする場合は、$("#cn") を直接使用できます。 load(st.url + " #cn ");要求された HTML に対応する #cn をこのページの #cn コンテナに入れます。ただし、さらに素晴らしい特殊効果を追加したい場合は、によって返されたデータを直接操作する必要があります。アヤックス。

りー

まず p コンテナを作成し、スクリプトでフィルタリングされたコードをこのコンテナにロードし、find メソッドを使用して対応するセレクタ コンテナを見つけ、それを独自のページに挿入します。ここでは、slideUp を使用できます。独自のプロジェクトのニーズに応じて、コンテンツを表示する特殊効果を表示します~~

さらに、pjax (https://github.com/defunkt/jquery-pjax) という jQuery コンポーネントをお勧めします。これは、コンテナ内のコンテンツに対応する別のページに非同期部分が読み込まれます。実装メカニズムは上記の 2 番目のオプションと同じです。 PushState + ajax = pjax このアプリは人気が出そうな予感がします。

要約すると、2 つのソリューションは実際には、IE6 や FF3.6 などの下位レベルのブラウザのサポートにはあまり適していません。前者は、ローエンド ブラウザと互換性を持たせるためにポーリングを使用してブラウザのアドレス バーの動作を監視する必要があります。 、後者は、完全な HTML5 アプリケーションは、非 HTML5 ブラウザーに対してのみ判断ジャンプを行うことができます。

  如pjax最后的一段无奈的兼容处理:  

$.support.pjax = window.history && window.history.pushState


// Fall back to normalcy for older browsers.
if ( !$.support.pjax ) {
  $.pjax = function( options ) {
    window.location = $.isFunction(options.url) ? options.url() : options.url
  }
  $.fn.pjax = function() { return this }
}

               

以上がAjax を使用してブラウザ履歴を保持する 2 つのソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

See all articles

ホット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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

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

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境