ホームページ ウェブフロントエンド jsチュートリアル js return をクリックして指定したページにジャンプする実装 process_javascript スキル

js return をクリックして指定したページにジャンプする実装 process_javascript スキル

May 16, 2016 pm 03:04 PM

この機能については以前にも簡単に紹介しましたが、今回はその原理と問題点について詳しく説明します(html5の新しいAPIを使用しているため、互換性の問題があります。モバイル端末での使用を推奨します)。

機能の説明:

ブラウザで新しいタブを作成し、URL を指定します。Web ページが読み込まれた後は、通常の手順ではクリックして戻ることはできません。現在のタブ ページには関連する履歴レコードがないため、返されるレコードはありません。

顧客のリクエストに応じて、この場合、リンク (ホームページなど) を履歴レコードに追加する必要があります。これにより、新しく開いたページで「戻る」をクリックするとホームページにジャンプできるようになります。ユーザーは、システムのさまざまな機能、プロモーション プラットフォームを確認できます。

1. 重要な知識

HTML5 では、history.pushState() メソッドとhistory.replaceState() メソッドが導入されており、これにより履歴エントリを 1 つずつ追加および変更できるようになります。これらのメソッドは、window.onpopstate イベントと連携して動作します。

ケース:
http://mozilla.org/foo.html が次の JavaScript コードを実行すると仮定します:

コードをコピーします コードは次のとおりです。
var stateObj = { foo: "bar" }; .pushState(stateObj, "ページ 2", "bar.html");

これにより、ブラウザのアドレス バーに http://mozilla.org/bar.html が表示されますが、bar.html ページは読み込まれず、HTML もチェックされません。存在します。

ユーザーが http://google.com に移動し、戻るボタンをクリックすると、この時点でアドレス バーに http://mozilla.org/bar.html とすると、このページは、popstate イベントをトリガーします。このイベントの状態オブジェクトには、stateObj のコピーが含まれます。このページは foo.html のように見えますが、ページのコンテンツは Popstate イベントで変更されている可能性があります。

もう一度戻るボタンをクリックすると、URL は

http://mozilla.org/foo.html に戻ります。今度はドキュメントが別の Popstate イベントをトリガーします。状態オブジェクトは null です。ロールバックしてもドキュメントの内容は変更されません。

pushState() メソッド PushState() は、状態オブジェクト、タイトル (現在は無視されています)、およびオプションの URL の 3 つのパラメータを取ります。これら 3 つのパラメータの詳細を個別に調べてみましょう:

state オブジェクト — PushState() メソッドで作成された新しい履歴エントリに関連付けられた JavaScript オブジェクト。ユーザーが新しく作成された状態に移動するたびに、popstate イベントが発生し、イベント オブジェクトの state プロパティには履歴エントリの state オブジェクトのコピーが含まれます。

任意のシリアル化可能なオブジェクトを状態オブジェクトとして使用できます。 FireFox ブラウザは状態オブジェクトをユーザーのハード ドライブに保存し、ユーザーがブラウザを再起動した後に復元できるようにするため、状態オブジェクトのサイズに 640k までの制限を設けています。この制限を超える状態オブジェクトを PushState() メソッドに渡すと、メソッドは例外をスローします。大量のデータを保存する必要がある場合は、sessionStorage または localStorage を使用することをお勧めします。

title — FireFox は現在このパラメータを無視しますが、将来的には使用される可能性があります。このメソッドは将来変更される可能性があることを考慮して、空の文字列を渡す方が安全です。あるいは、これから入力しようとしている状態を示す短いタイトルを渡すこともできます。

アドレス (URL) — 新しい履歴エントリのアドレス。ブラウザは、pushState() メソッドを呼び出した後はアドレスをロードしませんが、ユーザーがブラウザを再起動するときなど、後でアドレスをロードしようとする場合があります。新しい URL は絶対パスである必要はありません。相対パスの場合は、受信 URL と現在の URL が同じオリジンを持つ必要があります。そうでない場合は、pushState() が例外をスローします。 。このパラメータはオプションです。指定しない場合は、ドキュメントの現在の URL になります。

注: Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) から Gecko 5.0 (Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2) では、受信オブジェクトは JSON を使用してシリアル化されます。 Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3) 以降、オブジェクトは構造化コピー アルゴリズムを使用してシリアル化されます。これにより、より多くの種類のオブジェクトを安全に渡すことができるようになります。

ある意味では、pushState() の呼び出しは、現在のドキュメント内に新しい履歴エントリを作成してアクティブにするという点で、window.location='#foo' を設定するのと似ています。しかし、pushState() には独自の利点があります:

