HTML कस्टम मूल्य दर्ज करने के लिए विकल्प के साथ चयन करें


104

मैं एक इनपुट फ़ील्ड रखना चाहूंगा जो उपयोगकर्ता कस्टम टेक्स्ट मान दर्ज कर सकते हैं या ड्रॉप डाउन से चुन सकते हैं। एक नियमित <select>केवल ड्रॉप डाउन विकल्प प्रदान करता है।

मैं <select>कस्टम मूल्य को कैसे स्वीकार कर सकता हूं ? उदाहरण के लिए: फोर्ड?

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

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

मैंने अपनी वेबसाइट finnmglas.com/contact पर कस्टम मानों के लिए उस विकल्प को नहीं जोड़ा, लेकिन किसी ने मुझसे कस्टम मूल्य के साथ संपर्क किया। यही कारण है कि बहुत अजीब है
finnmglas

जवाबों:


249

HTML5 में एक अंतर्निहित कॉम्बो बॉक्स है। आप एक टेक्स्ट inputऔर ए बनाएँ datalist। तो फिर तुम एक जोड़ने listके लिए विशेषता inputके एक मूल्य के साथ, idके datalist

अपडेट: मार्च 2019 तक सभी प्रमुख ब्राउज़र (अब सफारी 12.1 और आईओएस सफारी 12.3 सहित) datalistइस कार्यक्षमता के लिए आवश्यक स्तर का समर्थन करते हैं। विस्तृत ब्राउज़र समर्थन के लिए caniuse देखें ।

यह इस तरह दिख रहा है:

<input type="text" list="cars" />
<datalist id="cars">
  <option>Volvo</option>
  <option>Saab</option>
  <option>Mercedes</option>
  <option>Audi</option>
</datalist>


3
यह सुविधा केवल लगभग 50% ब्राउज़रों द्वारा समर्थित है। केवल नवीनतम फ़ायरफ़ॉक्स, क्रोम और ओपेरा इसका समर्थन करते हैं; IE, सफारी और मोबाइल ब्राउज़र नहीं है। देखें http://caniuse.com/
markmarijnissen

2
यह 2016 के माध्यम से आधे से अधिक (2 साल बाद) है, और अधिकांश ब्राउज़र अभी भी पूरी तरह से इसका समर्थन नहीं करते हैं, कम से कम महत्वपूर्ण बग के बिना। सफारी / सफारी आईओएस को छोड़कर हर चीज के बारे में कम से कम हाल के संस्करणों पर कुछ काम करेगा, लेकिन आपको यह सुनिश्चित करने के लिए परीक्षण करना होगा कि आपके उपयोग के मामले ठीक से काम करते हैं। यह अभी भी सबसे अच्छा जवाब है।
माइकल गास्किल

1
यह मेरे लिए अच्छा काम करता है। कई मामलों में हमें पुराने ब्राउज़रों का समर्थन करने की आवश्यकता नहीं है। मैंने केवल "डाउन एरो" छवि को इनपुट फ़ील्ड की पृष्ठभूमि पर जोड़ा है ताकि उपयोगकर्ताओं को यह विस्तार योग्य संकेत दे सके। कोड (आपको एक वास्तविक छवि फ़ाइल की आवश्यकता है):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
यूजीन कर्दाश

4
मैंने अभी हाल ही में IE, फ़ायरफ़ॉक्स और क्रोम के सभी संस्करणों में काम किया है। मुझे लगता है कि यह कई मामलों के लिए इस सामान्य समस्या का एक बड़ा सरल समाधान है।
kerl

3
मैं वास्तव में इसका उपयोग करना चाहता था लेकिन मुझे एक डिफ़ॉल्ट मान सेट करने की आवश्यकता थी। उपयोगकर्ता केवल ड्रॉप डाउन बनाम सभी विकल्पों में डिफ़ॉल्ट देखता है (क्योंकि उन्हें फ़िल्टर किया जाता है)। उन्हें सभी विकल्पों को देखने से पहले इनपुट क्षेत्र को साफ़ करने के लिए जानना होगा।
जस्टिन

