2008-12-17 8 views
5

इस नमूना कोड पर विचार करें:क्या आप इंटरनेट एक्सप्लोरर पर इन रेडियो बटन घटनाओं को जाल कर सकते हैं?

<div class="containter" id="ControlGroupDiv"> 
    <input onbeforeupdate="alert('bingo 0'); return false;" onclick="alert('click 0');return false;" id="Radio1" type="radio" value="0" name="test" checked="checked" /> 
    <input onbeforeupdate="alert('bingo 1'); return false;" onclick="alert('click 1');return false;" id="Radio2" type="radio" value="1" name="test" /> 
    <input onbeforeupdate="alert('bingo 2'); return false;" onclick="alert('click 2');return false;" id="Radio3" type="radio" value="2" name="test" /> 
    <input onbeforeupdate="alert('bingo 3'); return false;" onclick="alert('click 3');return false;" id="Radio4" type="radio" value="3" name="test" /> 
    <input onbeforeupdate="alert('bingo 4'); return false;" onclick="alert('click 4');return false;" id="Radio5" type="radio" value="4" name="test" /> 
    <input onbeforeupdate="alert('bingo 5'); return false;" onclick="alert('click 5');return false;" id="Radio6" type="radio" value="5" name="test" /> 
</div> 

Firefox 2 और 3 पर, परिवर्तित करने से यह मूल्य से बचाता है एक रेडियो बटन को क्लिक घटना पर return false डालने और समूह में अन्य सभी रेडियो बटन। यह प्रभावी रूप से इसे अक्षम किए बिना और इसे भूरे रंग के बिना पढ़ता है।

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

According to MSDN, onbeforeupdate घटना क्लिक घटना से पहले नियंत्रण समूह में सभी नियंत्रणों पर आग लगती है और मुझे लगता है कि अन्य रेडियो बटन को साफ़ किया जा रहा था। लेकिन अगर आप ऊपर दिए गए कोड को आजमाते हैं, तो onbeforeupdate ईवेंट से कभी भी कोई अलर्ट नहीं दिखाया जाता है - आपको बस इवेंट अलर्ट क्लिक करें। जाहिर है कि घटना कभी नहीं निकाल दी जा रही है या इसे फंसाने का कोई तरीका नहीं है।

क्या कोई ऐसी घटना है जिसे आप जाल कर सकते हैं जिससे आप समूह में अन्य रेडियो बटन को साफ़ करने से रोक सकते हैं?

ध्यान दें कि यह एक सरलीकृत उदाहरण है, हम वास्तव में ईवेंट हैंडलर सेट करने और इसे संभालने के लिए jQuery का उपयोग कर रहे हैं।

अद्यतन:

आप रेडियो बटन से एक के लिए इस घटना को जोड़ते हैं:

onmousedown="alert('omd'); return false;" 

चेतावनी बॉक्स पॉप अप होता है, आप इसे बंद करो, और क्लिक करें घटना कभी नहीं आग। तो हमने सोचा कि हमने यह पता लगाया था, लेकिन नहीं, यह इतना आसान नहीं हो सकता था। यदि आप अलर्ट हटाते हैं और इसे बदलते हैं:

onmousedown="return false;" 

यह काम नहीं करता है। अन्य रेडियो बटन साफ़ हो जाते हैं और आपके द्वारा आग पर क्लिक किए गए बटन पर क्लिक ईवेंट। onbeforeupdate अभी भी कभी नहीं आग लगती है।

हमने सोचा कि यह समय किया जा सकता है (कि हमेशा एक सिद्धांत है, भले ही यह शायद ही कभी सच है), इसलिए मैं इस कोशिश की:

onmousedown="for (i=0; i<100000; i++) {;}; return false;" 

आप क्लिक करें, यह थोड़ी देर के लिए रुक जाता है, तो अन्य रेडियो बटन साफ ​​करता है और फिर क्लिक घटना आग लगती है। Aaargh!

अद्यतन:

इंटरनेट एक्सप्लोरर बेकार है। जब तक कि कोई अच्छा विचार न आए, हम इस दृष्टिकोण को छोड़कर चेकबॉक्स jQuery एक्सटेंशन के साथ जा रहे हैं जो हम चाहते हैं जो करता है, लेकिन पृष्ठ पर भारी क्लाइंट-साइड स्क्रिप्ट बोझ डालता है और HTML के अधिक रिकोडिंग की आवश्यकता होती है एएसपी.Net सर्वर नियंत्रण प्रतिपादन और मास्टर पेज नाम मैंगलिंग।

