2016-12-01 4 views
0

私はHTMLテーブルを持っており、データベーステーブルから情報を入力しています。私は編集可能な表のセルをポンクリックにして、セル編集が完了した時点で(最後のキーを押すと2.5秒後に)jQueryを追加して、別のPHPファイルに情報を送信してデータベーステーブルを更新します変更された値。私が見つけた問題は、セルが別のセルに入るためにクリックされ、2.5秒前に変更が加えられた場合、最初の変更は決してデータベースに更新されないということです。jQueryタイムアウトがクリックアウトをキャッチするように変更する

、私の質問は:は、私は<td>セルが外にクリックして変更が見落とされていないように、データベーステーブルの変更を行うために、すぐにAJAXに送信された場合も、キャプチャするために、以下の私のコードを変更することができます任意の方法はあります?

 $('td').on('input', function() { 
      var _this = $(this); // preserve reference to the input field here 

      if(saveTimeout) clearTimeout(saveTimeout); 
      saveTimeout = setTimeout(function() { 
       console.log(_this) 
       $.ajax({ 
        method: "POST", 
        url: "updatedatabase.php", 
        data: { 
         content: _this.text(), 
         date: _this.siblings().first().text(), 
         prod: $('tr:first-child th:nth-child(' + (_this.index() + 1) + ')').text(), 
         old: old 
        } 
       }) 
       .done(function(msg) { 
        alert(msg); 
       }); 

      }, 2500); 
     }); 
+0

フィールド入力ではなく、フィールドぼかしでイベントを発生させるのはなぜですか。この方法で2.5秒のタイムアウトチェックをスキップすることができます – dstarh

+0

タイムアウトのポイントは、誰かが編集後に他のセルをクリックしなかった場合にキャッチすることです。たぶん彼らは別の画面に切り替えるか、自分の机などから離れます。フィールドボケとカウンターの両方を行う方法がありますか? – Brandon

+0

'2500 timeout'を削除したい場合は、' input'イベントを既に聞いているときにクリックした瞬間にすべてのキーストロークを捕捉するタイムアウトなしで –

答えて

0

異なる変数を使用して、各セルのタイマーを保持できます。 tdTimersという名前の空のオブジェクトを作成し、それをセルのグローバルインデックスとともに使用して、内部にsetTimeoutから返されたタイマーを格納します。こうすると、ユーザーがセルを離れて別のセルに入ると、前のセルのタイマーが有効になり、オブジェクト内に異なるインデックスがあるため、最終的には起動します。

var tdTimers = {}; 

$('td').on('input', function() { 
    var _this = $(this); // preserve reference to the input field here 
    var tdGlobalIndex = _this.index('td'); 

    if(tdTimers[tdGlobalIndex]) clearTimeout(tdTimers[tdGlobalIndex]); 
    tdTimers[tdGlobalIndex] = setTimeout(function() { 
     console.log(_this) 
     $.ajax({ 
      method: "POST", 
      url: "updatedatabase.php", 
      data: { 
       content: _this.text(), 
       date: _this.siblings().first().text(), 
       prod: $('tr:first-child th:nth-child(' + (_this.index() + 1) + ')').text(), 
       old: old 
      } 
     }) 
     .done(function(msg) { 
      alert(msg); 
     }); 

    }, 2500); 
}); 
関連する問題