1. 新しい URL は同じオリジンの URL にすることができます。逆に、window.location メソッドを使用する場合は、ハッシュを変更するだけで同じドキュメント内に留まります。

2. 個人のニーズに応じて URL を変更するかどうかを決定します。代わりに、window.location='#foo' を設定すると、現在のハッシュ値が foo でない場合にのみ新しい履歴レコードが作成されます。

3. 新しい履歴エントリに要約データを追加できます。ハッシュベースの方法を使用する場合、関連するデータを非常に短い文字列にのみトランスコードできます。

新しいアドレスがハッシュを変更するだけであっても、pushState() メソッドは hashchange イベントをトリガーしないことに注意してください。

ポップステートイベント アクティブ化された履歴が変更されるたびに、popstate イベントが発生します。アクティブ化された履歴エントリが PushState によって作成された場合、または replaceState メソッドの影響を受けた場合、popstate イベントの state プロパティには履歴の state オブジェクトのコピーが含まれます。

replaceState() メソッド History.replaceState() オペレーションは、replaceState() メソッドが新しいエントリを作成するのではなく、現在の履歴エントリを変更することを除いて、history.pushState() に似ています。

replaceState() メソッドの使用は、ユーザー操作に応じて現在の履歴エントリの状態オブジェクトまたは URL を更新する場合に特に適しています。

2. 実装アイデア 1. Popstate イベントを使用して、クリック リターン イベントを監視します。

2. イベントがトリガーされると、現在のページの履歴に返せるページがあるかどうかを判断します。

3. 戻るページがない場合は、2 つのレコードを挿入します。

1)、指定されたジャンプページ。

2)、空のレコード。 (現在のページは変更しないでください)

3. 実装方法

 //返回之前没页面则返回首页
    function pushHistory() {
      if (history.length < 2) {
        var state = {
          title: "index",
          url: getHttpPrefix + "index.html"
        };
        window.history.pushState(state, "index", location.href);
        state = {
          title: "index",
          url: ""
        };
        window.history.pushState(state, "index", "");
      }
      //lll("history.state" + history.state)
      //console.log(history.state) 
}
ログイン後にコピー

現在の履歴のレコード数を確認します。ページが読み込まれると、ブラウザーが自動的にレコードをプッシュします。したがって、長さが 2 未満かどうかを判断する必要があります。

挿入された状態オブジェクトは、対応する URL リンクを取得するために使用されます。
注:
最初の PushState では、ジャンプ操作を容易にするためにジャンプ URL を状態オブジェクトに入れました。現在のブラウザは基本的にこのパラメータをサポートしていないため、2 番目のパラメータには実際的な意味はありません。
3 番目のパラメータは現在のアドレス バーのリンクを置き換えますが、ページはジャンプしません。 (以前、3 番目のパラメータをホームページのリンクに設定するという間違いを犯しました。そのため、アドレス バーがホームページのリンクに変更され、現在のページのリンクがホームページに基づいてジャンプし、ページ上のすべてのリンクが間違った転送)

  setTimeout(function () {
      pushHistory()
      window.addEventListener("popstate", function (e) {
        lll("popstate"+window.history.state)
        if (window.history.state != null && window.history.state.url != "") {
          location.href = window.history.state.url
        }
      });
    }, 300);
ログイン後にコピー

このコードは、ページのreadyイベントに配置され、実行されます。300ミリ秒の遅延は、操作を遅らせ、システムのpopイベントとの競合を防ぐためです。
if ステートメントは、履歴に状態オブジェクトがあるかどうかを判断するものです。要件を満たすレコードのみが追加した状態オブジェクトを持つため、この点に基づいてページ ジャンプ操作を実行できます。
これにより、希望する効果が得られます。
4. 最後に書きます
欠点:
1. 明らかに、冒頭で述べたとおりです。 HTML5 をサポートするブラウザにのみ適しています。
2. WeChat などのモバイル端末でのリターンと同様に、2 つのレコードが挿入されるため、ページを起動して WeChat チャット ウィンドウに戻るには、リターンをさらに 2 回クリックする必要があり、ユーザー エクスペリエンスが悪くなります。

概要:
この方法は間違いなく最適化して完成させることができますが、現在の私の力ではそれを完成させるには不十分です。

この記事を読んだ友人がインスピレーションを得たり、それを達成するためのより良い方法を見つけたりできることを願っています。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

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

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

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

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

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

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

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

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

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により優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Python vs. JavaScript:ユースケースとアプリケーションと比較されます Python vs. JavaScript:ユースケースとアプリケーションと比較されます Apr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

See all articles