2013-07-26 10 views
7

में कुंजी ईवेंट को अनुकरण करें जेएस में कुंजी प्रेस (कीडाउन/कीप्रेस) को अनुकरण करने के लिए SO पर कई लेखों के बावजूद, कोई भी समाधान उन ब्राउज़रों के साथ काम नहीं कर रहा है जो मैं उपयोग कर रहा हूं (फ़ायरफ़ॉक्स ईएसआर 17.0। 7, क्रोम 28.0.1500.72, आईई 10)। मैंने जिन समाधानों का परीक्षण किया है उन्हें here, here, और here से लिया गया था।जावास्क्रिप्ट: टेक्स्टबॉक्स/इनपुट

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

documentation के अनुसार, यह सरल होना चाहिए। उदाहरण के लिए:

var e = document.createEvent("KeyboardEvent"); 
if (e.initKeyboardEvent) { // Chrome, IE 
    e.initKeyboardEvent("keydown", true, true, document.defaultView, "Enter", 0, "", false, ""); 
} else { // FF 
    e.initKeyEvent("keydown", true, true, document.defaultView, false, false, false, false, 13, 0); 
} 
document.getElementById("text").dispatchEvent(e); 

वास्तव में "एंटर" कीडाउन ईवेंट को सक्रिय करता है, और मेरा हैंडलर इसे पकड़ सकता है। हालांकि, यह किसी भी तरह से textarea को प्रभावित नहीं करता है - एक नई लाइन प्रकट नहीं होती है। अन्य कुंजी-कोडों के लिए समान: वर्ण दिखाई नहीं देते हैं, तीर कैरेट के स्थान को नहीं बदलते हैं, आदि

मैंने Orwellophile द्वारा कोड बढ़ाया है और इसे http://jsfiddle.net/npF3d/4/ पर पोस्ट किया है, इसलिए कोई भी कोड के साथ खेल सकता है। मेरे ब्राउज़र में, कोई भी बटन किसी भी स्थिति में टेक्स्टरेरा पर कोई प्रभाव नहीं डालता है।

मैं इस मुद्दे पर किसी भी मदद की सराहना करता हूं।

उत्तर

6

मुझे पूरा यकीन है कि यह एक "सुरक्षा" चीज है, क्योंकि मैंने पहले प्रेस को अनुकरण करने की कोशिश करते समय एक ही चीज़ में भाग लिया है।

प्रश्न: मैं प्रोग्रामेटिक रूप से टाइप कैसे कर सकता हूं?
एक: हो रही है/selectionstart, selectionEnd, आदि की स्थापना के साथ-साथ इन संयोजन में स्ट्रिंग के साथ पात्रों को सम्मिलित करने के slice तरह तरीकों का उपयोग कर। (HTMLTextAreaElement संदर्भ देखें)

प्रश्न: फिर भी आप इस तरह की घटना का उपयोग क्यों करेंगे?
ए: सभी घटना श्रोताओं का काम करेगा जैसे कि यह एक असली कुंजी घटना थी।


तीर/घर/अंत के लिए

कार्यक्षमता में गिरावट प्राप्त किया जा सकता thusly DEMO

function homeKey(elm) { 
    elm.selectionEnd = 
     elm.selectionStart = 
      elm.value.lastIndexOf(
       '\n', 
       elm.selectionEnd - 1 
      ) + 1; 
} 

function endKey(elm) { 
    var pos = elm.selectionEnd, 
     i = elm.value.indexOf('\n', pos); 
    if (i === -1) i = elm.value.length; 
    elm.selectionStart = elm.selectionEnd = i; 
} 

function arrowLeft(elm) { 
    elm.selectionStart = elm.selectionEnd -= 1; 
} 

function arrowRight(elm) { 
    elm.selectionStart = elm.selectionEnd += 1; 
} 

function arrowDown(elm) { 
    var pos = elm.selectionEnd, 
     prevLine = elm.value.lastIndexOf('\n', pos), 
     nextLine = elm.value.indexOf('\n', pos + 1); 
    if (nextLine === -1) return; 
    pos = pos - prevLine; 
    elm.selectionStart = elm.selectionEnd = nextLine + pos; 
} 

function arrowUp(elm) { 
    var pos = elm.selectionEnd, 
     prevLine = elm.value.lastIndexOf('\n', pos), 
     TwoBLine = elm.value.lastIndexOf('\n', prevLine - 1); 
    if (prevLine === -1) return; 
    pos = pos - prevLine; 
    elm.selectionStart = elm.selectionEnd = TwoBLine + pos; 
} 

प्रश्न: यह गलत हो जाता है?
ए: यदि लाइनों को लपेटने के लिए काफी लंबा समय है, तो यह उनके साथ व्यवहार करेगा जैसे कि अनचाहे। ब्राउज़र को

+0

ठीक प्राप्त कर सकते थे, मैं एक ही लग रहा है कि यह सुरक्षा कारणों के लिए जानबूझकर किया जा सकता था। क्यू/ए के रूप में: संपादन टेक्स्ट कोई समस्या नहीं है, समस्या "ऊपर", "डाउन", "होम" और जैसे अनुकरण करना है ... – lexasss

+0

यदि आप टेक्स्टरेरा को दोबारा बनाते हैं तो संभवतः लागू किया जा सकता है/एक ब्लॉक नोड के रूप में इनपुट जिसमें मिलानिंग रैपिंग, आकार और स्टाइल के साथ प्रत्येक वर्ण के लिए इनलाइन नोड्स होते हैं, फिर आप कहां समाप्त करना चाहते हैं, यह जानने के लिए सभी अलग-अलग संदर्भों की गणना करते हैं। मैं कल्पना नहीं कर सकता कि इसे कार्यान्वित करना आसान हो रहा है ... शायद एक क्लीनर तरीका एक मोनोस्पेस फ़ॉन्ट का उपयोग करेगा, जहां पिछला नया लाइन कैरेक्टर था और फिर वर्णों की गणना करें। –

+0

धन्यवाद। हालांकि, मैं google.com जैसे तीसरे पृष्ठों पर इनपुट अनुकरण करता हूं। मेरा वर्चुअल कीबोर्ड क्रोम एक्सटेंशन के रूप में कार्यान्वित किया गया है और उपयोगकर्ताओं को केवल इस कीबोर्ड का उपयोग करके किसी भी पेज पर फ़ॉर्म में टेक्स्ट टाइप और संशोधित करने में सक्षम होना चाहिए। अगर कुछ कार्यक्षमता को छोड़ दिया जाना चाहिए तो यह एक बड़ी निराशा होगी। – lexasss

0

भेजा जा रहा है कुंजी सेलेनियम के माध्यम से प्राप्त किया जा सकता: http://docs.seleniumhq.org/

यह प्रत्येक ब्राउज़र कि प्रोग्राम किया जा सकता के लिए एक ड्राइवर प्रदान करता है। यह आमतौर पर एक यूआरएल खोलने के साथ शुरू होता है तो आपकी स्क्रिप्ट ब्राउज़र पर रिमोट कंट्रोल के रूप में कार्य करेगी। इस प्रकार आप उन्हें सिमुलेट करने के बजाय वास्तविक कुंजी भेजने की अनुमति देते हैं जो ब्राउज़र के भीतर प्रोग्रामिक रूप से संभव नहीं है।

आप उदाहरण के लिए इस का उपयोग कर http://webdriver.io/

संबंधित मुद्दे