26

Alen Saqe की नवीनतम JSFiddle ने फ़ायरफ़ॉक्स पर मेरे लिए काम नहीं किया, इसलिए मैंने सोचा कि मैं एक सरल HTML / जावास्क्रिप्ट वर्कअराउंड प्रदान करूंगा, जो उस दिन तक रूपों के भीतर (कार्य के बारे में) अच्छी तरह से काम करेगा जब तक कि सभी ब्राउज़रों / उपकरणों के लिए डेडलिस्ट टैग स्वीकार नहीं कर लिया जाता। अधिक जानकारी के लिए और इसे कार्रवाई में देखें: http://jsfiddle.net/6nq7w/4/ नोट पर जाएं: भाई-बहन के बीच किसी भी स्थान की अनुमति न दें!

<!DOCTYPE html>
<html>
<script>
function toggleField(hideObj,showObj){
  hideObj.disabled=true;        
  hideObj.style.display='none';
  showObj.disabled=false;   
  showObj.style.display='inline';
  showObj.focus();
}
</script>
<body>
<form name="BrowserSurvey" action="#">
Browser: <select name="browser" 
          onchange="if(this.options[this.selectedIndex].value=='customOption'){
              toggleField(this,this.nextSibling);
              this.selectedIndex='0';
          }">
            <option></option>
            <option value="customOption">[type a custom value]</option>
            <option>Chrome</option>
            <option>Firefox</option>
            <option>Internet Explorer</option>
            <option>Opera</option>
            <option>Safari</option>
        </select><input name="browser" style="display:none;" disabled="disabled" 
            onblur="if(this.value==''){toggleField(this,this.previousSibling);}">
<input type="submit" value="Submit">
</form>
</body>
</html>


मैं उस फ़िदेल को फिर से देखना चाहूँगा! फ़ायरफ़ॉक्स का चुड़ैल संस्करण वहाँ समर्थित नहीं था! मैं इसे याद नहीं है कुछ संस्करण के साथ परीक्षण किया! कुडोस!
एलन साके

मुझे नहीं पता कि मैं एफएफ के किस संस्करण पर था। मुझे बस FF34.0 पर एक नज़र थी और मुझे अब कार्यक्षमता मिल रही है, इसलिए कोई चिंता नहीं है। हालांकि, डिफ़ॉल्ट टॉगल विकल्प "अन्य" को दूर किया जा सकता है। जब मैं मान संपादित करके "अन्य" निकालता हूं, तो ड्रॉपमेनू चयन करने के लिए एक सहज ज्ञान युक्त मूल्य नहीं देता है (संपादन सुविधा तक पहुंचने के लिए)। मुझे लगता है कि यह व्यक्तिगत प्राथमिकता पर आता है। क्योंकि ड्रॉपमेनू तीर तब भी मौजूद होता है जब फ़ील्ड संपादन योग्य होता है, उपयोगकर्ताओं को यह महसूस नहीं हो सकता है कि फ़ील्ड संपादन योग्य है। तुम पर खुदाई नहीं हो रही है; बस कुछ प्रतिक्रिया। मेरा स्निपेट एक <form> के अंदर फ़ील्ड नामकरण पर भी विचार करता है।
मिकमैकुसा

इस सरल, लेकिन अनिर्वचनीय (मेरे लिए) स्क्रिप्ट + html का अंतिम परिणाम चयनित विकल्प मान को संलग्न करना है, या एक पाठ स्ट्रिंग के रूप में उसी पृष्ठ के GET में पाठ दर्ज करना है। क्या किसी को पता है कि एक्शन को POST में कैसे बदला जाए, इसलिए मैं php फाइल में वैल्यू को पकड़ सकता हूं और वहां कुछ कर सकता हूं?
हान

मैंने इस स्क्रिप्ट को HTML फॉर्म सबमिशन के अनुसार व्यवहार करने के लिए इसके विशिष्ट इरादे से बनाया है। क्या आप पोस्ट विधि का उपयोग टैग में विशेषता के रूप में कर रहे हैं? @ यदि आप अपने अलग किए गए स्निपेट का 3v4l.org लिंक बनाते हैं, तो मैं त्वरित रूप से जानकारी ले सकता हूं और सलाह दे सकता हूं।
मिकमैकुसा

