คุณจะบอกให้ HTML SELECT เลื่อนลงโดยใช้โปรแกรมได้อย่างไร (ตัวอย่างเช่นเนื่องจากการวางเมาส์)


106

คุณจะบอกให้ HTML selectแบบเลื่อนลงโดยใช้โปรแกรมได้อย่างไร (ตัวอย่างเช่นเนื่องจากเมาส์โอเวอร์)


6
ฉันขอแนะนำว่าอย่าคาดคั้นกับพฤติกรรมของค่าเริ่มต้น<select>เนื่องจากผู้คนคาดหวังว่ามันจะทำงานในลักษณะหนึ่งและคุณจะป้องกันไม่ให้ผู้คนบนแพลตฟอร์มอื่น ๆ (เช่นมือถือ) ใช้ไซต์ของคุณ
Brian Donovan

1
@BrianDonovan ไม่ใช่ว่าคุณไม่สามารถเพิ่มการจัดการบางอย่างได้
Morg.

@shasikanth: ซอของคุณไม่ทำงานทั้งใน Firefox 37 nr ใน Chrome
rubo77

โอเคฉันคิดว่าซอใช้งานได้ก่อนหน้านี้ อย่างไรก็ตามฉันจะลบความคิดเห็นของฉันที่นี่
shasi kanth

@BrianDonovan อันที่จริงมือถือเป็นกรณีการใช้งานที่ดีสำหรับสิ่งนี้ ...
Michael

คำตอบ:


16

คุณไม่สามารถทำได้ด้วยแท็กเลือก HTML แต่สามารถทำได้ด้วย JavaScript และ HTML มีการควบคุมที่มีอยู่มากมายที่ทำเช่นนี้ตัวอย่างเช่นรายการ "แนะนำ" ที่แนบมากับรายการ "แท็กที่น่าสนใจ / ละเว้น" ของ SO หรือการค้นหาที่อยู่อีเมลของ Gmail

มีตัวควบคุม JavaScript + HTML จำนวนมากที่ให้ความสามารถนี้ - มองหาการควบคุมการเติมข้อความอัตโนมัติสำหรับแนวคิด

ดูลิงค์นี้สำหรับการควบคุมการเติมข้อความอัตโนมัติ ... http://ajaxcontroltoolkit.codeplex.com/


6
นี่เป็นความอัปยศที่น่ากลัว - เบราว์เซอร์มือถือมีรายการเลื่อนเฉพาะระบบปฏิบัติการและฉันต้องการให้สิ่งนั้นปรากฏขึ้นโดยอัตโนมัติ
Michael

120

สิ่งนี้เคยเป็นไปได้จริงกับ HTML + Javascript แม้จะมีคนบอกว่าไม่ใช่ แต่จะเลิกใช้งานในภายหลังและใช้งานไม่ได้ในขณะนี้

อย่างไรก็ตามสิ่งนี้ใช้ได้เฉพาะใน Chrome อ่านเพิ่มเติมหากคุณสนใจ


ตามW3C Working Draft สำหรับ HTML5 ส่วน 3.2.5.1.7 เนื้อหาแบบโต้ตอบ :

องค์ประกอบบางอย่างใน HTML มีพฤติกรรมการเปิดใช้งานซึ่งหมายความว่าผู้ใช้สามารถเปิดใช้งานได้ ทริกเกอร์นี้ลำดับเหตุการณ์ขึ้นอยู่กับกลไกการเปิดใช้งานได้ [ ... ] ตัวอย่างเช่นการใช้แป้นพิมพ์หรือป้อนข้อมูลด้วยเสียงหรือผ่านการคลิกเมาส์

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

<select>ในฐานะที่เป็น Interactive Content ฉันเชื่อว่าเป็นไปได้ที่จะแสดง<option>s. หลังจากนั้นไม่กี่ชั่วโมงของการเล่นรอบที่ผมค้นพบว่าการใช้document.createEvent()และ.dispatchEvent()การทำงาน

ที่กล่าวว่าเวลาสาธิต นี่คือ Fiddle ที่ใช้งานได้


HTML:

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" onclick="runThis()">Show dropdown items</button>​

Javascript:

// <select> element displays its options on mousedown, not click.
showDropdown = function (element) {
    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);
};

// This isn't magic.
window.runThis = function () { 
    var dropdown = document.getElementById('dropdown');
    showDropdown(dropdown);
};

