2010-05-14 7 views
5

Ich habe ein Formular, wo ein Eingabefeld für seinen Wert überprüfen und dann mache ich einen Ajax-Aufruf mit dem typewatch-Plugin (eine kleine Sache, die erkennt, dass der Benutzer nach einem vordefinierten beendet hat zu tippen) Intervall). Es funktioniert großartig.jQuery Ajax: Kopieren - Einfügen dingy

Da es sich bei diesem Feld um einen "Gutschein-Rabatt" in einem Bestellformular handelt, kann der Wert durch Kopieren des Gutscheincodes aus einer E-Mail oder ähnlichem eingegeben werden. Es funktioniert auch mit Strg + C - Strg + V zum Kopieren und Einfügen, aber nicht, wenn ein Benutzer den Text mit der Maus auswählt, klickt im Kontextmenü kopieren und dann aus diesem Menü einfügen.

Gibt es eine Möglichkeit in jQuery, irgendwie auf diese Art von Verhalten in jQuery zu prüfen?

Antwort

1

Sie könnten eine geringe Auszeit (1 Sekunde) eingestellt, dass der Wert überprüft wird seit der letzten Überprüfung geändert hat.

Sie können es auch einfach ignorieren und wenn das Formular reicht den Inhalt dieser Gutschein Rabatteingabe und verarbeiten Sie es.

0

Ich habe vor ein ähnliches Problem hat. Soweit ich weiß, gibt der Browser keine Ereignisse aus, wenn der Benutzer per Rechtsklick einfügt oder aus der Liste der zuvor verwendeten Werte auswählt.

Ich habe es auf eine gute Weise gelöst, indem ich zusätzlich meinen Event-Handler an das Blur-Event gebunden habe. Der einzige Fall, der nicht erfasst wurde, war, wenn sie einen Wert mit der Maus einfügen und dann die Eingabetaste zum Senden drücken. Ich war in der Lage, um diesen durch ein kleines hackery zu bekommen:

$(element) 
    .bind('keydown blur', handlerFunction) 
    .keydown(function(event) { 
    if (event.keyCode === 13 /* Enter Key */) { 
     event.preventDefault(); 
     event.stopPropagation(); 
    } 
    }) 
    .keyup(function(event) { 
    if (event.keyCode === 13 /* Enter Key */) { 
     $(this).closest('form').submit(); 
    } 
    }); 

Im Wesentlichen das funktioniert, weil jQuery wird die Ereignisse in der Reihenfolge ausgeführt, sie gebunden waren. Normalerweise erfolgt die Übermittlung des Formulars auf dem Keydown einer Enter-Taste. Um die keyup Handler Zeit zu geben, seine Magie zu tun, müssen Sie dieses Formular Vorlage verzögern, bis das keyup Ereignis eintritt, so dass die andere keyup Handler zuerst ausgeführt werden können.

Jetzt haben Sie gesagt, dass Sie ein Plugin verwendet haben, das eine Verzögerung hinzufügt, bevor Sie auf das Benutzerereignis reagieren. Das bedeutet, dass Sie diese Technik wörtlich nicht verwenden können. Eine Sache, die stattdessen funktionieren könnte, wäre, die Handler-Funktion direkt aufzurufen, bevor das Senden des Formulars zugelassen wird. Um das zu tun, würden Sie den letzten keyup Handler ändern:

.keyup(function(event) { // Part 2 
    if (event.keyCode === 13 /* Enter Key */) { 

     handlerFunction.call(this, event); // force it to happen now 

     $(this).closest('form').submit(); 
    } 
    }); 

Als Josh K bereits erwähnt, können Sie einfach etwas zu der Veranstaltung vorlegen binden auf dem Formular etwas ähnliches zu tun. Wenn Sie es Ajax tun, aber sicher sein, async: false in den übergebenen Optionen setzen, denn sonst wird das Formular gehen Sie vor und legt für den Anruf ohne zu warten, zu vervollständigen.

0

(diese Lösung wurde nicht getestet, aber!) Ich würde so etwas wie dies versuchen:

var keys_pressed = 0; // count the number of key press events 
var required_keys_pressed = 10; 
$('#yourinputElement').keydown (function() { 
    keys_pressed++; // add one 
}); 
$('#yourform').submit (function() { 
    if (keys_pressed < required_keys_pressed) 
    { 
    // not enough keys pressed or was a CTRL + v 
    } 
    else 
    { 
    // required number of keys pressed for your code 
    } 
}); 

Denken Sie daran, wenn Menschen können immer diese Plugins mit Browser umgehen, so dass es keine Garantie gibt, dass die Dinge sind so gegangen, wie du sie haben willst. Sie sollten IMMER eine Art von serverseitige Validierung durchführen zu