ข้อความเริ่มต้นซึ่งจะไม่ปรากฏในรายการแบบเลื่อนลง


108

ฉันมีรายการselectที่แสดงเลือกภาษาในตอนแรกจนกว่าผู้ใช้จะเลือกภาษา เมื่อผู้ใช้เปิดการเลือกฉันไม่ต้องการให้แสดงตัวเลือกเลือกภาษาเพราะไม่ใช่ตัวเลือกจริง

ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?

คำตอบ:


215

โซลูชันของ Kyleทำงานได้ดีสำหรับฉันดังนั้นฉันจึงทำการวิจัยเพื่อหลีกเลี่ยง Js และ CSS ใด ๆ แต่เพียงแค่ยึดติดกับ HTML การเพิ่มค่าของselectedรายการที่เราต้องการให้ปรากฏเป็นส่วนหัวจะบังคับให้รายการนั้นแสดงเป็นตัวยึดตำแหน่งตั้งแต่แรก สิ่งที่ต้องการ:

<option selected disabled>Choose here</option>

มาร์กอัปที่สมบูรณ์ควรอยู่ตามบรรทัดเหล่านี้:

<select>
    <option selected disabled>Choose here</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
    <option value="4">Four</option>
    <option value="5">Five</option>
</select>

คุณสามารถดูซอนี้และนี่คือผลลัพธ์:

ใส่คำอธิบายภาพที่นี่

หากคุณไม่ต้องการให้ประเภทของข้อความตัวยึดตำแหน่งปรากฏในรายการตัวเลือกเมื่อผู้ใช้คลิกที่ช่องเลือกเพียงแค่เพิ่มhiddenแอตทริบิวต์ดังนี้:

<select>
    <option selected disabled hidden>Choose here</option>
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
    <option value="4">Four</option>
    <option value="5">Five</option>
</select>

ตรวจสอบซอที่นี่และภาพหน้าจอด้านล่าง

ใส่คำอธิบายภาพที่นี่


นี่เป็นคำตอบที่ดี แต่เมื่อใช้ Angular JS แล้วจะไม่ทำงานเนื่องจาก Angular จะเพิ่มตัวเลือกว่างโดยอัตโนมัติและตั้งเป็นค่าเริ่มต้น
Dennis Wanyonyi

อย่างไรก็ตามสำหรับการอ้างอิงนี่คือวิธีที่คุณจะทำใน Angular เพียงรวมวิธีการข้างต้นกับ Angular ที่อธิบายไว้ที่นี่metaltoad.com/blog/…
โนบิตะ

โปรดทราบว่าแอตทริบิวต์ที่ใช้ในคำตอบข้างต้นเป็นคุณลักษณะที่สามารถตั้งค่าในองค์ประกอบ HTML ใด ๆ และเป็นปกติ ( แต่ไม่จำเป็น) ดำเนินการเพื่อให้เทียบเท่ากับการตั้งค่าด้วย CSS hiddendisplay: none
Mark Amery

2
ยังทราบว่าการตั้งค่าhiddenบนoptionในselectไม่ทำงานใน Safari บน iOS อย่างใดอย่างหนึ่งหรือ Mac คำตอบนี้จึงให้การสนับสนุนเบราว์เซอร์เพียงบางส่วน
Mark Amery

1
สวยขนาดนี้!
Fibo Kowalsky

59

นี่คือวิธีแก้ปัญหา:

<select>
    <option style="display:none;" selected>Select language</option>
    <option>Option 1</option>
    <option>Option 2</option>
</select>

5
โปรดทราบว่าselected="true"ไม่ถูกต้อง ให้ใช้selected="selected"ใน (X) HTML หรือเพียงแค่selectedใน HTML ดูเหมือนว่าคุณสับสนselectedแอตทริบิวต์กับselectedคุณสมบัติซึ่งมีการเปลี่ยนแปลงดังนี้myOption.selected = true;หรือmyOption.selected = false;
Oriol

2
"display: none" ถูกละเว้นโดยเบราว์เซอร์ที่ใช้การเลือกตามอุปกรณ์เช่น Android และ iOS คุณต้องลบตัวเลือกออกจาก DOM ใน select.focus และส่งคืนและเลือกใน select.blur เพื่อให้มันใช้งานได้
เด็คพีช

-1; เช่นเดียวกับคำตอบของโนบิตะโดยใช้hidden (ซึ่งก็คือ"ใช้งานโดยทั่วไปใน CSS"โดยใช้display: noneต่อไป) โดยใช้display: noneกับสิ่งที่optionไม่ทำงานใน Safari ตัวเลือกยังคงปรากฏขึ้น
Mark Amery

