जावास्क्रिप्ट का उपयोग करके सफारी में एक कीबोर्ड इवेंट फायरिंग


79

मैं जावास्क्रिप्ट का उपयोग करके सफारी में एक कीबोर्ड घटना का अनुकरण करने की कोशिश कर रहा हूं।

मैंने यह कोशिश की है:

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

... और यह भी:

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

हालांकि, दोनों तरीकों की कोशिश करने के बाद, मुझे एक ही समस्या है: कोड निष्पादित होने के बाद, घटना ऑब्जेक्ट के keyCode/ whichगुण सेट किए जाते हैं 0, नहीं 115

क्या कोई जानता है कि सफारी में एक कीबोर्ड घटना को मज़बूती से बनाने और भेजने के लिए कैसे? (यदि संभव हो तो मैं इसे सादे जावास्क्रिप्ट में प्राप्त करना चाहता हूं।)


क्या आप उस कोड को निष्पादित करने का प्रयास कर रहे हैं जिसे आपने परिभाषित किया है या कुछ कुंजी-संयोजन जो ब्राउज़र समझता है? यदि यह आपका अपना कोड है, तो किसी ईवेंट रैपर को सेटअप करना सबसे अच्छा हो सकता है जिसे आप या तो "वास्तविक" कीबोर्ड इंटरफ़ेस या किसी अन्य ईवेंट जनरेटर के माध्यम से कॉल कर सकते हैं, जैसा कि आपने यहां बताया है। उपयुक्त के रूप में दर्शाते हुए।
नोलते

1
इस उदाहरण में, मैं "s" दबाने वाले उपयोगकर्ता को अनुकरण करने की कोशिश कर रहा हूं। अंततः, मैं Apple डैशबोर्ड विजेट में कमांड-आर दबाने वाले उपयोगकर्ता को अनुकरण करने की कोशिश कर रहा हूं।
स्टीव हैरिसन

2
आपके कोड ने मेरी समस्या हल कर दी :)

@ acidzombie24: मेरी खुशी! :)
स्टीव हैरिसन

जवाबों:


43

मैं DOM कीबोर्ड इवेंट लेवल 3 पॉलीफ़िल पर काम कर रहा हूँ । नवीनतम ब्राउज़रों में या इस पॉलीफ़िल के साथ आप ऐसा कुछ कर सकते हैं:

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})

अपडेट करें:

अब मेरा पॉलीफ़िल विरासत के गुणों का समर्थन करता है "कीकोड", "चारकोड" और "जो"

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

उदाहरण यहाँ

इसके अतिरिक्त यहाँ मेरे पॉलीफ़िल से अलग क्रॉस-ब्राउज़र initKeyboardEvent है: (gist)

पॉलिफ़िल डेमो


स्क्रॉल करने योग्य क्षेत्र बनाने के लिए काम नहीं करता है, तीर या पेज अप / डाउन कीज़ का उपयोग करके स्क्रॉल करें ...
माइकल

दस्तावेज़ @ jsfiddle.net/vnathalye/yjc5F/974 के बजाय टेक्स्टबॉक्स पर ईवेंट को भेजने के लिए अपनी jsfiddle को बदला । हालाँकि यह कीपर हैंडलर को फायर करता है, लेकिन टेक्स्ट टेक्स्ट बॉक्स में प्रदर्शित नहीं होता है। कोई उपाय?
विवेक अठाली

1
@termi आपका डेमो लिंक मर चुका है
सेबेस्टियन

किसी इनपुट (टेक्स्ट) तत्व के मान को बदलने के लिए काम नहीं करता है।
माइकल

डिलीट ऑपरेटर का ऑपरेंड केवल पढ़ने योग्य संपत्ति नहीं हो सकता है।
nircraft

30

क्या आपने घटना को सही ढंग से प्रेषण किया?

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");
  }
}

यदि आप jQuery का उपयोग करते हैं, तो आप कर सकते हैं:

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

