/ / Wie kann ich mit Javascript ein Keypress-Ereignis in Safari generieren? - Javascript, Safari

Wie kann ich mit Javascript ein Keypress-Ereignis in Safari generieren? - Javascript, Safari

Wie kann ich programmgesteuert Tastendruck erzeugen?Ereignisse von Javascript-Code, der in Safari ausgeführt wird? Offenbar verwendet WebKit das DOM-Level 3-Modell zum Erstellen von Tastaturereignissen über Javascript, und das DOM-Level 3-Tastaturereignismodell unterstützt das Keypress-Ereignis nicht. Gibt es eine andere Möglichkeit, die ich verwenden kann?

Ich suche als reines Safari / WebKit DOMLösung wie möglich. Ich ziehe es wirklich vor, die Webseite nicht zu verändern, und ich möchte auch keine Abhängigkeiten von externen Bibliotheken hinzufügen. Ich muss alle vorhandenen Tastendruck-Handler aktivieren, so dass es nicht funktioniert, einen neuen Handler hinzuzufügen und ihn direkt aufzurufen.

Es sieht so aus, als hätte WebKit den Schlüsselcode und den ZeichencodeEigenschaften des in der UIEvent-Klasse definierten Keypress-Ereignisses, diese sind jedoch schreibgeschützt Gibt es eine Möglichkeit, diese Eigenschaften festzulegen? Folgendes funktioniert nicht:

var evt = document.createEvent("UIEvents");
evt.initUIEvent("keypress", true, true, window, 0);
evt.keyCode = 114; // "r"
evt.charCode = 114;
alert("keyCode = " + evt.keyCode + ", charCode = " + evt.charCode); // both 0

Das Festlegen der Detaileigenschaft im Aufruf von initUIEvent scheint ebenfalls keine Auswirkungen zu haben.

Antworten:

6 für die Antwort № 1

Verwenden Sie das TextEvent (eingeführt von DOM3). Da Sie Keypress-Ereignisse generieren möchten, vermute ich, dass Sie mit Zeichen arbeiten. In dem folgenden Code ist textToInsert eine Zeichenfolge und das Element ist das Element, für das ich das Ereignis auslöst.

var eventObject = document.createEvent("TextEvent");
eventObject.initTextEvent("textInput",
true,
true,
null,
textToInsert);

textarea.dispatchEvent(eventObject);

Dies funktioniert in Safari 3.1.2 (folglich auch in Chrome).


0 für die Antwort № 2

Klingt nach einer sehr ähnlichen (nicht browserspezifischen) Frage, die bereits gestellt und beantwortet wurde:

Lösen Sie einen Tastendruck mit jQuery aus und geben Sie an, welche Taste gedrückt wurde


0 für die Antwort № 3

Ich hatte das gleiche Problem. Ich wollte einen Test schreiben können, der besagt, dass beim Drücken der Eingabetaste auf der GUI eine Werbebuchung (li) zu einer Liste hinzugefügt wird. Dann musste ich einen Tastendruck "erzeugen". Nachdem Sie versucht haben, das Ereignis zu generieren, simulieren Sie ein Ereignis, simulieren Sie das Ereignis (jqMock). Hier ist eine sehr einfache Lösung.

Ich kann mit BDDing meinen Code mit jsSpec und jQuery-Code fortsetzen. Dieser Test wäre etwas schwieriger, wenn Sie die Tastendrücke über ein Plugin verwalten (z. B. Hotkeys-jQuery-Plugin)

Hier ist was ich machen möchte:

describe "I need to be able to edit items in a list", {

... [setup code and other tests]

"should create a new item if I press enter": function(){ value_of($("#todo").items().size()).should_be(7) // be on the last item in the list task = $("#todo").items().filter(":last").focus() // press enter task.__keypress(13) // check that an item was added value_of($("#todo").tasks().size()).should_be(8) }, }

Hier ist der Code, der den Handler bindet. Beachten Sie bei dieser Lösung, dass ich das Ereignis abfange und nur durch das which Code - das erlaubt mir, den Wert von zu übergebender Test. Das ist alles, was ich im Moment brauche. Wenn ich mehr abfangen wollte, müsste ich natürlich erweitern, was übergeben wird (siehe beispielsweise jquery.hotkeys plugin):

$().items().bind("keypress", function(event){$().__keypress(event.which)})

Und hier ist der Handler:


__keypress: function(which){
switch(which)
{
...

case 13:  // enter
[my code that creates a new item]
break;
default:
}
},

ps: Wenn jemand window.event verspotten kann, lass es mich wissen. Mit jqMock hatte ich kein Glück.


-2 für die Antwort № 4

http://docs.jquery.com/Events/keypress#fn

Mit anderen Worten, Sie hängen ein Keypress-Ereignis an ein Element an. Verwenden Sie ein Element mit der ID "someid", zum Beispiel:

<script language="text/javascript" src="jquery.js"></script>
<script language="text/javascript">
$(function() {
// add a keypress handler
$("#someid").keypress(function(e){
alert("you just pressed " + e.which);
});
// imitate the keypress
$("#someid").keypress();
});
</script>