1

AJAX 呼び出しをトリガーする onblur の終了に時間がかかる理由を突き止めるのに苦労しています。場合によっては数十秒かかります。「説明」フィールドが多いほど、時間がかかるようです。誰でもこのコードを確認して、何か足りないと思うかどうか教えてもらえますか?

var description;
var id;
$(".description").live('blur',function() {
   var success;
   var dataType;
   $(".dynamic_row,<?php echo $services; ?>").each(function() {
      var row = $(this);
      var id = row.find(".id").val() || 0;
      var description = row.find(".description").val() || "";
      var q = <?php echo $q; ?>;
      $.ajax({
         type: "POST",
         url: 'setdescname.php',
         data: {ider:id, descriptionr:description, qr:q},
         success: function(result) {
            if(result.isOk == false)
               alert(result.message);
            },
            dataType: dataType
      });
   });
});

<?php echo $services; ?>チェックボックスによってアクティブ化される可能性のある動的行の約 16 の名前を取り込みます。その部分はうまく機能します...

これはsetdescname.phpのコードです

require_once('include/database.php');

if (!dbConnect()) {
    echo 'Error connecting to database';
    exit;
}

$id = $_POST['ider'];
$description = $_POST['descriptionr'];
$q = $_POST['qr'];

$qry = "UPDATE items SET description = '".$description."' WHERE id = '".$id."'";

$result = mysql_query($qry) or die(mysql_error());

重要だと思われる場合は、コードの前半に次のものがあります。

$.ajaxSetup({async:false});
$.ajaxSetup({cache:false});

すべてのユーザーが IE にいて、ajax 呼び出しをキャッシュし、必要な機能なしで新しい「動的」フィールドの追加をレンダリングするため、これが必要でした (新しい追加を元に戻しmysql_insert_id()ます)。

これはすべて機能しますが、痛々しいほど遅いです...

アドバイスや提案をいただければ幸いです。ありがとう。

4

2 に答える 2

0

すべてのデータを 1 回の要求でスクリプトに送信するように、ソリューションをリファクタリングする必要があります。多数のリクエストを実行する必要はありません (特にサーバー コードを所有しているため)。

開始するには:

var description;
var id;
var dataBuf = [];
$(".description").live('blur',function() {
   var success;
   var dataType;
   $(".dynamic_row,<?php echo $services; ?>").each(function() {
      var row = $(this);
      var id = row.find(".id").val() || 0;
      var description = row.find(".description").val() || "";
      var q = <?php echo $q; ?>;
      dataBuf.push({"ider" : id, "descriptionr" :description, "qr" :q};
    });

    // now send it all as one request:
    $.ajax({
        type: "POST",
        url: 'setdescname.php',
        data: {"data": JSON.stringify(dataBuf)},
        success: function(result) {
        if(result.isOk == false)
            alert(result.message);
        },
        dataType: dataType
    });
});

そしてサーバー上で:

<?php
$data = json_decode($_POST['data']);
foreach($data as $row) {
    echo $row['ider'];
    echo $row['descriptionr'];
    echo $row['qr'];
    // etc.
    // do stuff with data, store in DB
    // for example
}

Ps - リクエストが非同期で起動されたとしても、ブラウザで許可される同時 XHR リクエストの数が、たとえば少数に制限されているため、パフォーマンスの問題が発生します。

于 2013-08-10T09:09:55.653 に答える
0

高速に ajax キャッシュと ajax async が必要な場合

Ajax キャッシュ

$.ajax({ url: '/?=testDefault', data: { 'cache': 'default' } });//タイムスタンプなし

$.ajaxSetup({ cache: false });
$.ajax({ url: '/?=testFalse/',
data: { 'cache': 'false' }
});//yes, a timestamp

$.ajaxSetup({ cache: true });
$.ajax({ url: '/?=testTrue/',
data: { 'cache': 'true' }
}); //no timestamp

Ajax 非同期の場合

$.ajax({
          url: "super.php",
          data: "a="+a,
          type: "POST",
          async: false,
          success: function(data) {
            alert(data);
          }
    });
于 2013-08-10T08:54:05.880 に答える