2009-04-25 15 views
16

पर क्लिक करके टेक्स्टरेरा से डेटा सबमिट करना मेरे पास जेएस के साथ गतिशील वेब पेज है। textarea और बटन भेजें, लेकिन फॉर्म टैग नहीं है। मैं कैसे कर सकता हूँ बटन आग जमा करें और पाठ क्षेत्र को मंजूरी दे दी हो जब दर्जपाठ क्षेत्र में दबाया जाता है?"एंटर"

+0

मुझे आपको गुमराह करने के लिए खेद है। मैंने टेक्स्टरेरा पढ़ा लेकिन इनपुट प्रकार = "टेक्स्ट" सोचें ...... मेरे क्रैपी उत्तर को हटाया गया :) –

+0

लोग पूछ रहे हैं कि textarea के बजाय इनपुट [टेक्स्ट] का उपयोग क्यों न करें। मेरे लिए, कारण यह है कि मैं उपयोगकर्ता को टेक्स्ट की केवल एक पंक्ति दर्ज करने की अनुमति देना चाहता हूं, लेकिन मैं टेक्स्ट को कई पंक्तियों पर लपेटना चाहता हूं। इनपुट [टेक्स्ट] "अव्यवस्थित" पैराग्राफ के लिए –

उत्तर

26

आप टेक्स्टरेरा के लिए एक कीप हैंडलर का उपयोग कर सकते हैं (हालांकि मैं इसके खिलाफ सलाह दूंगा *)।

[SomeTextarea].onkeyup = function(e){ 
    e = e || event; 
    if (e.keyCode === 13) { 
    // start your submit function 
    } 
    return true; 
} 

* क्यों इस के लिए एक पाठ इनपुट क्षेत्र का उपयोग नहीं? Textarea multiline इनपुट के लिए विशेष रूप से उपयुक्त है, एकल लाइन इनपुट के लिए एक पाठ इनपुट फ़ील्ड। एक एंटर हैंडलर के साथ आप मल्टीलाइन इनपुट को क्रिप्ल करते हैं। मुझे एक बार XHR (उर्फ AJAX) चैट एप्लिकेशन के लिए इसका उपयोग करना याद है (इसलिए टेक्स्टरेरा एक एमएसएन इनपुट क्षेत्र की तरह व्यवहार करता है), लेकिन नई लाइनों के लिए CTRL-enter कुंजी का उपयोग करके मल्टीलाइन इनपुट को फिर से सक्षम किया गया। क्या यह आपके लिए एक विचार हो सकता है? श्रोता इस तरह बढ़ाया जा होगा:

जावास्क्रिप्ट में:

function isEnterPressed(e){ 
var keycode=null; 
if (e!=null){ 
    if (window.event!=undefined){ 
     if (window.event.keyCode) keycode = window.event.keyCode; 
     else if (window.event.charCode) keycode = window.event.charCode; 
    }else{ 
     keycode = e.keyCode; 
    } 
} 
return (keycode == 13);} 

एचटीएमएल में:

[SomeTextarea].onkeyup = function(e){ 
    e = e || event; 
    if (e.keyCode === 13 && !e.ctrlKey) { 
    // start your submit function 
    } 
    return true; 
} 
+0

अच्छा लग रहा है, धन्यवाद। आपको लाइन * ई = ई || की क्या ज़रूरत है घटना; * के लिए? – Alex

+7

@एलेक्स: फ़ायरफ़ॉक्स, ओपेरा, और सफारी (और अन्य ब्राउज़र्स जो वेबकिट एम्बेड करते हैं) ईवेंट ईवेंट हैंडलर के लिए तर्क के रूप में पास करते हैं, लेकिन आईई नहीं करता है। आईई में घटना वैश्विक वस्तु पर एक संपत्ति है। खुशी से || के अर्थशास्त्र || जेएस में इसे चारों ओर काम करने के लिए वास्तव में साफ बनाते हैं। जेएस में अभिव्यक्ति के परिणाम 'ए || बी 'या तो' ए' का मान होगा, या यदि 'ए' को गलत माना जाता है, तो परिणाम' बी' होगा। तो इस मामले में 'ई = ई || घटना 'या तो' e' को असाइन कर देगी यदि ईवेंट को तर्क के रूप में पारित किया गया हो, या यह 'ईवेंट' के लिए 'e' सेट करेगा, इस प्रकार यह कोड सभी ब्राउज़रों में काम करने देगा। – olliej

15

textarea में एंटर मारना पैरेंट फॉर्म सबमिट करने के बजाय लाइन ब्रेक डालें; यह नियमित रूप से टैग टैग के साथ भी उस फैशन में काम नहीं करेगा।

यह इस व्यवहार के आसपास काम करने का प्रयास करने के लिए अचूक होगा, क्योंकि यह उपयोगकर्ता की अपेक्षाओं का उल्लंघन करेगा कि पाठ क्षेत्र नियंत्रण कैसे अन्य वेबसाइटों में और उनके प्लेटफ़ॉर्म पर अन्य अनुप्रयोगों में व्यवहार करता है।