उत्तर

0

इनमें से कोई भी दृष्टिकोण काम नहीं करता - हम चेकबॉक्स jQuery प्लग-इन का उपयोग करके घायल हो गए हैं जो चेकबॉक्स और रेडियो बटन को स्थानांतरित छवियों के साथ बदल देता है। इसका मतलब है कि हम अक्षम नियंत्रणों के दृश्य को नियंत्रित कर सकते हैं।

पिटा लेकिन यह काम करता है।

2

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

<form name="f1"> 
<input type=radio onmouseover="recordMe()" onclick="clickCheck();return false" checked value="A" name="r1" id="radio1" /> 
<input type=radio onmouseover="recordMe()" onclick="clickCheck();return false" value="B" name="r1" id="radio2" /> 
</form> 
<script type="text/javascript"> 
function recordMe() { 
    for(var x=0;x<document.f1.r1.length;x++) { 
     if(document.f1.r1[x].checked) { 
      $(document.f1.r1[x].id).addClassName('radioChecked') 
     } 
    } 
} 
function clickCheck() { 
    for(var x=0;x<document.f1.r1.length;x++) { 
     if($(document.f1.r1[x].id).hasClassName('radioChecked')) { 
      $(document.f1.r1[x].id).checked=true 
     } 
    } 
} 
</script> 
0

आपका लक्ष्य क्या है? यदि आप परिवर्तन करते समय कैप्चर करना चाहते हैं, तो अपने तर्क को ऑनक्लिक ईवेंट पर चलाएं। (यह आईई के बग के बदले में होगा)

यदि आप रेडियो बटन के अपेक्षित व्यवहार को बदलने की कोशिश कर रहे हैं - तो मैं इसके खिलाफ अत्यधिक अनुशंसा करता हूं।

+0

एकमात्र चीज जिसे हम करने का प्रयास कर रहे हैं, ग्राहक अनुरोध द्वारा, ग्रे रेडियो अक्षम रेडियो बटन और चेकबॉक्स नहीं है। यह सभी ब्राउज़रों पर सभी चेकबॉक्सों और आईई (बेशक) को छोड़कर सबकुछ पर सभी रेडियो बटनों के लिए एक त्वरित और आसान समाधान था। – CMPalmer

+0

हेहे, मुझे ग्राहक अनुरोध पसंद है! - मुझे वह चीज़ चाहिए जो मुझे क्लिक करने के लिए क्लिक करने की अनुमति नहीं है जिसे मैं क्लिक कर सकता हूं। - कुछ समझ नहीं आया! ;-) – scunliffe

+0

एह, इस मामले में मैं बहुत ज्यादा बहस नहीं कर सकता। ग्रे किए गए चेक किए गए बक्से पढ़ने के लिए कठिन हैं और फ़ायरफ़ॉक्स/आईई संबंधित लेबलों को अलग-अलग तरीकों से प्रस्तुत करते हैं (जिसमें भूरे रंग के पाठ को छेड़छाड़ किए गए "3 डी" में बदलने के आईई के वास्तव में कष्टप्रद तरीके शामिल हैं जो सफेद लेकिन कुछ भी के खिलाफ बकवास की तरह दिखता है। – CMPalmer

1

मुझे यह समस्या भी थी। वर्तमान में हम jquery को लागू करते हैं, इसलिए मैंने इसे उपयुक्त एक को फिर से जांचने के लिए उपयोग किया। स्पष्ट रूप से आपको चेकबॉक्स की संपत्ति सेट करने के लिए jquery की आवश्यकता नहीं है।

function something(type){//type can be 1 or 0 
    if(confirm("You will lose all unsaved changes. Continue?")){ 
    //Do stuff 
      switch(type){ 
       case 1: 
       break; 
       case 0; 
       break; 
       default: 
       //nothing; 
       break; 
      }//!End of switch 
     }else{//They clicked canel 
     //Reset checkboxes in IE 
      if(type==1){$('#IDofCheckbox1').attr('checked', true);} 
      else{$('#IDofCheckbox2').attr('checked', true);} 
     }//!End of if they clicked cancel 
0

इसके बजाय return false को onclick विशेषता सेटिंग की, आप disabled को अचयनित रेडियो बटन सेट कर सकते हैं। यह आपको वही प्रभाव देता है, सिवाय इसके कि गैर-चयनित रेडियो बटन ग्रे हो जाएंगे।

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