2012-04-12 23 views
8

इस jsFiddle देखें:अजीब व्यवहार

http://jsfiddle.net/nathanfriend/vAcpc/9/

ऐसा लगता है कि preventDefault() विधि (नोटिस टॉगल से क्लिक किया रेडियो बटन को नहीं रोकता है कि संदेश हमेशा कहता है "इसके रेडियो बटन की जांच की गई", इसके पूर्व राज्य के बावजूद)। हालांकि, ऑनक्लिक() विधि समाप्त होने के बाद, रेडियो बटन अपने शुरुआती राज्यों में वापस आते हैं (पहली बार रेडियो बटन का चयन किया जाता है)।

ऐसा लगता है कि preventDefault() वास्तव में रेडियो बटन को चेक करने से रोकता नहीं है, बल्कि बटनों के सेट को अपने पूर्व राज्य में वापस लौटकर काम करता है। क्या कोई इस व्यवहार को समझा सकता है? मैं रेडियो बटन को पूरी तरह से टॉगल होने से पूरी तरह से रोकने में सक्षम होना चाहता हूं - इस तरह से मैं यह देखने के लिए सटीक रूप से जांच कर सकता हूं कि रेडियो बटन उसकी ऑनक्लिक() विधि के अंदर चेक किया गया था या नहीं। कोई विचार?

उत्तर

9

असल में mousedown ईवेंट पहले निकाल दिया जाएगा और अपना रेडियो बटन जांचें। आप रेडियो बटन पर माउस बटन दबाकर आसानी से इसे सत्यापित कर सकते हैं। हालांकि, लगभग सभी जीयूआई तत्व केवल निष्पादित या परिवर्तित हो जाते हैं यदि mousedown और mouseup दोनों निकाल दिए जाते हैं और सफलतापूर्वक चलते हैं।

$(function() { 
    $('[name="test"]').each(function() { 
     $(this).mousedown(function(e) { 
      e.preventDefault(); 
      if ($(this).is(':checked')) { 
       alert('This radio button was checked in mousedown');     
      } else { 
       alert('This radio button was not checked in mousedown'); 
      }      
     }); 
     $(this).click(function(e) { 
      e.preventDefault(); 
      if ($(this).is(':checked')) { 
       alert('This radio button was checked'); 
      } else { 
       alert('This radio button was not checked'); 
      }      
     }); 
    });   
}); 

आप देख सकते हैं mousedown पहले निकाल दिया जाता है, और यह सूचित करेंगे 'यह रेडियो बटन mousedown में जाँच नहीं कर रहा था':

इस उदाहरण (demo) देखें। click ईवेंट को रोका गया है क्योंकि वास्तव में mouseup ईवेंट गंदा चेतावनी द्वारा रद्द कर दिया जाता है। हालांकि, अगर आप console.log का उपयोग करते हैं तो आप देखेंगे कि click अभी भी निष्पादित है और रेडियो बटन अभी भी वस्तुतः चेक किया गया है।

हालांकि, अगर आप check for active radio buttons पर ध्यान दें कि आप कोई भी सक्रिय नहीं हैं। click तत्व का व्यवहार कभी-कभी परेशान होता है, लेकिन e.preventDefault() यह काम करेगा, चिंता न करें।

+0

+1, व्यापक। – undefined

+0

बिल्कुल मुझे क्या पता होना चाहिए। धन्यवाद! –

+0

आप इसे सफारी 7 और क्रोम 33 पर तुलना कर सकते हैं। परिणाम अलग हैं और मुझे इसके लिए समस्याएं आ रही हैं। –