Ich habe ein HTML-Formular mit Registerkarten. Beim Navigieren von einer Registerkarte zur anderen bleiben die Daten der aktuellen Registerkarte (in der Datenbank) erhalten, auch wenn keine Änderungen an den Daten vorgenommen wurden.
Ich möchte den Persistenzaufruf nur durchführen, wenn das Formular bearbeitet wird. Das Formular kann jede Art von Kontrolle enthalten. Das Verschmutzen des Formulars muss nicht durch Eingabe von Text erfolgen, sondern die Auswahl eines Datums in einem Kalendersteuerelement ist ebenfalls zulässig.
Eine Möglichkeit, dies zu erreichen, besteht darin, das Formular standardmäßig im schreibgeschützten Modus anzuzeigen und über die Schaltfläche "Bearbeiten" zu verfügen. Wenn der Benutzer auf die Schaltfläche "Bearbeiten" klickt, wird die Datenbank aufgerufen (unabhängig davon, ob Daten geändert werden) Dies ist eine bessere Verbesserung gegenüber dem, was derzeit vorhanden ist.
Ich möchte wissen, wie man eine generische Javascript-Funktion schreibt, die prüft, ob einer der Steuerelemente geändert wurde.
quelle
Antworten:
In reinem Javascript wäre dies keine leichte Aufgabe, aber jQuery macht es sehr einfach:
Dann können Sie vor dem Speichern überprüfen, ob es geändert wurde:
Im obigen Beispiel hat das Formular eine ID gleich "myform".
Wenn Sie dies in vielen Formen benötigen, können Sie es einfach in ein Plugin verwandeln:
Dann können Sie einfach sagen:
und prüfen Sie, ob sich ein Formular geändert hat:
quelle
trackChanges: function () { $(document).on('change', $(this).find(':input'), function (e) { var el = $(e.target); $(el).closest('form').data("changed", true); });
Für den Fall, dass JQuery nicht in Frage kommt. Eine schnelle Suche bei Google ergab Javascript-Implementierungen von MD5- und SHA1-Hash-Algorithmen. Wenn Sie möchten, können Sie alle Formulareingaben verketten und hashen und diesen Wert dann im Speicher speichern. Wenn der Benutzer fertig ist. Verketten Sie alle Werte und den Hash erneut. Vergleichen Sie die 2 Hashes. Wenn sie identisch sind, hat der Benutzer keine Formularfelder geändert. Wenn sie unterschiedlich sind, wurde etwas bearbeitet, und Sie müssen Ihren Persistenzcode aufrufen.
quelle
Ich bin nicht sicher, ob ich Ihre Frage richtig verstehe, aber was ist mit addEventListener? Wenn Sie sich nicht zu sehr für die IE8-Unterstützung interessieren, sollte dies in Ordnung sein. Der folgende Code funktioniert für mich:
quelle
Eine andere Möglichkeit, dies zu erreichen, besteht darin, das Formular zu serialisieren:
quelle
So habe ich es gemacht (ohne jQuery zu verwenden).
In meinem Fall wollte ich, dass ein bestimmtes Formularelement nicht gezählt wird, da es das Element war, das die Prüfung ausgelöst hat und sich daher immer geändert hat. Das außergewöhnliche Element heißt 'reporting_period' und ist in der Funktion 'hasFormChanged ()' fest codiert.
Lassen Sie zum Testen ein Element die Funktion "changeReportingPeriod ()" aufrufen, die Sie wahrscheinlich etwas anderes benennen möchten.
WICHTIG: Sie müssen setInitialValues () aufrufen, wenn die Werte auf ihre ursprünglichen Werte gesetzt wurden (normalerweise beim Laden der Seite, in meinem Fall jedoch nicht).
HINWEIS: Ich behaupte nicht, dass dies eine elegante Lösung ist. Tatsächlich glaube ich nicht an elegante JavaScript-Lösungen. Mein persönlicher Schwerpunkt in JavaScript liegt auf der Lesbarkeit, nicht auf struktureller Eleganz (als ob dies in JavaScript möglich wäre). Ich beschäftige mich beim Schreiben von JavaScript überhaupt nicht mit der Dateigröße, da dies der Zweck von gzip ist und der Versuch, kompakteren JavaScript-Code zu schreiben, ausnahmslos zu unerträglichen Problemen bei der Wartung führt. Ich entschuldige mich nicht, drücke keine Reue aus und lehne es ab, darüber zu debattieren. Es ist JavaScript. Entschuldigung, ich musste dies klarstellen, um mich davon zu überzeugen, dass ich mir die Mühe machen sollte, etwas zu posten. Sei glücklich! :) :)
quelle
Formularänderungen können in nativem JavaScript ohne jQuery leicht erkannt werden:
initChangeDetection()
kann während des gesamten Lebenszyklus Ihrer Seite sicher mehrmals aufgerufen werden: Siehe Test auf JSBinFür ältere Browser, die neuere Pfeil- / Array-Funktionen nicht unterstützen:
quelle
Hier ist eine Demo der Polyfill-Methode in nativem JavaScript, die mithilfe der
FormData()
API erstellte, aktualisierte und gelöschte Formulareinträge erkennt. Sie können überprüfen, ob etwas geändert wurde, indemHTMLFormElement#isChanged
Sie ein Objekt mit den Unterschieden zu einem zurückgesetzten Formular abrufenHTMLFormElement#changes
(vorausgesetzt, sie werden nicht durch einen Eingabenamen maskiert):quelle