0

問題があり、それは次のとおりです。キーアップイベントの実行後に連絡先を検索するテキストボックスがあります。スクロールでページネーションも使用するため、連絡先がdivに追加されます。キーアップイベントの後、そのdivのコンテンツが消去されて置き換えられます新しいコンテンツを使用しますが、これはゆっくり書くと発生します。非常に速く書くと、コンテンツは置き換えられず、既存のコンテンツに追加され、同じレジスタが繰り返されるためです。おそらく ajax が非同期であり、その後キーアップするたびに、リクエストを実行したままになります。

コード

    var paginam = 1;
    $('div.dvusuarios').scroll(function() {
        if ($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) {
            paginam++;
            listcontactosmsj($('#txtbuscaamgcon').val(), paginam);
        }
    });

      function listcontactosmsj(contacto, paginam) {
        $.ajax({
            type: 'GET',
            url: "<? echo PUBLIC_PATH . 'message/selcontacts' ?>",
            data: 'contacto=' + contacto
                    + '&pagina=' + paginam
        }).done(function(data) {
            $('div.dvusuarios').append(data);
        });
    }

    listcontactosmsj('', 1);

    $('#txtbuscaamgcon').keyup(function() {
        paginam = 1;
        $('div.dvusuarios').html('');
        listcontactosmsj($(this).val(),paginam );
    });

私はこのようにそれを解決しようとしましたが、これはうまくいきません

 $('#txtbuscaamgcon').keyup(function() {
            paginam = 1;
            $('div.dvusuarios').html('');
            var refrescar = setInterval(listcontactosmsj($(this).val(),paginam), 5000);
             $.ajaxSetup({cache: false});
        });

ソース コードの何が問題なのかわかりませんが、mysql および php スクリプトのクエリは問題ありません。

4

2 に答える 2

0

paginam最初に、次のようにの下に新しいグローバル変数を作成する必要があります。

var paginam = 1,
    contactRequest = false;

次に、listcontactosmsj()関数を次のように変更します。

function listcontactosmsj(contacto, paginam) {
    if (contactRequest) {
        contactRequest.abort();
    }
    contactRequest = $.ajax({
        type: 'GET',
        url: "<? echo PUBLIC_PATH . 'message/selcontacts' ?>",
        data: 'contacto=' + contacto
                + '&pagina=' + paginam
    }).done(function(data) {
        $('div.dvusuarios').append(data);
        contactRequest = false;
    });
}

あなたは何が起こっているかについて正しいです。すばやく入力すると、keyupイベントがすばやく発生し、複数の AJAX 要求がすばやく送信されます。この変更により、listcontactosmsj()関数は現在リクエストが行われているかどうかを確認します。ある場合は、リクエストをキャンセルし、新しいリクエストを開始します。

于 2013-11-05T16:25:13.787 に答える