50

วิธีที่เหมาะสมและมีความหมายคือการใช้ตัวเลือกป้ายตัวยึด :

  • เพิ่มoptionองค์ประกอบเป็นลูกคนแรกของselect
  • ชุด value= ""เป็นoption
  • ตั้งค่าข้อความตัวยึดเป็นเนื้อหาของสิ่งนั้น option
  • เพิ่มrequiredแอตทริบิวต์ลงในไฟล์select

การดำเนินการนี้จะบังคับให้ผู้ใช้เลือกตัวเลือกอื่นเพื่อให้สามารถส่งแบบฟอร์มได้และเบราว์เซอร์ควรแสดงไฟล์optionเป็นที่ต้องการ:

หากองค์ประกอบที่เลือกมีตัวเลือกป้ายตัวยึดตำแหน่งตัวแทนผู้ใช้คาดว่าจะแสดงผลอ็อพชันนั้นในลักษณะที่บ่งบอกว่าเป็นเลเบลแทนที่จะเป็นอ็อพชันที่ถูกต้องของคอนโทรล

optionอย่างไรก็ตามเบราว์เซอร์ส่วนใหญ่จะทำให้มันเป็นปกติ ดังนั้นเราจะต้องทำการแก้ไขด้วยตนเองโดยเพิ่มสิ่งต่อไปนี้ในไฟล์option :

  • selectedแอตทริบิวต์ที่จะทำให้มันเลือกโดยค่าเริ่มต้น
  • disabledแอตทริบิวต์ที่จะทำให้มันไม่ใช่เลือกโดยผู้ใช้
  • display: noneเพื่อซ่อนจากรายการค่า

select > .placeholder {
  display: none;
}
<select required>
  <option class="placeholder" selected disabled value="">Select language</option>
  <option>Option 1</option>
  <option>Option 2</option>
</select>


ควรสังเกตว่าแม้สิ่งนี้ (ซึ่งเป็นความพยายามอย่างละเอียดถี่ถ้วนที่สุดในการแก้ปัญหานี้จากคำตอบทั้งหมดที่นี่) ไม่สามารถใช้ได้กับ Safari ทั้งบน iOS หรือ Mac ตัวเลือกจะยังคงอยู่เมื่อเปิดการเลือก
Mark Amery

@MarkAmery ฉันขอแนะนำให้คุณทำเช่นเดียวกับที่เสนอไว้ในคำตอบของ @Nobita และเพียงแค่เพิ่มhiddenแอตทริบิวต์ลงในแท็กตัวเลือกตัวยึดแทนdisplay: noneเนื่องจากดูเหมือนว่าเบราว์เซอร์มือถือส่วนใหญ่จะเพิกเฉยต่อdisplay: noneแอตทริบิวต์ CSS และในความคิดของฉันก็ยิ่งถูกต้องตามความหมาย
Gaboik1

@ Gaboik1 ในความคิดเห็นเกี่ยวกับคำตอบนั้นฉันสังเกตเห็นว่าhiddenโดยทั่วไปมีการใช้งานdisplay: noneภายใต้ประทุน (และข้อกำหนดนี้แนะนำอย่างชัดเจนว่าเป็นการใช้งาน "ทั่วไป") ด้วยเหตุนี้ฉันจึงแปลกใจถ้ามีเบราว์เซอร์ใด ๆ ไม่ว่าจะเป็นมือถือหรืออย่างอื่น - ที่ไหนใช้hiddenงานได้ แต่display: noneไม่มี คุณสามารถให้ตัวอย่างได้หรือไม่?
Mark Amery

21

เนื่องจากคุณไม่สามารถใช้กำหนดตัวยึดตำแหน่งสำหรับselectแท็กได้ฉันไม่เชื่อว่าจะมีวิธีใดที่จะทำสิ่งที่คุณขอด้วย HTML / CSS ที่บริสุทธิ์ได้ อย่างไรก็ตามคุณสามารถทำสิ่งนี้:

<select>
  <option disabled="disabled">Select language</option>
  <option>Option 1</option>
</select>

"เลือกภาษา" จะปรากฏขึ้นในเมนูแบบเลื่อนลง แต่เมื่อเลือกตัวเลือกอื่นแล้วจะไม่สามารถเลือกใหม่ได้

ฉันหวังว่าจะช่วยได้


