Ich hatte gestern ein ähnliches Problem und habe eine Lösung gefunden, um alte und neue Texteingabewerte zu unterscheiden.
Die Ausgabe sieht folgendermaßen aus:
Alter Wert: test test
Neuer Wert: test w
Änderung: Überschreiben von 'test' mit 'w' an Position 5
Das Skript verwendet window.setInterval(), um browserübergreifende Probleme zu vermeiden (siehe https://stackoverflow.com/a/1949416/727190 ). Dies führt dazu, dass einige Änderungen gestapelt werden, wenn der Benutzer sehr schnell tippt - dies könnte eine gute Sache sein, hängt von Ihrer Situation ab.
Sie können das Skript jedoch leicht so ändern, dass es mit Ereignissen arbeitet.
http://jsfiddle.net/6zp48/2/
Auszug aus einem Fiddle, der das Ergebnis des Diffs zeigt (der findChange()-Code ist zu lang, um ihn hier einzufügen):
var changeType = { added: 0, deleted: 1, overwrite: 2 };
var previousValue = '';
window.setInterval(checkChange, 100);
function checkChange() {
var newValue = $("#input1").val();
if(newValue != previousValue) {
showChange(findChange(previousValue, newValue));
previousValue = newValue;
}
}
function showChange(result) {
$("#last-change").html("Prev: " + previousValue + "<br/>Next:" + $("#input1").val() + "<br/>");
if(result == null) {
$("#last-change").html($("#last-change").html() + " no change detected");
return;
}
switch (result.change) {
case changeType.added:
$("#last-change").html($("#last-change").html() + "added '" + result.added.text + "' at position " + result.added.position + "<br />");
break;
case changeType.deleted:
$("#last-change").html($("#last-change").html() + "deleted '" + result.lost.text + "' at position " + result.lost.position + "<br />");
break;
case changeType.overwrite:
$("#last-change").html($("#last-change").html() + "overwrote '" + result.lost.text + "' with '" + result.added.text + "' at position " + result.added.position + "<br />");
break;
}
}