jQuery プロジェクトで重複送信を防ぐ方法

jQuery プロジェクトで重複送信を防ぐ方法

新しいプロジェクトでは、axios によって重複した送信を防ぐことができますが、古いプロジェクト (jQuery など) には axios がありません。しかし、Ajaxフックをインポートすると
それは達成できる

Ajax フックのソースコード アドレス: https://github.com/wendux/Ajax-hook

輸入

<script src="https://unpkg.com/[email protected]/dist/ajaxhook.min.js"></script>

ah オブジェクトは ajaxhook.min.js をインポートした後に表示されます。以下を使用します。

ah.proxy({
    //リクエストが開始される前にonRequestを入力します: (config, handler) => {
        コンソールログ(config.url)
        ハンドラの next(config);
    },
    //タイムアウトなどのリクエストエラーが発生したときに入力します。404 などの http ステータスコードエラーは含まれません。これらのエラーはリクエストが成功したとみなされます。onError: (err, handler) => {
        コンソールログ(エラータイプ)
        ハンドラ.next(エラー)
    },
    //リクエストが成功したら、onResponse: (response, handler) => {を入力します。
        コンソール.log(レスポンス.レスポンス)
        ハンドラ.next(レスポンス)
    }
})

このうち、config.method は ajax リクエストメソッド (GET/POST) であり、config.url はリクエストされたパスです。 onError の err オブジェクトと onResponse の応答は、err.config.method/response.config.method を通じて ajax リクエスト メソッドを取得できます。

重複送信を防ぐため、少しカプセル化して js ファイルを実装しました。テスト済みで効果的です。後で友人がテストできます。専門家の皆さんは、議論したり、欠陥を指摘したりすることを歓迎します。