3
क्या इसके साथ नियंत्रण + सी (कॉपी शॉर्टकट) का अनुकरण करना संभव है?
जॉन जॉन पिक्लर

1
@claudiopro हाँ, आप सही हैं यह होना चाहिए(evt.initKeyEvent || evt.initKeyboardEvent).call(evt, // etc.
tyronegcarter

12
InitKeyboardEvent क्रोमियम में भी काम नहीं करता है। event.keyCodeऔर event.whichहमेशा वापस 0. यह एक ज्ञात बग है और एक नियमित घटना का उपयोग करने के लिए समाधान हैvar event = document.createEvent('Event'); event.initEvent('keydown', true, true); event.keyCode = 76;
lluft

5
Downvoted : initKeyEventऔर initKeyboardEventकर रहे हैं हटाया गया
Константин Ван

2
@ K._ पहले के कामकाज के जवाब के लिए नीचा दिखाने के बजाय यह बताते हुए कि यह पदावनत होना चाहिए कि सभी को बिना सिर हिलाए नकारात्मक रूप से प्रभावित करने के लिए पर्याप्त होना चाहिए। यह उत्तर stackoverflow.com/questions/961532/… आधुनिक KeyboardEvent developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/…
बिट-लेस

17

यह एक बग के कारण है वेबकिट में ।

आप createEvent('Event')इसके बजाय का उपयोग करके वेबकिट बग के आसपास काम कर सकते हैं createEvent('KeyboardEvent'), और फिर keyCodeसंपत्ति असाइन कर सकते हैं। इस उत्तर और इस उदाहरण को देखें ।


8

मोज़िला डेवलपर नेटवर्क निम्नलिखित विवरण प्रदान करता है:

  1. एक घटना का उपयोग कर बनाएँ event = document.createEvent("KeyboardEvent")
  2. कीवेंट को निष्क्रिय करें

का उपयोग कर:

event.initKeyEvent (type, bubbles, cancelable, viewArg, 
       ctrlKeyArg, altKeyArg, shiftKeyArg, metaKeyArg, 
           keyCodeArg, charCodeArg)
  1. ईवेंट का उपयोग करके डिस्पैच करेंyourElement.dispatchEvent(event)

मुझे आपके कोड में अंतिम नहीं दिख रहा है, हो सकता है कि आप गायब हों। मुझे आशा है कि यह IE में भी काम करता है ...


2
दुर्भाग्य से, मोज़िला का कार्यान्वयन गैर-मानक है। बिंदु 3 के लिए, मेरी समस्या सही घटना पैदा कर रही है - इस घटना के बाद प्रेषण। इसके अलावा, जब से मैं Apple के डैशबोर्ड के लिए विकसित कर रहा हूं, मुझे IE के बारे में चिंता करने की ज़रूरत नहीं है! (हूपी!)
स्टीव हैरिसन

5
.initKeyEventअब पदावनत कर दिया जाता है
हम्पस अह्लग्रेन

1

मैं इसके साथ बहुत अच्छा नहीं हूं लेकिन KeyboardEvent=> देखिए कि KeyboardEvent के साथ शुरुआत की गई है initKeyEvent
यहां <input type="text" />तत्व पर ईवेंट छोड़ने के लिए एक उदाहरण है

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" />


7
यह js:21TypeError: kEvent.initKeyEvent is not a function. (In 'kEvent.initKeyEvent("keypress", true, true, null, false, false, false, false, 74, 74)', 'kEvent.initKeyEvent' is undefined)सफारी में दिखाता है :(
वह Yifei 一 非

यह होना चाहिए: var kEvent = document.createEvent ("KeyboardEvent"); kEvent.initKeyboardEvent ("कीपर", सच, सच्चा, अशक्त, झूठा, झूठा, झूठा, झूठा, K४, ,४); document.dispatchEvent (kEvent);
Любопытный
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.