ホームページ ウェブフロントエンド 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衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? 独自のJavaScriptライブラリを作成および公開するにはどうすればよいですか? Mar 18, 2025 pm 03:12 PM

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? ブラウザでのパフォーマンスのためにJavaScriptコードを最適化するにはどうすればよいですか? Mar 18, 2025 pm 03:14 PM

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? ブラウザ開発者ツールを使用してJavaScriptコードを効果的にデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:16 PM

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? ソースマップを使用して、マイナイドJavaScriptコードをデバッグするにはどうすればよいですか? Mar 18, 2025 pm 03:17 PM

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

初心者向けのタイプスクリプト、パート2:基本データ型 初心者向けのタイプスクリプト、パート2:基本データ型 Mar 19, 2025 am 09:10 AM

エントリーレベルのタイプスクリプトチュートリアルをマスターしたら、TypeScriptをサポートするIDEで独自のコードを作成し、JavaScriptにコンパイルできるはずです。このチュートリアルは、TypeScriptのさまざまなデータ型に飛び込みます。 JavaScriptには、NULL、未定義、ブール値、数字、文字列、シンボル(ES6によって導入)とオブジェクトの7つのデータ型があります。 TypeScriptはこれに基づいてより多くのタイプを定義し、このチュートリアルではすべてを詳細に説明します。 ヌルデータ型 JavaScriptのように、Typescriptのnull

See all articles