2009-10-28 10 views
9

मेरे पास एक बटन और निम्न जावास्क्रिप्ट दिनचर्या है।कुंजीडाउन कॉलबैक में झूठी वापसी क्यों बटन क्लिक ईवेंट को रोक नहीं देती है?

$("button").keydown(function(key) { 
    switch(key.keyCode) { 
    case 32: //space 
    return false; 
    } 
}); 

के रूप में मैं यह समझा, return false; कार्रवाई की जा रही से कुंजी दबाने बंद कर देंगे। तो $("button").click(); नहीं कहा जाएगा। अन्य कीकोड्स के लिए यह अपेक्षा के अनुसार काम करता है। उदाहरण के लिए यदि मैं 40 को अवरुद्ध करता हूं, जो नीचे बटन है, तो पृष्ठ स्क्रॉल नहीं कर रहा है।

मैंने इस व्यवहार को फ़ायरफ़ॉक्स में देखा।

return false; स्थान पर बटन क्लिक ईवेंट को क्यों नहीं रोकता है? इस बारे में जावास्क्रिप्ट स्पेक क्या कहता है?

+1

क्या यह वास्तव में आपके वास्तविक कोड में "वापसी विफल" कहता है? यदि ऐसा है, तो यह आपकी समस्या हो सकती है। फाले। – rmeador

+0

अपने कोड स्निपेट में आपके पास "वापस लौटना है;" - क्या यह कोड मौजूद है? यदि ऐसा है तो यह एक सादा टाइपो है। – artlung

+0

नहीं, मेरा असली कोड झूठा लौटाता है। मैं वास्तव में नीचे दिए गए अन्य बटनों को रोकने के लिए इस कोड का उपयोग करता हूं, और यह उनके लिए काम करता है। – johannes

उत्तर

13

आशा यह आपके सवाल का जवाब एचटीएमएल में किसी इवेंट हैंडलर एट्रिब्यूट के अंत में कॉल किए जाने पर ब्राउज़र में एक ईवेंट। जहां तक ​​मुझे पता है कि यह व्यवहार औपचारिक रूप से कहीं भी निर्दिष्ट नहीं है।

आप के बजाय डोम तत्व (जैसे button.onkeydown = function(evt) {...}) या का उपयोग करने पर एक ईवेंट हैंडलर संपत्ति के माध्यम से एक घटना को सेट करते हैं addEventListener/attachEvent (जैसे button.addEventListener("keydown", function(evt) {...}, false)) तो सिर्फ इतना है कि समारोह से लौट रहे false हर ब्राउज़र में काम नहीं करता है और आपको बस इतना करना returnValue और preventDefault() मेरे अन्य उत्तर से सामान। preventDefaultDOM 2 spec में निर्दिष्ट है और अधिकांश मुख्यधारा के आधुनिक ब्राउज़रों द्वारा कार्यान्वित किया गया है। returnValue आईई-विशिष्ट है।

+0

मेरे एएसपीनेट फॉर्म में, यह अभी भी पेज रीफ्रेश को बंद कर देता है। – Si8

+1

@ Si8: यह तब हो सकता है जब उपरोक्त 'doOtherStuff() 'के बराबर एक त्रुटि फेंकता है। –

6

सबसे पहले, यदि आप अंतरिक्ष जैसे प्रिंट करने योग्य चरित्र का पता लगा रहे हैं, तो आप keypress ईवेंट से बेहतर होंगे। दूसरा, डिफ़ॉल्ट कार्रवाई को रोकने का तरीका गैर-आईई ब्राउज़र में ईवेंट पर preventDefault() पर कॉल करना है और आईई में ईवेंट की returnValue संपत्ति false पर सेट करें।

var button = document.getElementById("button"); 
button.onkeypress = function(evt) { 
    evt = evt || window.event; 
    var charCode = evt.keyCode || evt.which; 
    if (charCode == 32) { 
     if (evt.preventDefault) { 
      evt.preventDefault(); 
     } else { 
      evt.returnValue = false; 
     } 
    } 
}; 

मैं एक jQuery विशेषज्ञ नहीं हूँ और मैं इसे आप के लिए घटना प्राप्त करने का ख्याल रखता है मान:

<input type="button" value="Press" onkeydown="doOtherStuff(); return false;"> 

return false; सफलतापूर्वक रद्द:

$("button").keypress(function(evt) { 
    var charCode = evt.keyCode || evt.which; 
    if (charCode == 32) { 
     if (evt.preventDefault) { 
      evt.preventDefault(); 
     } else { 
      evt.returnValue = false; 
     } 
    } 
}); 
+0

मैंने इसका परीक्षण किया, और 'key.preventDefault();' फ़ायरफ़ॉक्स में कुछ भी नहीं बदलता है। 'कीडाउन' कुंजी का पता लगाता है, जो प्रिंट करने योग्य पात्रों का उत्पादन करता है, तो 'कीडाउन' के साथ क्या गलत है? – johannes

+0

ठीक है। एचटीएमएल क्या है जो बटन उत्पन्न करता है? क्या आप वाकई कीप्रेस हैंडलर कह रहे हैं? अंतरिक्ष के मामले में, संभवतः आप 'कीडाउन' और' कीकोड '32 का उपयोग करने के लिए ठीक हैं, लेकिन सामान्य रूप से' कीप्रेस 'एब्स्ट्रैक्ट्स का उपयोग करके प्रिंट करने योग्य वर्णों के साथ कुंजीपटल या अन्य इनपुट उपकरणों के बीच किसी भी संभावित अंतर को दूर करने के परिणामस्वरूप एक इनपुट डिवाइस पर एक कुंजी के अनुरूप एक कोड के बजाय कीप्रेस। –

+0

@Tim: ओपी मूल कोड नमूना घटना रद्द करने के लिए वैध jQuery है।इस मामले में सामान्य क्रॉस-ब्राउज़र कोड स्विचिंग में से कोई भी आवश्यक नहीं है। –