```javascript
関数 loadJS(url, コールバック) {
  var スクリプト = document.createElement('script');
  fn = コールバック || 関数() {};
  スクリプトタイプ = 'text/javascript';
  スクリプトを遅延させる
  //IE
  スクリプトの準備が完了している場合
    script.onreadystatechange = 関数() {
      script.readyState == 'loaded' || script.readyState == 'complete' の場合 {
        スクリプトのonreadystatechange = null;
        関数fn();
      }
    }
  } それ以外 {
    // その他のブラウザ script.onload = function() {
      関数fn();
    }
  }
  スクリプトのURLをコピーします。
  document.getElementsByTagName('body')[0].appendChild(スクリプト);
}
laodJS('https://unpkg.com/[email protected]/dist/ajaxhook.min.js', 関数() {
  ajaxArr = [] とします
  ah.proxy({
    //リクエストが開始される前にonRequestを入力します: (config, handler) => {
      var id = config.method + config.url
      (ajaxArr.indexOf(id) === -1)の場合{
        // 各リクエストに一意の ID を設定し、ajaxArr にプッシュします。リクエストが完了したら、アイテム ajaxArr.push(id) を削除します。
        ハンドラの next(config);
      } それ以外 {
        ハンドラ.reject() を返す
      }
    },
    //タイムアウトなどのリクエストエラーが発生したときに入力します。404 などの http ステータスコードエラーは含まれません。これらのエラーはリクエストが成功したとみなされます。onError: (err, handler) => {
      var id = err.config.method + err.config.url
      (ajaxArr.indexOf(id) !== -1) の場合 {
        ajaxArr.splice(ajaxArr.indexOf(id), 1)
      }
      ハンドラ.next(エラー)
    },
    //リクエストが成功したら、onResponse: (response, handler) => {を入力します。
      var id = response.config.method + response.config.url
      (ajaxArr.indexOf(id) !== -1) の場合 {
        ajaxArr.splice(ajaxArr.indexOf(id), 1)
      }
      ハンドラ.next(レスポンス)
    }
  })
})

このファイルをグローバルにインポートするだけです。このファイルに preventRepeatSubmission.js という名前を付けました。

私の HTML コード:

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
  <メタ文字セット="UTF-8">
  <title>ドキュメント</title>
</head>
<本文>
  <h1>これはインデックスページです</h1>
  <ul>
    <li><a href="/">/</a></li>
    <li><a href="/index">インデックスページ</a></li>
    <li><a href="/404">404 ページ</a></li>
    <li><a href="/info">情報ページ</a></li>
    <li><a href="/nofound">​​見つかりません</a></li>
  </ul>
  <button id="sendMsg">リクエストインターセプター</button>
  <script src="./jquery.min.js"></script>
  <!-- <script src="https://unpkg.com/[email protected]/dist/ajaxhook.min.js"></script> -->
  <script src="./preventRepeatSubmission.js"></script>
  <スクリプト>
    document.getElementById("sendMsg").addEventListener("クリック", function() {
      $.ajax({
        URL: 'http://localhost:3000/home',
        タイプ: 'GET'、
        成功: 関数(データ) {
          console.log('成功', データ)
        }
      })
    })
  </スクリプト>
</本文>
</html>

私のサーバーは koa2 を使用して構築されており、コードは次のとおりです。

const Koa = require('koa');
const Router = require('koa-router');

const app = new Koa();
定数ルーター = 新しいルーター();

ルーター
  .get('/', (ctx, next) => {
    ctx.body = '<h1>こんにちは jspang</h1>';
  })
  .get('/home', async (ctx, next) => {
    // ctx.body = '<h1>これはホームページです</h1>'
    非同期関数delay(time) {
      新しいPromise(function(resolve,reject)を返す{
        setTimeout(関数(){
          解決する();
        }、 時間);
      });
    };
    遅延を待機します(5000);
    定数 url = ctx.url;
  
    // リクエスト内のリクエストパラメータを取得します。const request = ctx.request;
    リクエストクエリを定数で指定します。
    リクエストクエリ文字列を定数で指定します。

    // ctx 内の get リクエストのパラメータを取得します。const ctx_query = ctx.query;
    定数 ctx_querystring = ctx.querystring;
    ctx.body = {url、リクエストクエリ、リクエストクエリ文字列、ctx_query、ctx_query文字列};
    ctx.response.body = {status:200, msg:'パラメータが正常に取得されました'};
  })

アプリ
  .use(router.routes()) // ルートを app.use(router.allowedMethods()) に読み込みます // ミドルウェアを読み込みますapp.listen(3000, () => {
  console.log('[デモ]はポート3000で実行されています');
});

ブラウザテスト結果:

画像のボタンを押すと、Ajax リクエストが開始されます。私のサーバーは応答を 5 秒遅延しました。5 秒の遅延中にボタンを 20 回クリックしましたが、同じ 20 回の Ajax リクエストが正常にインターセプトされ、うまく機能しました。

要約する

jQuery プロジェクトで重複送信を防ぐ方法についての記事はこれで終わりです。jQuery の重複送信防止に関する関連コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • jQuery の $.ajax を使用して重複送信を防ぐ 2 つの方法 (推奨)
  • jQueryはフォームが繰り返し送信されるのを防ぎます
  • jQuery でフォームを送信するときに繰り返し送信を防ぐ方法
  • JQuery Validation プラグインは重複したフォーム送信を防止します
  • jQueryがリクエストを繰り返し送信する理由の簡単な分析
  • jQuery を使用して Ajax が繰り返し送信されるのを防ぐ方法

<<:  CSS マージンの重複とその防止方法

>>:  MySQL の遅いクエリの落とし穴

推薦する

Centos7でmysql6の初期化インストールパスワードをインストールする方法

1. まずデータベースサーバーを停止しますサービスmysqld停止2.vim /etc/my.cnf...

Docker x509 の安全でないレジストリ問題を解決する

Docker をインストールした後、会社が構築したプライベート サーバー Harbor からプルしよ...

Centos7 に MySQL 8.0.23 をインストールする手順 (初心者レベル)

まず、MySQL とは何かを簡単に紹介します。簡単に言えば、データベースはデータを格納するための倉庫...

デザイン協会: なぜ間違った場所を探したのですか?

数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...

VMware vSphere 6.5 インストール チュートリアル (画像とテキスト)

vmware vSphere 6.5 は vSphere ソフトウェアのクラシック バージョンであ...

MySQL で戻り値ありと戻り値なしのストアド プロシージャを書く 2 つの方法

プロセス1: 戻り値あり: proc_addNum が存在する場合はプロシージャを削除します。 プロ...

HTML 5 スタイルシートのリセット

この CSS リセットは、Eric Meyers の CSS リセットに基づいて変更されており、特に...

Linux には make コマンドがありません (make: *** ターゲットが指定されておらず、makefile または make コマンドのインストール方法が見つかりません)

知らせ! ! !この状況は、実際には仮想マシンのインストール中に回避できます。次回仮想マシンをテスト...

JavaScript 配列の重複排除とフラット化関数の紹介

目次1. 配列の平坦化(配列の次元削減とも呼ばれる)方法1: 削減メソッドを使用する方法2: スタッ...

TypeScript でオブジェクト キーの値の範囲を制限する方法

TypeScript を使用する場合、TypeScript が提供する型システムを使用してコードのあ...

SQL ROW_NUMBER() および OVER() メソッドのケーススタディ

構文フォーマット: row_number() over(partition by grouping ...

HTML テキストフォーマットの簡単な例 (詳細な説明)

1. テキストの書式設定: この例では、HTML ファイル内のテキストを書式設定する方法を示します...

Tomcat および Web アプリケーションの Docker デプロイメントの実装

1.dockerをオンラインでダウンロードする yum インストール -y epel-release...

DockerコンテナがSongtiなどのフォントを認識しない場合の解決策

問題の背景: docker を使用してプロジェクトをデプロイする場合、プロジェクト内で印刷コントロー...