-1

私は次のjQueryを持っています:

$("#delete_products").click(function() {
    $(":checkbox:checked").each(function() {
        var pid = $(this).val();
        $.get('delete_product.php',{pid: pid});
    });
    location.reload();
});

ページは AJAX リクエストが完了するのを待たず ( MULTIPLE AJAX REQUESTS )、すぐにページを更新し、AJAX リクエストが実行されずに失敗するため、これには問題があります。

読み込みが完了したときにのみページが更新されるようにするにはどうすればよいですか?

私はこのコードを与えられました:

$("#delete_products").click(function () {
    var promises = [];
    $(":checkbox:checked").each(function () {
        var pid = $(this).val();
        promises.push($.get('delete_product.php', {
            pid: pid
        }));
    });
    $.when.apply($, promises).done(function () {
        location.reload();
    });
    return false;
});

しかし、この解決策はうまくいきません。

助言がありますか?

4

4 に答える 4

1

あなたのコードは動作するはずですが、ID の配列を渡して 1 回の呼び出しですべての製品を削除することをお勧めします。

ブラウザの作業が減り、サーバーの作業が減り、結果が速くなります。


更新された回答

$("#delete_products").click(function () {
    var ids = [];

    $(":checkbox:checked").each(function () {
        ids.push($(this).val());
    });

    $.post('delete.php', { 'ids': ids } }).done(function() {
        alert('hells yeah!');
    });

    return false;
});

サーバー側に関しては:

$commaSeperatedIds = explode(',', $_POST['ids']);

mysql_query('DELETE FROM products WHERE id IN('.mysql_real_escape_string($commaSeperatedIds).')');
于 2013-08-10T20:53:38.503 に答える
0

考えられる解決策 #1:

asyncパラメータが役立ちます。false に設定します。

$.get() 関数を使用しているため、これは次のように行います。

$.ajaxSetup({
    async: false
});

 
$.ajax() 関数を使用すると、次のように設定できます。

$.ajax({
    url: ...,
    async: false,
    success: function(data) {}
});

詳細については、こちらを参照してください

 

考えられる解決策 #2:

リクエストが失敗したかどうかに関係なくページを更新する場合は、.success()コールバック フックOR を使用します。.complete()

$.get('delete_product.php',{pid: pid}).success(function(response)
{
    location.reload();
});

 
ハッピーコーディング!

 

編集:

質問者は sUP の回答を優先しているようです。jQueryで目的の機能を実現する方法の例を提供したいと思います:

$("#delete_products").click(function()
{
    var products = [];

    $(":checkbox:checked").each(function()
    {
        var pid = $(this).val();
        products.push(pid);
    });

    $.post('delete_products.php', {'products': products}).done(function()
    {
        location.reload();
    });
});

 
投稿データに JSON を使用する場合は、次を試してください。

$('#delete_products').click(function()
{
    var products = [];
    
    $(':checkbox:checked').each(function()
    {
        products.push($(this).val());
    });

    // Convert the products array into JSON
    products = JSON.stringify(products);

    $.post('delete_products.php', {'products': products}).done(function()
    {
        location.reload();
    });
});

PHP では、次のように json 文字列を解析する必要があります。

<?php
// This creates an associative array from the JSON string
$delete_products = json_decode($_POST['products'], true);

// Use explode to make a comma separated string from the array
// for use in a SQL SELECT query:
$delete_products = explode(',', $delete_products);

についての情報json_decodePHP Manualにあります。

JSON.stringify は、古いブラウザーではサポートされていません。クロス ブラウザーのサポートが必要な場合は、JSON-jsを含めます。

于 2013-08-10T20:40:24.690 に答える
0

「get」の「success」パラメータを使用

編集: リクエストのカウンターを追加します。

total_requests = $(":checkbox:checked").length;
total_success = 0;

...
$.get('delete_product.php',{pid: pid}, function (data, status, xx) {
    ...
    total_success++;
    if (total_success >= total_requests) {
        location.reload();
    }
});
...
于 2013-08-10T20:51:24.230 に答える
-1

私も、製品 ID を収集し、1 つの Ajax 呼び出しを送信してそれらすべてを処理することによって、おそらく最適な結果が得られると考えています。

しかし、OPが複数のAjaxリクエストを処理し、それらすべてが完了するのを待つ方法について興味深い質問を提示したので、when()メソッドをもう一度調べましたが、元の構文にはまだ欠陥があるようです.

jQuery マニュアルによると、when()はメソッドであるため、1 つ以上の引数を括弧で囲んで呼び出す必要があります。私はまだ約束を扱っておらず、何もテストしていませんが、次のようなものが少なくとも異なる結果をもたらす可能性があると思います:

$("#delete_products").click(function () {
    var promises = [];
    $(":checkbox:checked").each(function () {
        var pid = $(this).val();
        promises.push($.get('delete_product.php', {
            pid: pid
        }));
    });
    $.when(promises).done(function () {
        location.reload();
    });
    return false;
});

前に言ったように、私はまだpromisesメカニズム/構文を完全に把握していません...

元のバージョン$.whenでは、作業する意味のあるコンテキストがありません。メソッドはコンテキストを提供しますが、(失敗した) 作業が既に完了したapply()でのみです。

于 2013-08-11T08:07:40.630 に答える