2016-12-02 2 views
2

Ich habe eine HTML-Tabelle, die ich mit Informationen aus einer Datenbanktabelle auffüllen. Ich habe die Zellen in der Tabelle nach dem Klick editierbar gemacht und jQuery hinzugefügt, um nach Beendigung der Bearbeitung der Zelle zu fangen (2,5 sec nach dem letzten Tastendruck), dann sendet ajax info an eine separate php-Datei, um die Datenbanktabelle mit den geänderten zu aktualisieren Wert. Ein Problem, das ich gefunden habe, ist, dass, wenn die Zelle angeklickt wird, um in eine andere Zelle zu gehen, und eine Änderung vor diesen 2,5 Sekunden vorgenommen wird, die erste Änderung niemals in die Datenbank aktualisiert wird.jQuery, verwenden Sie mehr als einen Ereignisauslöser?

Meine Frage ist: Wenn ich auf ein Feld Unschärfe Ereignis statt ändern würde, ist es eine Möglichkeit, dass ich immer noch den Timer übernehmen könnte, so dass Ajax erreicht, wenn entweder das Feld Unschärfe oder das Timeout erreicht werden?

$('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

Ja. Sie können einen Timer für die Tastenkombination verwenden und eine Unschärfe für die Zelle verwenden. Stattdessen würde ich wahrscheinlich ein "keyup" -Ereignis an der Eingabe in dem Feld machen, das zuerst das Zeitlimit abbricht und dann ein Zeitlimit mit einer Funktion darin ausführt. Fügen Sie dann ein Unschärfungs-Ereignis zum Feld hinzu, um die gleiche Funktion auszuführen wie vom 'keyup' gemacht. – ntgCleaner

Antwort

1

Ich schlage vor, Sie verwenden eine andere für .setTimeout Verzögerung je nachdem, welches Ereignis auslöst.

So auf blur, wird es nicht 2,5 Sekunden warten, um zu speichern, wie auf input.

EDITED
"double speichern" Um zu verhindern, die td als gespeichert markieren.

var saveTimeout; 

// Remove the "saved" class on keydown 
$('td').on('keydown', function(e) { 
    $(this).removeClass("saved"); 
}); 

$('td').on('input blur', function(e) { 
    console.log("event "+e.type+" occured"); 
    var timeoutDelay=2500; 

    if(e.type == "blur"){ 
     timeoutDelay=1; 
    } 

    // If NOT already saved... 
    if(!$(this).hasClass("saved")){ 
     var _this = $(this); // preserve reference to the input field here 

     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); 
       // Add the "saved" class to prevent other saving 
       _this.addClass("saved"); 
      }); 

      console.log("Ajax sent"); 

     }, timeoutDelay); 
    } 
}); 
+0

Diese Lösung sieht interessant aus, aber wenn das letzte' td' nicht angeklickt wird, würde das Eingabeblur-Ereignis nie richtig passieren? Deshalb möchte ich den Timer, damit ich Leute treffe, die auch nie herausklicken – Brandon

+1

Der Timer am Eingang funktioniert immer noch ... Also wenn es nicht angeklickt wurde ODER wenn es keine Eingabe gab, wird es nicht speichern. –

+0

Oh man tut mir leid, ich habe erst bemerkt, dass Input und Blur separate Ereignisse sind. Ich fühle mich jetzt ziemlich dumm ... LoL – Brandon

Verwandte Themen