2011-08-23 13 views
5

मेरे पास एक जावास्क्रिप्ट फ़ंक्शन है जो 'डाउन' कुंजी दबाए जाने पर चलता है। मैं चाहूंगा, कि यदि 'डाउन' कुंजी दबाई जाती है, तो फ़ंक्शन बिल्कुल नहीं चलेंगे।कुंजी दबाए गए और कुंजी के बीच अंतर

मैंने टाइमडाउन और कीप के बीच समय के बारे में सोचा, यदि समय 1 सेकंड से कम है तो फ़ंक्शन कीप पर चल जाएगा। समस्या यह है कि, यदि मैं कुंजी को पकड़ता हूं तो ब्राउज़र इसे उत्तराधिकार में कई बार दबाए जाने की कुंजी के रूप में देखता है।

क्या ऐसा करने का कोई बेहतर तरीका है?

धन्यवाद

+1

संदर्भ क्या है?यदि आप टेक्स्टबॉक्स में हैं, तो क्या अंतिम कुंजी प्रेस से पहले इनपुट के मान को ट्रैक करना समझदारी होगी, फिर यह देखने के लिए जांचें कि अगली कुंजी अप ईवेंट पर एकाधिक वर्ण जोड़े गए हैं या नहीं? बस चारों ओर मछली पकड़ना ... – Guttsy

+1

क्या आप पहली ''कीडाउन'' घटना को आग लगते हैं (लेकिन यह पहले से सेट नहीं होने पर) ध्वज सेट कर सकता है (लेकिन एक बूलियन वैरिएबल), और जब 'कीप' की आग लगती है तो इसे अनसेट करें? –

उत्तर

1

तो मैं समझता हूँ कि आपकी समस्या यह है कि आपके ब्राउज़र की व्याख्या एक महत्वपूर्ण कई keydown घटनाओं के रूप में आयोजित किया जा रहा है। यदि आप आसानी से दबाए जाने पर बनाम कुंजी बनाते हैं तो आप कुछ अलग होना चाहते हैं; और आप चाहते हैं कि वह अंतर कुछ समय पर आधारित हो जो आपको लगता है कि कुंजी को "होल्डिंग" करना चाहिए। तो आपको कुंजीपटल ईवेंट को ट्रैक करके एक होल्ड और एक प्रेस के बीच अंतर करने की आवश्यकता है।

keydown पर::

if !yourBool 
    start timer 

yourBool = true 
KeyUp पर

: निम्नलिखित स्यूडोकोड इस समस्या को हल करेंगे

if timer < yourTime 
    do something 

yourBool = false 

इसका कारण यह है कि जब तक KeyUp घटना हुई है टाइमर को पुनः आरंभ नहीं होगा काम करेंगे।

अब ... अपने ब्राउज़र के रूप कुंजी धारण की व्याख्या करता है, तो:
keydown, KeyUp, keydown, KeyUp .......
तो आप इस दृष्टिकोण के साथ एक समस्या है।

0

शायद आप keydown पर एक काउंटर को गति प्रदान और फिर अगले KeyUp को सुन सके। जैसे ही काउंटर पांच सेकंड से अधिक हो जाता है, या फिर आप जितना अधिक समय लेते हैं, आप फ़ंक्शन शुरू कर सकते हैं। सही बात?

0

लगातार कीडडाउन एक कीप नहीं आग लगेंगे, इसलिए उनके बीच अंतर करना संभव है।

http://jsfiddle.net/pimvdb/xMFGQ/

$('body').keydown(function() { 
    if(!$(this).data('timeDown')) { // if not pressed yet, save time 
     $(this).data('timeDown', +new Date); 
    } 
}).keyup(function() { 
    var diff = new Date - $(this).data('timeDown'); // time difference 
    if(diff < 1000) { // less than one second 
     alert(123); 
    } 
    $(this).data('timeDown', null); // reset time 
}); 
0

ब्राउज़र को कई बार दबाए जाने की कुंजी दिखाई देती है लेकिन keydown ईवेंट केवल पहली प्रेस पर होता है।

आप जो चाहते हैं उसे keydown ईवेंट से समय और keypressed से नहीं करना है।

2

मैंने अभी इस छोटी सी लिपि को लिखा है जो एक कुंजी दबाए गए और 200 मिलीसेकंड के लिए एक प्रमुख समूह के बीच अंतर करता है। शायद आप इसका इस्तेमाल कर सकते हैं:

document.onkeydown = function(e){ 
    var keycode = window.event ? window.event.keyCode : e.which; 
    if(keycode == 40){ 
     var timer = setTimeout(function(){ 
      alert('Down key held'); 
      document.onkeyup = function(){}; 
     }, 200); 
     document.onkeyup = function(){ 
      clearTimeout(timer); 
      alert('Down key pressed'); 
     } 
    } 
}; 

JSFiddle

0

मैं एक ऐसी ही समस्या थी। मैं सभी "पहली" कीडाउन घटनाओं को कैप्चर करना चाहता था, लेकिन अगर वे एक कुंजी के परिणामस्वरूप होते थे तो लगातार घटनाओं को अनदेखा करते थे। सुनिश्चित नहीं है कि आप यही चाहते हैं, लेकिन यहां एक दृष्टिकोण है:

var repeat = false; 
el.addEventListener("keyup", function() { repeat = false; }); 
el.addEventListener("keydown", function() { 
    if (!repeat) { 
    // Run your code. 
    repeat = true; 
    } 
}); 
संबंधित मुद्दे