หากใครพบวิธีการทำเช่นเดียวกัน แต่ทำไม่ได้ใน Chrome โปรดปรับเปลี่ยนซอนี้ได้ตามต้องการ


2
ขอบคุณสำหรับสิ่งนี้! ฉันต้องการเลียนแบบพฤติกรรม ALT + DOWN ARROW ของ IE อย่างแม่นยำใน Chrome
ราคา J Bryan

3
ฉันหวังว่าฉันจะเพิ่มค่าหัวของคุณสำหรับสิ่งนี้ ขอบคุณมาก.
Adam Tuttle

7
ไม่ทำงานกับ: IE10, FF 24. ธิการเมื่อ: Chrome 30, Safari 6.0.5,Opera 16
hitautodestruct

2
@AdamTuttle มันไม่ทำงานบน Android 4.4.2 เช่นกัน
Mirko

42
ตอนนี้เลิกใช้งานChrome 53+ แล้ว
Washington Guedes

47

คำตอบของ Xavier Ho ครอบคลุมถึงวิธีแก้ปัญหาในเบราว์เซอร์ส่วนใหญ่ที่มีอยู่ในปัจจุบัน แต่มันเป็นวิธีปฏิบัติที่ดี 'ไม่ได้ที่จะจัดส่ง / แก้ไข' เหตุการณ์ JavaScript อีกต่อไป (เช่นmousedownในกรณีนี้)

จากรุ่น 53+, Google Chrome จะไม่ดำเนินการดำเนินการเริ่มต้นสำหรับเหตุการณ์ยกเลิกการที่เชื่อถือได้ เช่นเหตุการณ์ที่สร้างหรือแก้ไขโดยสคริปต์หรือส่งผ่านdispatchEventวิธีการ การเปลี่ยนแปลงนี้มีไว้เพื่อให้สอดคล้องกับ Firefox และ IE ซึ่งฉันคิดว่ายังไม่ได้ดำเนินการ

สำหรับวัตถุประสงค์ในการทดสอบFiddleให้คำตอบของ Xavier จะไม่ทำงานใน chrome 53+ (ฉันไม่ได้ทดสอบ FF และ IE)

ลิงค์สำหรับอ้างอิง:

https://www.chromestatus.com/features/5718803933560832 https://www.chromestatus.com/features/6461137440735232

และ initMouseEvent ก็เลิกใช้เช่นกัน


สามารถทำได้โดยใช้ MouseEvents หรือไม่? developer.mozilla.org/en-US/docs/Web/API/MouseEvent
Shamal Perera

ฉันไม่คิดอย่างนั้น ได้ลองทำอะไรไหม
Asim KT

29

นี่คือสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับเปลี่ยนขนาดขององค์ประกอบ onmouseover และเรียกคืนขนาด onmouseout:

       <select onMouseOut="this.size=1;" onMouseOver="this.size=this.length;">
        <option>1</option>
        <option>2</option>
        <option>3</option>
        <option>4</option>
        <option>5</option>
      </select>


13
หรือ <SELECT onMouseOut = "this.size = 1;" onMouseOver = "this.size = this.length;"> ... </SELECT>
RealHowTo

1
นอกจากนี้ยังต้องเพิ่ม onchange = "this.size = 1" เพื่อให้เมนูยุบลงทันทีที่ทำการเลือก ต้องกำหนดค่ากฎ CSS ขององค์ประกอบด้วย
gm2008

ดูเหมือนว่าจะได้ผล ความกว้างที่เลือกจะลดขนาดลงและทำให้เกิดเหตุการณ์เมาส์ออกโดยรีเซ็ตการเลือกเป็นความกว้างเดิม สิ่งนี้ทำให้เกิดอาการชัก การตั้งค่าความกว้างคงที่ดูเหมือนจะแก้ไขได้ ด้วยรายการมากกว่าสองสามรายการจะขยายผ่านมุมมอง
1.21 กิกะวัตต์

16

ฉันมีปัญหาเดียวกันนี้และวิธีที่ง่ายกว่าที่ฉันพบในการแก้ปัญหานี้คือ html และ css

select{
  opacity: 0;
  position: absolute;
}
<select>
  <option>option 1</option>
  <option>option 2</option>
  <option>option 3</option>
</select>
<button>click</button>