1
लड़का क्या मुझे गूंगा लगता है? मैं फॉर्म टैग में एक विधि डालना भूल गया। इसने बहुत मामूली संशोधन के साथ पोस्ट किया: <form name = "BrowserSurvey" विधि = "पोस्ट" एक्शन = "/ gotThis.php"> ... सुंदर लिपि, मिकमैकुसा। आपके फॉलोअप हिंट के लिए धन्यवाद!
हान

16

jQuery समाधान!

डेमो: http://jsfiddle.net/69wP6/2/

नीचे एक और डेमो (अद्यतन!)

मुझे एक मामले में कुछ इसी तरह की जरूरत थी जब मेरे पास कुछ निश्चित विकल्प थे और मैं चाहता था कि एक और विकल्प संपादन योग्य हो! इस मामले में मैंने एक छिपा इनपुट बनाया जो कि चयन विकल्प को ओवरलैप करेगा और संपादन योग्य होगा और इसे सभी कामों को मूल रूप से करने के लिए jQuery का उपयोग किया जाएगा।

मैं आप सभी के साथ बेला साझा कर रहा हूँ!

एचटीएमएल

<div id="billdesc">
    <select id="test">
      <option class="non" value="option1">Option1</option>
      <option class="non" value="option2">Option2</option>
      <option class="editable" value="other">Other</option>
    </select>
    <input class="editOption" style="display:none;"></input>
</div>

सीएसएस

body{
    background: blue;
}
#billdesc{
    padding-top: 50px;
}
#test{
    width: 100%;
    height: 30px;
}
option {
    height: 30px;
    line-height: 30px;
}

.editOption{
    width: 90%;
    height: 24px;
    position: relative;
    top: -30px

}

jQuery

var initialText = $('.editable').val();
$('.editOption').val(initialText);

$('#test').change(function(){
var selected = $('option:selected', this).attr('class');
var optionText = $('.editable').text();

if(selected == "editable"){
  $('.editOption').show();


  $('.editOption').keyup(function(){
      var editText = $('.editOption').val();
      $('.editable').val(editText);
      $('.editable').html(editText);
  });

}else{
  $('.editOption').hide();
}
});

संपादित करें: कुछ सरल स्पर्श डिजाइन को जोड़ा, ताकि लोग स्पष्ट रूप से देख सकें कि इनपुट कहां समाप्त होता है!

जेएस फिडल: http://jsfiddle.net/69wP6/4/


11

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


9

यदि डेंटलिस्ट विकल्प आपकी आवश्यकताओं को पूरा नहीं करता है, तो Select2 लाइब्रेरी और " डायनेमिक विकल्प निर्माण " पर एक नज़र डालें

$(".js-example-tags").select2({
  tags: true
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>


<select class="form-control js-example-tags">
  <option selected="selected">orange</option>
  <option>white</option>
  <option>purple</option>
</select>


0

उपरोक्त समाधान (@mickmackusa) में से एक का उपयोग करते हुए, मैंने 16.8+ रिएक्ट में हुक का उपयोग करके एक कार्यशील प्रोटोटाइप बनाया।

https://codesandbox.io/s/heuristic-dewdney-0h2y2

मुझे उम्मीद है कि यह किसी की मदद करता है।


मैं सम्मानित महसूस कर रहा हूँ। मैंने सिर्फ अपने रिकॉर्ड की जाँच की और यह 12 वीं पोस्ट थी जिसे मैंने स्टैक ओवरफ्लो पर बनाया था - एक मिलियन साल पहले की तरह लगता है।
मिकमैकुसा

मुझे सिर्फ आपके डेमो लिंक के साथ खेलना था और ऐसा लगता है कि आपने दो प्रकार के क्षेत्रों के बीच अनिश्चित काल के लिए प्रभाव खो दिया है।
मिकमैकुसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.