2010-03-24 11 views
5

मैं अपने मित्र का कोड यहां दिखाई दे रही है ...आईई एक क्षेत्र

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML> 
<HEAD> 
<TITLE> Check action </TITLE> 

<script> 

    function detectEvent(){ 
    if(window.event.keyCode==13) 
     { 
      alert("you hit return!"); 
     } 

    } 
</script> 


</HEAD> 

<BODY> 
    <form name="name1" onkeyup="detectEvent()" action="page2.html"> 
     <p> Field1 
      <input type="text" id="text1"/> 
     </p> 
    </form> 
</BODY> 
</HTML> 

साथ एक फार्म पर कुंजीपटल घटना को ट्रिगर नहीं और जब वह पाठ बॉक्स में मान दर्ज करने की कोशिश की और दबाया दर्ज करते हैं, यह फोन नहीं किया detectEvent()। मैंने कहा, यह हमेशा ..... बटन दर्ज पर ऑनसबमिट फोन करता हूँ और उसने मुझे हैरान कर दिया,

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML> 
<HEAD> 
<TITLE> Check action </TITLE> 

<script> 

    function detectEvent(){ 
    if(window.event.keyCode==13) 
     { 
      alert("you hit return!"); 
     } 

    } 
</script> 


</HEAD> 

<BODY> 
    <form name="name1" onkeyup="detectEvent()" action="page2.html"> 
     <p> Field1 
      <input type="text" id="text1"/> 
     </p> 
     <p> Field1 
      <input type="text" id="text2"/> 
     </p> 
    </form> 
</BODY> 
</HTML> 

अब एंटर दबाएं, समारोह कहा जाता हो जाता है ..... क्यों इतने !?

क्यों ऑनकेप सिर्फ एक फ़ील्ड के साथ फॉर्म पर नहीं बुलाया जाता है !!! !!! क्या मैं कुछ भूल रहा हूँ?

उत्तर

6

घटनाओं का क्रम है:

keydown 
keypress 
submit 
keyup 
समय अपने keyup हैंडलर हैं बुलाया गया है द्वारा

तो, प्रपत्र पहले से ही प्रस्तुत करने शुरू कर दिया है। यदि स्थानीय फाइल सिस्टम पर action फॉर्म page2.html है, तो यह बहुत तेज़ी से नेविगेट करने जा रहा है और keyup से पहले पृष्ठ से दूर हो सकता है; दूसरी ओर, action को बाहरी साइट पर सेट करें, और keyup में आग लगने का समय होगा।

दूसरा इनपुट फ़ील्ड जोड़ना एक अलग मुद्दा है: इस मामले में फॉर्म बिल्कुल सबमिट नहीं किया गया है। यह एक उत्सुक ऐतिहासिक क्विर्क है कि ब्राउज़र एक फॉर्म सबमिट करेंगे जिसमें केवल एक इनपुट होगा और कोई सबमिट बटन नहीं होगा, लेकिन एक से अधिक इनपुट के साथ फॉर्म सबमिट करने से इंकार कर दिया है, और कोई सबमिट बटन नहीं है। इस HTML 2.0 कल्पना करने के लिए वापस चला जाता है:

जब केवल एक एकल लाइन एक रूप में पाठ इनपुट क्षेत्र है, उपयोगकर्ता एजेंट प्रपत्र प्रस्तुत करने के लिए एक अनुरोध के रूप कि क्षेत्र में दर्ज करें को स्वीकार करना चाहिए।

HTML 2.0 निर्दिष्ट नहीं किया है या नहीं, दर्ज किसी भी अन्य परिस्थितियों में एक फार्म जमा करने के लिए स्वीकार किया जाना चाहिए (इरादा लगता है केवल प्राचीन <isindex> तत्व की कार्यक्षमता को नकल करने के लिए किया गया है), लेकिन के ब्राउज़रों ऐसा लगता है कि दिन का अर्थ यह है कि एंटर-सबमिशन ऐसा नहीं होना चाहिए जहां कई फ़ील्ड हों, लेकिन फिर कोई भी सबमिट बटन वैसे भी एंटर-सबमिशन होने का कारण बनता है। आईई और अन्य बाद के ब्राउज़र ने इस अजीब व्यवहार की प्रतिलिपि बनाई।

