jQueryでajax()の重複実行を回避する方法
jQueryでajax()の重複実行を回避する方法を紹介します。
1.問題点
次のような、ajax()メソッドを使って「http://user-domain/foo.cgi」にアクセスし、実行結果を取得するコードがあります。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$(function(){
$('#execute').click(function(){
$.ajax({
url: "http://user-domain/foo.cgi",
type: "GET",
dataType: 'html',
})
.done(function( data ) {
$('#foo').html(data);
})
.fail(function( data ) {
// ...
});
});
});
</script>
<input type="button" id="execute" value="実行" />
<div id="foo"></div>
が、フォームの「実行」ボタンを連続クリックしたときにajax()が重複して実行されてしまい、これを回避する方法が分かりません。
2.ajax()の重複を回避する
ajax()の重複を回避するためには、ajax()実行時に返却されるjqxhrオブジェクトを利用します。
ajax()実行前にjqxhrオブジェクトを判定し、オブジェクトが存在する場合はajax()を実行しないようにします(赤色部分を追加)。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$(function(){
var jqxhr;
$('#execute').click(function(){
if (jqxhr) {
return;
}
jqxhr = $.ajax({
url: "http://user-domain/foo.cgi",
type: "GET",
dataType: 'html',
})
.done(function( data ) {
$('#foo').html(data);
})
.fail(function( data ) {
// ...
});
});
});
</script>
<input type="button" id="execute" value="実行" />
<div id="foo"></div>
これで初回にクリックしたリクエストだけが処理されます。
ついでにfoo.cgiのサンプルも掲載しておきます。時間がないので重複実行が分かるようなレスポンスを返却するところまで実装できていません、すいません。
#!/usr/bin/perl
use strict;
use CGI;
my $q = new CGI();
print $q->header(-charset=>"utf-8");
print $q->param('text');
print $q->end_html;
Posted by yujiro このページの先頭に戻る
- jQuery+ajaxでモーダルのコンテンツを取得する方法
- jQueryでパスワードの表示・非表示を切り替えるサンプル
- jQueryでファイル選択時にプレビュー表示する方法
- ラジオボタンをjQueryで解除する方法
- テーブルのセルをポイントすると行と列を反転表示するjQueryプラグイン「Table Hover」
- jQueryで親ページからiframeのスクロールバーを非表示にする方法
- jQueryのカスタムビルドが簡単にできるサービス「jQuery Builder」
- jQueryでCSSをまとめて書き換える方法のまとめ
- 親ページからiframe内の要素にCSSを適用させる方法
- jQueryで要素を削除する方法のまとめ
- jQueryでテキストを追加するたびにスクロールさせる方法
- jQuery.ajax()でファイルをアップロードする方法
- preventDefault()で無効にしたイベントを有効にする方法
- jQueryで要素数を取得する方法のまとめ
- jQueryやJavaScriptでパスワードフィールドの文字を表示する方法
トラックバックURL
コメントする
greeting