2009-08-06 14 views
16

मैं एक HTML प्रपत्र पर एक साधारण लिस्टबॉक्स और यह बहुत ही बुनियादी jQuery कोडघटना Jquery लिस्टबॉक्स बदलें कीबोर्ड स्क्रॉल

//Toggle visibility of selected item 
    $("#selCategory").change(function() { 
     $(".prashQs").addClass("hide"); 
     var cat = $("#selCategory :selected").attr("id"); 
     cat = cat.substr(1); 
     $("#d" + cat).removeClass("hide"); 
    }); 

परिवर्तन घटना ठीक आग मिल गया है पर आग नहीं करता है माउस, लेकिन जब मैं कीबोर्ड का उपयोग करके आइटम को स्क्रॉल करता हूं तो ईवेंट को निकाल दिया नहीं जाता है और मेरा कोड कभी निष्पादित नहीं होता है।

क्या इस व्यवहार के लिए कोई कारण है? और कामकाज क्या है?

उत्तर

21

onchange घटना आम तौर पर गोली चलाई नहीं है जब तक तत्व ध्यान केंद्रित खो देता है। आप onkeypress का उपयोग भी करना चाहेंगे। हो सकता है कि कुछ इस तरह:

var changeHandler = function() { 
    $(".prashQs").addClass("hide"); 
    var cat = $("#selCategory :selected").attr("id"); 
    cat = cat.substr(1); 
    $("#d" + cat).removeClass("hide"); 
} 

$("#selCategory").change(changeHandler).keypress(changeHandler); 

आप दोनों माउस और कीबोर्ड बातचीत क्रमशः के लिए खाते onchange और onkeypress दोनों चाहता हूँ।

+0

लेकिन मुझे यह पता चला कि इस मामले में फ़ायरफ़ॉक्स को छोड़कर किसी भी ब्राउज़र में काम नहीं कर रहा है, मैंने क्रोम, सफारी और आईई पर परीक्षण किया और काम नहीं किया। –

+0

'कीप्रेस' घटना क्रोम पर काम नहीं करती है लेकिन 'keyup' सही ढंग से काम करती है –

4

कभी कभी परिवर्तन व्यवहार ब्राउज़र प्रति अलग हो सकता है, तो आप कुछ इस तरह कर सकता है एक समाधान के रूप:

//Toggle visibility of selected item 
    $("#selCategory").change(function() { 
     $(".prashQs").addClass("hide"); 
     var cat = $("#selCategory :selected").attr("id"); 
     cat = cat.substr(1); 
     $("#d" + cat).removeClass("hide"); 
    }).keypress(function() { $(this).change(); }); 

आप श्रृंखला जो कुछ घटनाओं आप चाहते हैं कर सकते हैं और मैन्युअल रूप से परिवर्तन घटना आग।

आईई:

var changeMethod = function() { $(this).change(); }; 
....keypress(changeMethod).click(changeMethod).xxx(changeMethod); 
+0

आपको यह कहना सही है कि यह क्रॉस ब्राउज़र असंगतता के कारण है। –

1

व्यवहार आप का वर्णन है, परिवर्तन कुंजीपटल-चुने तत्व में स्क्रॉल करके ट्रिगर घटना है, वास्तव में एक इंटरनेट एक्सप्लोरर बग है। DOM Level 2 Event विनिर्देश इस रूप में change घटना परिभाषित करता है:

परिवर्तन घटना तब होता है जब एक नियंत्रण इनपुट फ़ोकस खो देता है और अपने मूल्य फोकस पाने के बाद से संशोधित किया गया है। यह घटना INPUT, SELECT, और टेक्स्टटेरा के लिए मान्य है। तत्व।

यदि आप वास्तव में यह व्यवहार चाहते हैं, तो मुझे लगता है कि आपको कीबोर्ड ईवेंट देखना चाहिए।

$("#selCategory").keypress(function (e) { 
    var keyCode = e.keyCode || e.which; 
    if (keyCode == 38 || keyCode == 40) { // if up or down key is pressed 
    $(this).change(); // trigger the change event 
    } 
}); 

चेक एक उदाहरण here ...

+0

फिर मैं इस व्यवहार को फ़ायरफ़ॉक्स में कैसे उत्पन्न कर सकता हूं? मैं चाहता हूं कि मेरी सामग्री को सूचीकरण पर अपडेट किया जाए, जबकि फोकस अभी भी बॉक्स पर है। –

+3

+1 मुझे बदलने के अलावा समाधान उपयोग कीपअप घटना मिली। –

+0

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

0

मुझे JQuery 1.4.1 के तहत आईई के साथ यह समस्या थी - कीबोर्ड बदलने के लिए कीबोर्ड का उपयोग किया गया था, तो कॉम्बो बॉक्स पर घटनाओं को बदलना नहीं था।

JQuery 1.4.2 में तय किया गया लगता है।

0
$('#item').live('change keypress', function() { /* code */ }); 
+1

' लाइव' बहिष्कृत है। इसके बजाए 'on' का प्रयोग करें, और यदि आप jQuery 1.7 या ऊपर का उपयोग नहीं कर रहे हैं, तो 'प्रतिनिधि' का उपयोग करें। –

+0

@ जेम्ससवर्डिस धन्यवाद :) –

+1

आपका स्वागत है :) अधिक जानकारी के लिए http://liveisdeprecated.com देखें –

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