2
เป็นเวลานานแล้วที่ฉันได้เห็นแนวทางนี้และเป็นข้อมูลอ้างอิงที่ฉันหวังว่าจะพบ ดีกว่าด้วย CSS พิเศษเพื่อให้ตรงกับขนาดของตัวเลือกที่ซ่อนอยู่เพื่อทริกเกอร์ (ปุ่ม, img, div ฯลฯ ) ... 1) ตรวจสอบให้แน่ใจว่าพื้นที่ที่คลิกได้เติมทริกเกอร์ 2) เมนูจะเปิดขึ้นด้านล่างทริกเกอร์โดยตรง หมายเหตุ: อาจต้องเพิ่ม z-index เพื่อให้แน่ใจว่าพื้นที่ที่คลิกได้เป็นองค์ประกอบที่อยู่บนสุดในบางเค้าโครง
Mavelo

อย่างไรก็ตามหากผู้ใช้เลื่อนหน้าลงปุ่มจะเลื่อนตาม แต่การเลือกจะยังคงอยู่ในตำแหน่งเดิม ไม่เป็นไปตามที่คาดไว้จริงๆ วิธีแก้ปัญหานี้หรือไม่
David Portabella

โซลูชั่นที่สมบูรณ์แบบ แต่ดีกว่าอาจจะตัดปุ่มและเลือกบน div เช่นนี้<div style='position:relative'><select> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> <button>click</button></div>@DavidPortabella
Muhammet Can TONBUL

8

ฉันคิดว่าสิ่งนี้ใช้ไม่ได้อีกต่อไปใน Chrome

ดูเหมือนว่า Chrome เวอร์ชัน 53 จะปิดการใช้งานฟังก์ชันนี้ตามที่ระบุโดย Asim K T.

ตามสเป็ก http://www.w3.org/TR/DOM-Level-3-Events/#trusted-events

เหตุการณ์ที่เชื่อถือไม่ควรเริ่มการทำงานเริ่มต้น (ยกเว้นเหตุการณ์การคลิก)

อย่างไรก็ตามพวกเขาได้เปิดใช้งานใน webview แต่ฉันไม่ได้ทดสอบสิ่งนี้

เราพบว่าบางเว็บวิวกำลังใช้ fastclick อยู่ข้างในและเนื่องจากมีความเสี่ยงที่จะเกิดการแตกหักเราจึงยอมให้มีการตัดต่อในรายการที่เลือกแม้ว่าจะไม่น่าเชื่อถือก็ตาม

และในการสนทนานี้ความคิดที่จะให้นักพัฒนาเปิดดรอปดาวน์แบบเป็นโปรแกรมถูกละทิ้ง


7

หากมีใครยังคงมองหาสิ่งนี้:

<select id="dropdown">
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>
<br>
<button id="fire" type="button" >Show dropdown items</button>

Javascript:

var is_visible=false; 

$(document).ready(function(){

    $('#fire').click(function (e) { 
    var element = document.getElementById('dropdown');


    if(is_visible){is_visible=false; return;}
    is_visible = true;

    var event;
    event = document.createEvent('MouseEvents');
    event.initMouseEvent('mousedown', true, true, window);
    element.dispatchEvent(event);

    /* can be added for i.e. compatiblity.
      optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
    */
    e.stopPropagation();
    return false;
});


$(document).click(function(){is_visible=false; });
});

อัปเดต:

จนกว่าจะไม่มีวิธีแก้ปัญหาที่สมบูรณ์แบบสำหรับปัญหานี้ แต่คุณสามารถพยายามหลีกเลี่ยงสถานการณ์นี้ได้ ทำไมคุณถึงต้องการทำเช่นนี้ ฉันสงสัยในการแก้ปัญหาเมื่อสองสามเดือนก่อนเพื่อสร้างปลั๊กอินที่เลือกสำหรับอุปกรณ์มือถือ

https://github.com/HemantNegi/jquery.sumoselect

สุดท้ายลงเอยด้วยการปิดบัง div ที่กำหนดเอง (หรือองค์ประกอบอื่น ๆ ) ด้วยองค์ประกอบการเลือกแบบโปร่งใสเพื่อให้สามารถโต้ตอบกับผู้ใช้ได้โดยตรง