+4

++ को लपेटता नहीं है। हमेशा यह जानने के लिए कि वेबसाइट टेक्स्टरेरा में एंटर कुंजी क्या करेगी, उन कई छोटी स्थिरताओं में से एक है जो मुझे अन्य जीयूआई का उपयोग करते समय याद आती है। – Shog9

+1

हालांकि मैं पूरी तरह से आपकी सलाह से सहमत हूं, हाथ में सवाल बहुत सटीक रूप से तैयार किया गया है और एक अच्छी सलाह के बजाय वास्तविक जवाब की आवश्यकता है। +1 अभी भी है, लेकिन क्या आप सलाह नहीं दे सकते कि कैसे किसी प्रकार की कीलिस्टनर को टेक्स्टरेरा में अटैचमेंट पर फॉर्म सबमिट करने के लिए संलग्न किया जाए? मुझे दिलचस्पी है ... –

+5

मैंने इस जवाब को बहुत समय पहले उठाया था, लेकिन ऐसे मामले हैं जहां उपयोगकर्ता वास्तव में यह नहीं जानता कि वह टेक्स्टरेरा में टाइप कर रहा है। उदाहरण के लिए फेसबुक की चैट की इनपुट लाइन पर विचार करें। यह एक पंक्ति के रूप में शुरू होता है और उपयोगकर्ता प्रकार के रूप में लंबवत रूप से फैलता है। उपयोगकर्ताओं के लिए प्रवेश पर जमा होने की अपेक्षा करना बिल्कुल उचित है। – hasen

1

यहाँ मेरी समाधान है

<input type="text" onkeyup="if(isEnterPressed(event)){/*do something*/}" /> 
13

@ Shog9 सुझाव दिया है कि मैं नकल मेरी इस प्रश्न के डुप्लिकेट संस्करण का उत्तर दें: यह एक समस्या है जो उपयोगकर्ताओं को चलाती है निंग इनपुट विधि (संपादक) - उदाहरण के लिए। गैर लैटिन पाठ प्रविष्टि। आईएमई मैं ओएसएक्स पर कोटेरी हिरगाना आईएम से परिचित हूं, लेकिन जापानी के लिए कई अन्य हैं (अकेले कोटेरी में कई अलग-अलग इनपुट मोड हैं, और कम से कम एक अन्य प्रमुख एटीओके कहा जाता है), हैंगुल के लिए मोड के अलावा, पारंपरिक और सरलीकृत चीनी, साथ ही साथ कई अन्य कम प्रसिद्ध भाषाओं। और ये इनपुट विधियां सभी प्रमुख प्लेटफ़ॉर्म (esp। Win, Mac, और Linux) पर मौजूद हैं।

जो समस्या आप कोशिश कर रहे हैं उसके समान कोड के दृष्टिकोण से पेश की गई समस्या यह है कि सटीक भौतिक कुंजी प्रेस आवश्यक रूप से वास्तविक इनपुट के अनुरूप नहीं है जो उपयोगकर्ता प्रवेश कर रहा है।

उदाहरण के लिए डिफ़ॉल्ट रूप से हीरागाना कम आयु के चरित्रों toukyou<enter> के अनुक्रम टाइपिंग स्ट्रिंग とうきょう का उत्पादन करेगा, ध्यान दें कि परिणामी पाठ में कोई <enter> क्योंकि प्रवेश बना पाठ पुष्टि करता है। लेकिन यह है कि परिवर्तन दिखाई देता है पात्रों की वास्तविक अनुक्रम के अलावा के रूप में इनपुट टाइप किया जाता है:

t // t 
と // to 
とう // tou 
とうk // touk 
とうky // touky 
とうきょ // toukyo 
とうきょう // toukyou 

अगर स्मृति में कार्य करता है जब मैं वेबकिट यह कीकोड keydown पर 229 हो बनाने के लिए जरूरी हो गया था में यह लागू किया सभी चाबी के लिए आपके द्वारा लिखा गया एक आईएमई (आईई के साथ compat के लिए) में - लेकिन मुझे याद नहीं है कि keyUp का व्यवहार क्या है।

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

आम तौर पर यह एक बहुत ... अशुद्ध ... वर्तमान में डोम घटना कार्यान्वयन का हिस्सा है।

+2

++ अक्सर अनदेखा pitfall ... – Shog9

+2

यह दिखाता है कि बहुत से लोग इस तथ्य को लेते हैं कि जिन भाषाओं में वे बोलते हैं, उनके प्रति एक कुंजीस्ट्रोक प्रति चरित्र है। वही मैंने किया। – Alex

-1

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

1

क्या कोई कारण है कि आप फ़ॉर्म रैपर का उपयोग नहीं कर रहे हैं तो सामान्य टेक्स्ट फ़ील्ड का उपयोग करें?

$('#input_id').keypress(function(e){ 
    if(e.which == 13){ 
     $('#form_id').submit(); 
     return false; //prevent duplicate submission 
    } 
}); 
संबंधित मुद्दे