HTML เลือกแบบฟอร์มพร้อมตัวเลือกในการป้อนค่าที่กำหนดเอง


109

ฉันต้องการมีช่องป้อนข้อมูลที่ผู้ใช้สามารถป้อนค่าข้อความที่กำหนดเองหรือเลือกจากรายการแบบเลื่อนลง ปกติ<select>มีเพียงตัวเลือกแบบเลื่อนลง

ฉันจะ<select>ยอมรับค่าที่กำหนดเองได้อย่างไร ตัวอย่างเช่น: Ford?

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

คุณสามารถใช้ javascript เพื่อเพิ่มตัวเลือกในการเลือกแบบไดนามิก แต่การใช้ข้อมูลนี้จะกลายเป็นความเจ็บปวดอย่างแท้จริง
David

ฉันไม่ได้เพิ่มตัวเลือกนั้นสำหรับค่าที่กำหนดเองบนเว็บไซต์ของฉันfinnmglas.com/contactอย่างไรก็ตามมีคนติดต่อฉันพร้อมกับค่าที่กำหนดเอง มันแปลกมาก
finnmglas

คำตอบ:


263

HTML5 มีกล่องคำสั่งผสมในตัว คุณสร้างข้อความinputและไฟล์datalist. แล้วคุณเพิ่มlistแอตทริบิวต์ไปinputกับค่าของของiddatalist

อัปเดต:ณ เดือนมีนาคม 2019 เบราว์เซอร์หลักทั้งหมด (ตอนนี้รวมถึง Safari 12.1 และ iOS Safari 12.3) รองรับdatalistถึงระดับที่จำเป็นสำหรับฟังก์ชันนี้ ดูวิธีใช้สำหรับการสนับสนุนเบราว์เซอร์โดยละเอียด

ดูเหมือนว่า:

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


3
คุณลักษณะนี้รองรับโดยประมาณ 50% ของเบราว์เซอร์เท่านั้น เฉพาะ firefox, chrome และ opera ล่าสุดเท่านั้นที่รองรับสิ่งนี้ IE, Safari และเบราว์เซอร์มือถือไม่ทำ ดูhttp://caniuse.com/
markmarijnissen

2
ผ่านไปครึ่งทางของปี 2016 (มากกว่า 2 ปีให้หลัง) และเบราว์เซอร์ส่วนใหญ่ยังไม่รองรับสิ่งนี้อย่างเต็มที่อย่างน้อยก็ไม่มีข้อบกพร่องที่สำคัญ อย่างน้อยก็มีบางอย่างที่ใช้ได้กับเวอร์ชันล่าสุดทุกอย่างยกเว้น Safari / Safari iOS แต่คุณต้องทดสอบเพื่อให้แน่ใจว่ากรณีการใช้งานของคุณทำงานได้อย่างถูกต้อง มันยังคงเป็นคำตอบที่ดีที่สุด
Michael Gaskill

1
มันทำงานสำหรับฉันได้ดี ในหลาย ๆ กรณีเราไม่จำเป็นต้องรองรับเบราว์เซอร์รุ่นเก่า ฉันเพิ่มเฉพาะภาพ "ลูกศรลง" บนพื้นหลังของช่องป้อนข้อมูลเพื่อให้คำแนะนำแก่ผู้ใช้ว่าสามารถขยายได้ รหัส (คุณต้องการไฟล์ภาพจริง):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
Eugene Kardash

4
ฉันเพิ่งทดสอบใน IE, Firefox และ Chrome เวอร์ชันล่าสุดโดยทุกอย่างทำงานได้ดี ฉันคิดว่านี่เป็นวิธีง่ายๆที่ยอดเยี่ยมสำหรับปัญหาทั่วไปนี้สำหรับหลาย ๆ กรณี
kerl

3
ฉันต้องการใช้สิ่งนี้จริงๆ แต่ฉันต้องการตั้งค่าเริ่มต้น ผู้ใช้จะเห็นเฉพาะค่าเริ่มต้นในเมนูแบบเลื่อนลงเทียบกับตัวเลือกทั้งหมด (เนื่องจากถูกกรองออก) พวกเขาจำเป็นต้องทราบเพื่อล้างช่องป้อนข้อมูลก่อนจึงจะเห็นตัวเลือกทั้งหมด
Justin

27

JSFiddle ล่าสุดของ Alen Saqe ไม่ได้สลับให้ฉันใน Firefox ดังนั้นฉันคิดว่าฉันจะให้วิธีแก้ปัญหา html / javascript แบบง่ายๆที่จะทำงานได้ดีภายในแบบฟอร์ม (เกี่ยวกับการส่ง) จนถึงวันที่เบราว์เซอร์ / อุปกรณ์ทั้งหมดยอมรับแท็กดาต้าลิสต์ สำหรับรายละเอียดเพิ่มเติมและดูการใช้งานจริงโปรดไปที่: 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>


