2013-03-27 14 views
7

ठीक है, ऐसा ही होता है।jQuery फायरिंग एक क्लिक के बिना घटना पर क्लिक करें

$('.js-custom-dropdown').find('.custom-dropdown-unfolded').toggle(); 
$('.custom-dropdown-btn, .custom-dropdown-btn-unfolded').keydown(function(event){ 
    if (event.keyCode === 13) { 
     openDropdown($(this)); 
    } 
}).click(function(){ 
    openDropdown($(this)); 
}); 

function openDropdown (element){ 
    element.parents('.js-custom-dropdown').find('.custom-dropdown-unfolded').toggle(); 
    console.log($(this)) 
} 

जब मैं ड्रॉप-डाउन बटन पर क्लिक करें, openDropdown समारोह एक बार निष्पादित किया जाता है, लेकिन जब मैं टैब बटन और प्रेस के लिए अपने रास्ते में प्रवेश, समारोह दो बार कहा जाता है। मान लीजिए कि चेनिंग के साथ कुछ करना है, लेकिन मैं मानता हूं कि मैं इसके लिए नया हूं और jQuery डिज़ाइन पैटर्न को पूरी तरह से समझ नहीं पा रहा हूं। मैं keydown हैंडलर में फ़ंक्शन को दो बार कॉल कर सकता हूं और इससे समस्या हल हो जाएगी, लेकिन .. आप जानते हैं :)

क्या आप कृपया बता सकते हैं कि कोड के साथ क्या गलत है और इस तरह के व्यवहार का कारण क्या है?

+1

यह है क्योंकि आप नहीं है:

$('.custom-dropdown-btn, .custom-dropdown-btn-unfolded').keydown(function (e) { if (e.keyCode === 13) { $(this).trigger('click'); e.preventDefault(); } }).click(function() { openDropdown($(this)); }); 

यहाँ एक सबूत अवधारणा-का-बेला है 2 इवेंट श्रोताओं के लिए - एक कुंजीडाउन के लिए (जो आप एंटर दबाते समय आग लगाएंगे) और दूसरा जब बटन क्लिक किया जाता है (जो मुझे लगता है कि जब आप एंटर दबाते हैं तो आप क्या कर रहे हैं) – Pete

उत्तर

4

यह एचटीएमएल 5 उपयोगकर्ता इंटरैक्शन विनिर्देशों के लिए नीचे है। यदि आप HTML spec for elements with a tabIndex पर एक नज़र डालेंगे तो आप पाएंगे कि किसी टैब तत्व के साथ किसी भी तत्व के लिए एंटर कुंजी एक क्लिक ईवेंट का कारण बनती है।

मुझे संदेह है कि इस व्यवहार का कारण क्या है। यह जांचने के लिए कि क्या यह मामला है, आप इसे पुराने (गैर-एचटीएमएल 5 अनुपालन) ब्राउज़र पर आज़मा सकते हैं।

संपादित करें (जैसा कि पोस्टर द्वारा अनुरोध किया गया है): answer given by @Terry आपके द्वारा जारी किए गए मुद्दे का समाधान करने का एक तरीका प्रदान करता है। ईवेंट पर jquery की "preventDefault" का उपयोग करके आप एंटर दबाते समय इसे दो बार हिट कर देंगे।

+0

धन्यवाद, ऐसा लगता है कि यह सही है जवाब। मैंने आईई 7 में पेज का परीक्षण किया है, और मैं एंटर कुंजी के साथ ड्रॉपडाउन खोलने में सक्षम था। हालांकि मुझे जेएस कंसोल के लिए एसेस नहीं था। हालांकि, क्या आप कृपया एक तरीका सुझा सकते हैं कि मैं इसे सभी ब्राउज़रों में काम करने के लिए कर सकता हूं? –

+0

मैं आपका उत्तर स्वीकार करूंगा क्योंकि यह मेरे द्वारा पोस्ट किए गए प्रश्न का उत्तर देता है, फिर भी आप कोड के साथ दूसरे को उद्धृत कर सकते हैं? –

1

आप का उपयोग keydown पर क्लिक करें घटना को गति प्रदान कर सकते हैं: $(this).trigger('click');, और keydown पर डिफ़ॉल्ट कार्रवाई को रोकने: http://jsfiddle.net/yTuR3/

+0

e.preventDefault() पर्याप्त है। आपके सहयोग के लिए धन्यवाद –

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