1
ปลั๊กอินเช่นgithub.com/HemantNegi/jquery.sumoselectเป็นโซลูชันข้ามเบราว์เซอร์เดียวที่ดูดีกว่าตัวควบคุมเริ่มต้น
Justin

iniMouseEventดูเหมือนจะทำงาน แต่ทำไม$(select).trigger('mousedown')ไม่ทำงาน?
coding_idiot

3

นี่คือวิธีที่ดีที่สุดที่ฉันพบ หมายเหตุใช้งานได้กับ IE บน Windows เท่านั้นและเว็บของคุณอาจต้องอยู่ในโซนที่ปลอดภัย - เนื่องจากเราเข้าถึงเชลล์ เคล็ดลับคือ ALT-Down Arrow เป็นปุ่มทางลัดเพื่อเปิดเมนูแบบเลื่อนลงเพื่อเลือก

<button id="optionsButton" style="position:absolute;top:10px;left:10px;height:22px;width:100px;z-index:10" onclick="doClick()">OPTIONS</button>
<select id="optionsSelect" style="position:absolute;top:10px;left:10px;height:20px;width:100px;z-index:9">
    <option>ABC</option>
    <option>DEF</option>
    <option>GHI</option>
    <option>JKL</option>
</select>
<script type="text/javascript">
   function doClick() {
       optionsSelect.focus();
       var WshShell = new ActiveXObject("WScript.Shell");
       WshShell.SendKeys("%{DOWN}");
   }
</script>

3
มันจะไม่ทำงานจนกว่าคุณจะทำนี้
Knu

1
@Knu Internet Explorer จะเพิ่ม ID ขององค์ประกอบโดยอัตโนมัติเป็นการอ้างอิงถึงองค์ประกอบในขอบเขตส่วนกลาง
user2428118

@KlasMellbourn คง. พวกเขากำลังพยายามทำให้เบราว์เซอร์ของพวกเขาเป็นไปตามมาตรฐาน ใช้โซลูชัน "ขนาด" ที่กล่าวถึง
sproketboy

2

หยุดคิดว่าสิ่งหนึ่งเป็นไปไม่ได้ไม่มีอะไรทำไม่ได้เมื่อคุณต้องการทำ

ใช้ฟังก์ชันขยาย JS ที่สร้างโดยผู้ชาย

http://code.google.com/p/expandselect/

รวม JS นี้และเพียงแค่เรียกการส่งผ่านพารามิเตอร์เป็นรหัสที่คุณเลือกเช่นนั้น:

ExpandSelect(MySelect)

2
เพื่อให้ชัดเจนว่า JS ไม่ทำให้<SELECT>ดร็อปดาวน์ ตามที่ระบุไว้อย่างชัดเจนว่า "เบราว์เซอร์ไม่อนุญาตให้ขยาย <select> ใน javascript ล้วนการควบคุมนั้นสามารถขยายได้โดยการคลิกโดยตรงโดยใช้เมาส์เท่านั้น" ดังนั้นมันจึงเป็น "ไปไม่ได้"! แทน JS ระบุ "เราเลียนแบบการควบคุม <select> แบบขยายโดยการสร้างตัวเลือกอื่นที่มีการแสดงหลายตัวเลือกพร้อมกัน ... " ซึ่งแตกต่างกันมากและอาจยอมรับหรือไม่ก็ได้สำหรับกรณีการใช้งานของคุณ ....
JonBrave

1

ฉันอาจจะผิด แต่ฉันไม่เชื่อว่าจะเป็นไปได้ด้วยกล่องเลือกเริ่มต้น คุณสามารถทำบางอย่างกับ JS & CSS ที่ได้ผลลัพธ์ที่ต้องการ แต่ไม่ใช่ (ตามความรู้ของฉัน) vanilla SELECT


0

การเปิด "HTML select" ทำได้โดยวิธีแก้ปัญหาบางอย่างที่กล่าวถึงในคำถามนี้และวิธีแก้ปัญหาที่คล้ายกัน อย่างไรก็ตามวิธีที่สะอาดกว่านี้คือการเพิ่มไลบรารีที่เลือกลงในโครงการของคุณเช่น "select2" หรือ "selected" ตัวอย่างเช่นการเปิด select2 โดยใช้โปรแกรมจะทำได้ง่ายเหมือนกับ:

$('#target-select').select2('open');

-2

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

$('#cboSomething')[0].size = 3;
$('#cboSomething')[0].focus();

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