ฉันอยากจะพูดถึงเรื่องนั้นอีกครั้ง! ไม่รองรับ Firefox เวอร์ชัน Witch ที่นั่น! ฉันทดสอบกับบางเวอร์ชันฉันจำไม่ได้! ความรุ่งโรจน์!
Alen Saqe

ฉันไม่รู้ว่าฉันใช้ FF เวอร์ชันไหนอยู่ ฉันเพิ่งดู FF34.0 และตอนนี้ฉันได้รับฟังก์ชั่นการใช้งานจึงไม่ต้องกังวล อย่างไรก็ตามตัวเลือกการสลับเริ่มต้น "อื่น ๆ " สามารถล้างออกไปได้ เมื่อฉันลบ "อื่น ๆ " โดยการแก้ไขค่าเมนูแบบเลื่อนจะไม่มีค่าที่ใช้งานง่ายให้เลือก (เพื่อเข้าถึงคุณลักษณะการแก้ไข) ฉันคิดว่านี่ขึ้นอยู่กับความชอบส่วนตัว เนื่องจากยังคงมีลูกศรเมนูแบบเลื่อนอยู่เมื่อสามารถแก้ไขช่องได้ผู้ใช้อาจไม่ทราบว่าช่องนั้นสามารถแก้ไขได้ ไม่มีการขุดที่คุณ เพียงข้อเสนอแนะบางส่วน ข้อมูลโค้ดของฉันยังพิจารณาการตั้งชื่อฟิลด์ภายใน <form>
mickmackusa

ผลลัพธ์สุดท้ายของสคริปต์ + html ที่แยบยล แต่อ่านไม่ออก (สำหรับฉัน) คือการแนบค่าตัวเลือกที่เลือกหรือข้อความที่ป้อนเข้ากับ GET ของเพจเดียวกันกับสตริงการสืบค้น ไม่มีใครรู้วิธีแปลงการกระทำเป็น POST ดังนั้นฉันสามารถคว้าค่าในไฟล์ php และทำอะไรกับมันได้ที่นั่น?
ฮัน

ฉันแต่งสคริปต์นี้โดยมีเจตนาเฉพาะเพื่อให้สคริปต์ทำงานตามการส่งแบบฟอร์ม html คุณใช้วิธีการโพสต์เป็นแอตทริบิวต์ในแท็กแบบฟอร์มหรือไม่ @ ถ้าคุณสร้างลิงก์ 3v4l.org ของตัวอย่างข้อมูลแยกฉันสามารถดูและให้คำแนะนำได้อย่างรวดเร็ว
mickmackusa

1
เด็กชายฉันรู้สึกโง่ ฉันลืมใส่เมธอดในแท็กแบบฟอร์ม มันใช้งานได้ตามที่โพสต์ด้วยการปรับเปลี่ยนเล็กน้อยนี้: <form name = "BrowserSurvey" method = "post" action = "/ gotThis.php"> ... สคริปต์ที่สวยงาม mickmackusa ขอบคุณสำหรับคำแนะนำการติดตาม!
ฮัน

16

jQuery โซลูชั่น!

การสาธิต: http://jsfiddle.net/69wP6/2/

การสาธิตอื่น ๆ ด้านล่าง (อัปเดต!)

ฉันต้องการบางสิ่งที่คล้ายกันในกรณีที่ฉันมีตัวเลือกคงที่และฉันต้องการตัวเลือกอื่นเพื่อแก้ไขได้! ในกรณีนี้ฉันสร้างอินพุตที่ซ่อนไว้ซึ่งจะทับซ้อนกับตัวเลือกเลือกและจะแก้ไขได้และใช้ jQuery เพื่อให้ทุกอย่างทำงานได้อย่างราบรื่น

ฉันกำลังแบ่งปันเสียงซอกับพวกคุณทุกคน!

HTML

<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>

CSS

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();
}
});

แก้ไข: เพิ่มการออกแบบสัมผัสที่เรียบง่ายอย่างชาญฉลาดเพื่อให้ผู้คนเห็นได้ชัดเจนว่าอินพุตสิ้นสุดที่ใด

JS Fiddle: 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) ฉันสร้างต้นแบบที่ใช้งานได้ใน React 16.8+ โดยใช้ Hooks

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

ฉันหวังว่ามันจะช่วยใครสักคน


ฉันรู้สึกเป็นเกียรติ ฉันเพิ่งตรวจสอบบันทึกของฉันและนี่เป็นโพสต์ที่ 12 ที่ฉันสร้างไว้ที่ Stack Overflow - ให้ความรู้สึกเหมือนล้านปีที่แล้ว
mickmackusa

ฉันเพิ่งเล่นกับลิงก์สาธิตของคุณและดูเหมือนว่าคุณจะสูญเสียเอฟเฟกต์ในการสลับระหว่างฟิลด์ทั้งสองประเภทอย่างไม่มีกำหนด
mickmackusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.