jQueryのajax()を中断する方法
jQueryのajax()を中断する方法を紹介します。
1.問題点
次のように、ajax()メソッドでHTMLを取得するコードがあります。
<script src="http://code.jquery.com/jquery-latest.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()の返却値であるjqxhrオブジェクトを変数に保持し、この変数に対してabort()メソッドを実行します。
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(function(){
    var jqxhr;
    $('#execute').click(function(){
        jqxhr = $.ajax({
            url: "http://user-domain/foo.cgi",
            type: "GET",
            dataType: 'html',
        })
        .done(function( data ) {
            $('#foo').html(data);
	    })
        .fail(function( data ) {
            // ...
        });
    });
    $('#stop').click(function(){
        jqxhr.abort();
    });
});
</script>
<input type="button" id="execute" value="検索" />
<input type="button" id="stop" value="停止" />
<div id="foo"></div>3.直前に実行したajax()を中断する
2項は現在実行中のajax()を中断する方法ですが、ajax()を連続して実行する際、直前に実行したajax()を中断するケースの方が実用的かと思います。
たとえば検索キーワードを変更してフォームボタンを連続でクリックした場合などです。
直前に実行したajax()を中断するには、ajax()実行前にjqxhrオブジェクトを判定し、オブジェクトが存在すればabort()を実行するようにします。
<meta charset="UTF-8" />
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(function(){
    var jqxhr;
    $('#execute').click(function(){
        if (jqxhr) {
            jqxhr.abort();
        }
        var text = $('#text').val();
	    jqxhr = $.ajax({
	        url: "http://user-domain/foo.cgi",
            data: {
                text: text
            },
            type: "POST",
            dataType: 'html',
        })
        .done(function( data ) {
            $('#foo').html(data);
	    })
        .fail(function( data ) {
            // ...
        });
    });
});
</script>
<input type="text" id="text" />
<input type="button" id="execute" value="検索" />
<div id="foo"></div>中断しない場合、実行した回数分、「id="foo"」のエリアに検索結果が表示されますが、中断すれば最後の1回分しか表示されません。
4.CGIのサンプル
参考までに、2項および3項のCGIサンプル(Perl)を示します。sleepの部分で待ち合わせするようにしています。
#!/usr/bin/perl
use strict;
use CGI;
 
sleep 5;
my $q = new CGI();
print $q->header(-charset=>"utf-8");
print $q->param('text');
print $q->end_html;abort()で中断しないと前回の検索結果を表示してしまいますが、中断することで最新の実行結果のみを表示させることができます。
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
 



