2009-06-07 15 views
61

Próbuję zasymulować zdarzenie klawiatury w Safari przy użyciu JavaScript.Wypalanie zdarzenia klawiatury w JavaScript

Próbowałem to:

var event = document.createEvent("KeyboardEvent"); 
event.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 115, 0); 

... a także to:

var event = document.createEvent("UIEvents"); 
event.initUIEvent("keypress", true, true, window, 1); 
event.keyCode = 115; 

Po wypróbowaniu obu podejść, jednak mam ten sam problem: po kod został wykonany, właściwości obiektu zdarzenia są ustawione na 0, a nie na 115.

Czy ktoś wie, jak poprawnie utworzyć i wysłać wydarzenie na klawiaturze w Safari? (Wolałbym, aby osiągnąć go w zwykły JavaScript jeśli to możliwe).

+0

Próbujesz wykonać kod zostały zdefiniowane lub jakąś kombinację kluczy przeglądarka rozumie? Jeśli jest to twój własny kod, najlepiej jest skonfigurować opakowanie zdarzeń, które można wywołać za pomocą "prawdziwego" interfejsu klawiatury lub innego generatora zdarzeń, jak opisano tutaj. Refaktoryzacja w razie potrzeby. – Nolte

+1

W tym przykładzie próbuję zasymulować użytkownika naciskając "s". Ostatecznie próbuję zasymulować użytkownika naciskając Command-R w Apple Dashboard Widget. –

+2

Twój kod rozwiązał mój problem :) –

Odpowiedz

6

Mozilla Developer Network zawiera następujące wyjaśnienie:

  1. utworzyć wydarzenie za pomocą event = document.createEvent("KeyboardEvent")
  2. Init w keyEvent

wykorzystaniem :

event.initKeyEvent (type, bubbles, cancelable, viewArg, 
     ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, 
      keyCodeArg, charCodeArg) 
  1. Dispatch the event użyciu yourElement.dispatchEvent(event)

nie widzę ostatni w kodzie, może to, co tracisz. Mam nadzieję, że to zadziała również w IE ...

+2

Niestety to nie rozwiązuje problemu. –

+0

Poprawiłem całą odpowiedź, mam nadzieję, że pomaga. – Javache

+2

Niestety, implementacja Mozilli jest niestandardowa. Jeśli chodzi o punkt 3, mój problem polega na utworzeniu prawidłowego zdarzenia - wysłanie zdarzenia następuje po tym. Poza tym, ponieważ pracuję dla Dashboard firmy Apple, wcale nie muszę się martwić o IE! (Whoopee!) –

28

Czy poprawnie wysłałeś to wydarzenie?

function simulateKeyEvent(character) { 
    var evt = document.createEvent("KeyboardEvent"); 
    (evt.initKeyEvent || evt.initKeyboardEvent)("keypress", true, true, window, 
        0, 0, 0, 0, 
        0, character.charCodeAt(0)) 
    var canceled = !body.dispatchEvent(evt); 
    if(canceled) { 
    // A handler called preventDefault 
    alert("canceled"); 
    } else { 
    // None of the handlers called preventDefault 
    alert("not canceled"); 
    } 
} 

Jeśli używasz jQuery, można zrobić:

function simulateKeyPress(character) { 
    jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) }); 
} 
+0

Wygląda na błąd w linii: 'evt.initKeyEvent'. W Chromium nie mam metody initKeyEvent w KeyboardEvent.prototype. Dla mnie musi to być: 'evt.initKeyboardEvent' – gvlasov

+3

Czy można symulować sterowanie + C (skrót kopiowania) za pomocą tego? –

+0

@EdPichler Istnieje specjalny interfejs API do interakcji z tekturą, nie zrobiłbym tego na własnej skórze, symulując wydarzenie na klawiaturze. [Related SO post] (http://stackoverflow.com/questions/400212/how-to-copy-to-the-clipboard-in-javascript) – 11684

21

pracuję nad DOM Keyboard Event Level 3 polyfill. W najnowszych przeglądarek lub z tego PolyFill można zrobić coś takiego:

element.addEventListener("keydown", function(e){ console.log(e.key, e.char, e.keyCode) }) 

var e = new KeyboardEvent("keydown", {bubbles : true, cancelable : true, key : "Q", char : "Q", shiftKey : true}); 
element.dispatchEvent(e); 

//If you need legacy property "keyCode" 
// Note: In some browsers you can't overwrite "keyCode" property. (At least in Safari) 
delete e.keyCode; 
Object.defineProperty(e, "keyCode", {"value" : 666}) 

UPDATE:

Teraz moja polyfill obsługuje właściwości starszych "keyCode", "charCode" i "który"

var e = new KeyboardEvent("keydown", { 
    bubbles : true, 
    cancelable : true, 
    char : "Q", 
    key : "q", 
    shiftKey : true, 
    keyCode : 81 
}); 

Przykłady

Dodatkowo tutaj jest initKeyboardEvent w różnych wersjach językowych z mojej przeglądarki: (gist)

PolyFill demo

+0

Wygląda na to, że nie działa, aby przewinąć przewijany obszar za pomocą klawiszy strzałek lub klawiszy w górę/w dół ... – Michael

+0

Zmieniono jsfiddle, aby wysłać zdarzenie w polu tekstowym zamiast dokumentu @ http://jsfiddle.net/vnathalye/yjc5F/974 /. Chociaż uruchamia manipulator naciśnięcia klawisza, tekst nie zostanie wyświetlony w polu tekstowym. Dowolny pomysł? –

+1

@termi Twój link demo jest martwy – Sebastian

14

Jest to spowodowane bug w Webkit.

Możesz obejść błąd Webkita, używając createEvent('Event') zamiast createEvent('KeyboardEvent'), a następnie przypisując właściwość keyCode. Zobacz this answer i this example.

1

Nie jestem z tym dobry, ale KeyboardEvent => patrz KeyboardEvent jest inicjowany pod numerem initKeyEvent.
Oto przykład do emitowania zdarzenie na <input type="text" /> elementu

document.getElementById("txbox").addEventListener("keypress", function(e) { 
 
    alert("Event " + e.type + " emitted!\nKey/Char Code: " + e.keyCode + "/" + e.charCode); 
 
}, false); 
 

 
document.getElementById("btn").addEventListener("click", function(e) { 
 
    var doc = document.getElementById("txbox"); 
 
    var kEvent = document.createEvent("KeyboardEvent"); 
 
    kEvent.initKeyEvent("keypress", true, true, null, false, false, false, false, 74, 74); 
 
    doc.dispatchEvent(kEvent); 
 
}, false);
<input id="txbox" type="text" value="" /> 
 
<input id="btn" type="button" value="CLICK TO EMIT KEYPRESS ON TEXTBOX" />

+6

pokazuje 'js: 21TypeError: kEvent.initKeyEvent nie jest funkcją. (W 'kEvent.initKeyEvent ("keypress", true, true, null, false, false, false, false, 74, 74)', 'kEvent.initKeyEvent' jest niezdefiniowane) 'w safari :( – Arefly

+1

W aktualnej wersji Chrome (52) Wystąpił błąd: Uncaught TypeError: kEvent.initKeyEvent nie jest funkcją –

Powiązane problemy