2
ฉันพบว่าสิ่งที่ดีที่สุดคือการรวมกันของ disabled และเลือกด้วย style = "display: none;" ปิดใช้งานมีประโยชน์เมื่อคุณต้องการดำเนินการตรวจสอบความถูกต้อง - ทำให้แน่ใจว่าคุณไม่ได้เลือกตัวเลือกที่เปิดใช้งานไว้โดยค่าเริ่มต้น
Illarion Kovalchuk

-1 เนื่องจากคำตอบอื่น ๆ ที่นี่ (โดยเฉพาะอย่างยิ่งของ Nobtia และ Oriol) ให้ทั้งรายละเอียดที่อธิบายได้มากขึ้นและโซลูชันที่สมบูรณ์ยิ่งขึ้น
Mark Amery

7

ลองสิ่งนี้:

<div class="selectSelection">
    <select>
        <option>Do not display</option>
        <option>1</option>
        <option>1</option>
    </select>
</div>

ใน CSS:

.selectSelection option:first-child{
    display:none;
}

คำตอบนี้ไม่มีอะไรที่คำตอบอื่น ๆ ไม่มีรายละเอียดเพิ่มเติมรวมทั้งมีการจัดรูปแบบที่ไม่ถูกต้อง -1.
Mark Amery

5

ฉันมีวิธีแก้ปัญหาโดยมีช่วงแสดงอยู่เหนือตัวเลือกจนกว่าการเลือกจะเสร็จ span แสดงข้อความเริ่มต้นดังนั้นจึงไม่อยู่ในรายการข้อเสนอ:

HTML:

<span id="default_message_overlay">Default message</span>
<select id="my_select">
    <option value="1">Option 1</option>  
    <option value="2">Option 2</option>
    <option value="3">Option 3</option>
</select>

CSS:

#default_message_overlay {
    position: absolute;
    display: block;
    width: 120px;
    color: grey;
}
select {
    width: 150px;
}

Javascript (พร้อม JQuery):

$(document).ready(function() {
    // No selection at start
    $('#my_select').prop("selectedIndex", -1);

    // Set the position of the overlay
    var offset = $('#my_select').offset();
    offset.top += 3;
    offset.left += 3;
    $('#default_message_overlay').offset(offset);

    // Remove the overlay when selection changes
    $('#my_select').change(function() {
        if ($(this).prop("selectedIndex") != -1) {
            $('#default_message_overlay').hide();
        }
    });
});

ผมได้ทำjsfiddle สำหรับการสาธิต ทดสอบกับ Firefox และ IE8


Chrome บน OSX จะแสดงตัวเลือกแรกที่เลือกเสมอ แต่ดูเหมือนว่าจะเป็นเฉพาะ OSX เนื่องจากโซลูชันทั้งหมดที่ให้ไว้ที่นี่นำไปสู่การเลือกตัวเลือกแรกที่มองเห็นได้
Gamadril

แทนที่จะใช้spanในนั้นlegendและนั่นจะสมบูรณ์แบบหรือlabel
karlcow

นี่เป็นแนวทางที่น่าสนใจและเป็นวิธีเดียวที่เป็นไปได้ที่ฉันเห็นว่าจะทำให้พฤติกรรมนี้ทำงานบน Safari ได้ แต่มันถูกนำไปใช้ที่นี่ไม่ดี อย่างน้อยคุณต้องใช้pointer-events: noneช่วงเวลาของคุณเพื่อให้คลิกผ่านเพื่อเลือก
Mark Amery

0
<option value="" id="ddl" name="prop" style="display:none;" disabled selected>chose something </option>

แน่นอนคุณสามารถย้าย css ไปยังไฟล์ css ได้หากต้องการและวางสคริปต์เพื่อจับescปุ่มเพื่อเลือกปิดใช้งานอีกครั้ง ซึ่งแตกต่างจากคำตอบอื่น ๆ ที่ฉันใส่ไว้value=""หากคุณส่งค่าของรายการที่คุณเลือกด้วยแบบฟอร์มจะไม่มี "เลือกบางอย่าง" ใน asp.net mvc 5 ส่งเป็น json ที่คอมไพล์ด้วยvar obj = { prop:$('#ddl').val(),...};และJSON.stringify(obj);ค่าของ prop จะเป็นโมฆะ


0

Op1:

$("#MySelectid option").each(function () {
        if ($(this).html() == "text to find") {
            $(this).attr("selected", "selected");
            return;
        }
});

Op2:

$('#MySelectid option')
.filter(function() { return $.trim( $(this).text() ) == 'text to find'; })​​​​​​​​.attr('selected','selected');​​​​​​​
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.