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 の遅いクエリの落とし穴

推薦する

mysql-8.0.16 winx64 最新インストール チュートリアル (画像とテキスト付き)

最近、データベースについて学び始めました。最初にやったことは、データベースとは何か、データベースとデ...

未来志向の総合的なウェブデザイン:プログレッシブエンハンスメント

<br />原文: プログレッシブエンハンスメントを理解するアーロン・ガスタフソン翻訳:...

Nginx が Apache より優れている理由

Nginx は、わずか数年で Web サーバー市場の大部分を占めるようになりました。周知のとおり、N...

SQLクエリの実行順序をゼロから学ぶ

SQL クエリ ステートメントの実行順序は次のとおりです。 (7)選択 (8) DISTINCT &...

フローティングメニューを実装するjQueryプラグイン

毎日jQueryプラグインを学ぶ - フローティングメニュー、参考までに、具体的な内容は次のとおりで...

Element UI で自動サイズ調整テキストエリアの高さを設定する方法

Element UIのtextarea input自動サイズに設定すると、テキストボックスのデフォル...

CSS3のtransform属性で実装される4つの機能

CSS3 では、transform 関数を使用して、テキストや画像の回転、拡大縮小、傾斜、移動という...

Linux での MySQL 5.6.27 インストール チュートリアル

この記事では、LinuxでのMySQL 5.6.27のインストールチュートリアルを参考までに紹介しま...

IDEA は MySQL への接続時にエラーを報告します。サーバーが無効なタイムゾーンを返します。タブに移動して serverTimezone プロパティを設定してください。

これからの道は常に困難で、棘だらけです。歯を食いしばって、乗り越えられると信じてください。さあ、さあ...

17 個の JavaScript ワンライナー

目次1. DOMとBOM関連1. 要素にフォーカスがあるかどうかを確認する2. 要素の兄弟ノードをす...

Vue2.0/3.0 での provide と inject の使用例

目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...

CSSはコンテンツの高さが足りない場合にフッターを自動的に下部に固定します

UI カットのプロセスでは、ページはヘッダー、コンテンツ、フッターの 3 つの部分で構成されることが...

Ubuntu環境でのPHP関連のパスと変更方法

Ubuntu環境におけるPHP関連パスPHP パス /usr/bin/php phpize5 /us...

純粋なCSSで立体的な画像配置効果を実現するサンプルコード

1. 要素の幅/高さ/パディング/マージンのパーセンテージ基準要素の幅/高さ/パディング/マージンの...

クラスタrpmを使用してMySQLをインストールするための詳細な手順

MySQLデータベースをインストールするa) MySQL ソースインストールパッケージをダウンロード...