असंबद्ध बिंदु: window.event पर निर्भरता कोड को केवल आईई-केवल बनाता है। अन्य सभी ब्राउज़रों के लिए, ईवेंट ऑब्जेक्ट को ईवेंट हैंडलर फ़ंक्शन के लिए तर्क के रूप में पारित किया जाता है। आप HTML में onkeyup="detectEvent(event)" कर सकते हैं और फिर detectEvent फ़ंक्शन में उस तर्क का उपयोग कर सकते हैं, जो दोनों मॉडलों पर काम करता है क्योंकि स्थानीय तर्क event या वैश्विक window.event का उपयोग किया जाता है। लेकिन हमेशा की तरह विधि के लिए JavaScript से ईवेंट हैंडलर विशेषता खो देते हैं और आवंटित करने के लिए होगा:

<form action="page2.html" id="enterform"> 
    <p> Field1 
     <input type="text" id="text1"> 
     <!-- Note: *no* trailing slash - the doctype says HTML4, not XHTML --> 
    </p> 
</form> 

<script type="text/javascript"> 
    document.getElementById('enterform').onkeyup= function(event) { 
     if (event===undefined) event= window.event; // for IE 
     if (event.keyCode===13) 
      alert('You pressed Enter'); 
    }; 
</script> 

कि सभी ने कहा करने के बाद ... मैं कुंजी दर्ज फँसाने के आम तौर पर संदिग्ध हूँ। मुझे पूरा यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं, लेकिन यदि किसी रूप में डिफ़ॉल्ट बटन को बदलने का यह सामान्य मामला है तो यह निश्चित रूप से ऐसा करने का तरीका नहीं है और समस्याओं का वर्गीकरण करेगा। किसी भी फॉर्म पर .submit() पर कॉल करने के लिए एंटर कुंजी को फँसाने का कोई अच्छा कारण नहीं है।

+0

मैं आपके उत्तर से सहमत हूं, आमतौर पर आपको केवल एक सबमिट हैंडलर होना चाहिए जो फ़ॉर्म को जमा नहीं किया जाना चाहिए। हालांकि, मैं बहुत सारे AJAX कोड लिखता हूं जो केवल फॉर्म सबमिट नहीं करता है और पृष्ठ को रेड्रेस करता है। तो, डिज़ाइन के बारे में चिंता किए बिना, बॉबन्स को यह सही मिला, आपको कुंजीडाउन ईवेंट के लिए सूचीबद्ध करने की आवश्यकता है, क्योंकि जब सबमिट ईवेंट निकाल दिया जाता है तो महत्वपूर्ण ईवेंट रद्द हो जाता है –

+0

@bobince बहुत बहुत धन्यवाद! जो व्यवहार को बताता है .. * लेकिन दिन के ब्राउज़रों ने व्याख्या की है कि इसका अर्थ यह है कि एंटर-सबमिशन ऐसा नहीं होना चाहिए जहां कई फ़ील्ड हों, लेकिन फिर कोई सबमिट बटन वैसे भी एंटर-सबमिशन होने का कारण बनता है। आईई और अन्य बाद के ब्राउज़र ने इस अजीब व्यवहार की प्रतिलिपि बनाई। * क्रोम के साथ मामला नहीं। .. क्रोम प्रवेश बटन पर फॉर्म जमा करता है। – raj

+0

मैं एचटीएमएल कार्यक्रमों की प्राथमिकता के बारे में और कहाँ जान सकता हूं ..? W3schools प्राथमिकताओं के बारे में बात नहीं कर रहे हैं। – raj

2

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

समाधान = कुंजीपटल या कीडाउन का उपयोग करें।

+0

मैं केवल आईई के लिए कोडिंग कर रहा हूं। लेकिन हाँ, मेरे दोस्त ने कल क्रोम में व्यवहार का परीक्षण किया, यह कुंजीडाउन घटना नहीं पकड़ा। – raj