การเพิ่มข้อมูลเพิ่มเติมเพื่อเลือกตัวเลือกโดยใช้ jQuery


139

คำถามง่าย ๆ ฉันหวังว่า

ฉันมี<select>กล่องปกติเช่นนี้

<select id="select">
    <option value="1">this</option>
    <option value="2">that</option>
    <option value="3">other</option>
</select>

ฉันจะได้รับความคุ้มค่าที่เลือก (โดยใช้$("#select").val()) และค่าการแสดงรายการที่เลือกของ $("#select :selected").text()(โดยการใช้

แต่ฉันจะเก็บไว้เป็นค่าเพิ่มเติมใน<option>แท็กได้อย่างไร ฉันต้องการที่จะทำสิ่งที่ชอบ<option value="3.1" value2="3.2">other</option>และได้รับค่าของvalue2คุณลักษณะ (ซึ่งจะเป็น 3.2 ในตัวอย่าง)


คุณต้องการเพิ่มรายการลงในกล่องที่เลือกหรือไม่ หรือคุณต้องการเลือกมากกว่าหนึ่งครั้งและรับผลลัพธ์
zsalzbank

ไม่ฉันแค่ต้องการให้เป็นเหมือน value2 = "" ในแท็ก <option> แต่นั่นไม่ได้ผล
jim smith

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

15
ไม่ท้าทายตรรกะหรือเหตุผล geez ฉันมีคำถาม / กรณีที่คล้ายกันดังนั้นฉันจึงสามารถเปรียบเทียบค่าระหว่างการเลือกและบันทึกข้อความของตัวเลือกของตัวเลือกหนึ่งไปยังตัวเลือกของผู้อื่นในขณะที่รักษาค่า / ข้อความที่เลือกไว้วิธีหนึ่งที่ดูเหมือนเป็นไปได้คือผ่านข้อมูล เพียงเพราะคุณไม่ได้คิดว่ามันไม่ได้หมายความว่ามันท้าทายตรรกะและเหตุผล OP เป็นคำถามที่ดีพอที่เขาต้องการชี้ไปในทิศทางที่ถูกต้องไม่ได้รับแก้วอันใหญ่โต
user1783229

1
คุณสามารถเพิ่มพารามิเตอร์พิเศษจำนวนเท่าใดก็ได้โดยใช้ data-Anything และใช้. data ('any') ทุกที่ที่คุณจะทำ. value อย่างอื่น เพียงสลับอะไรก็ได้ที่มีมูลค่า 2 หรือคล้ายกับความชอบของคุณ

คำตอบ:


320

HTML Markup

<select id="select">
  <option value="1" data-foo="dogs">this</option>
  <option value="2" data-foo="cats">that</option>
  <option value="3" data-foo="gerbils">other</option>
</select>

รหัส

// JavaScript using jQuery
$(function(){
    $('select').change(function(){
       var selected = $(this).find('option:selected');
       var extra = selected.data('foo'); 
       ...
    });
});

// Plain old JavaScript
var sel = document.getElementById('select');
var selected = sel.options[sel.selectedIndex];
var extra = selected.getAttribute('data-foo');

ดูสิ่งนี้เป็นตัวอย่างการทำงานโดยใช้ jQuery ที่นี่: http://jsfiddle.net/GsdCj/1/
ดูว่านี่เป็นตัวอย่างการทำงานโดยใช้ JavaScript ธรรมดาที่นี่: http://jsfiddle.net/GsdCj/2/

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


@ jimsmith ใช่มันจะ (หากคุณพบว่าคำตอบเหล่านี้มีประโยชน์คุณควรลงคะแนนพวกเขานอกจากนี้คุณควรทำเครื่องหมายว่า "ยอมรับ" หากคุณพบว่าวิธีนี้แก้ปัญหาของคุณได้ดีที่สุด)
Phrogz

1
อะไร? ไม่มันจะไม่ มันจะทำงานในทุกเบราว์เซอร์ที่รองรับคุณสมบัติข้อมูล HTML5
glomad

13
@ithcy เบราว์เซอร์ทั้งหมดสนับสนุน (และมีมากกว่า 10 ปี) แอตทริบิวต์ "ไม่ถูกต้อง" ในมาร์กอัปและรับ / ตั้งค่าเหล่านี้ผ่าน DOM แอตทริบิวต์ "data" ของ HTML5 เป็นเพียงแอตทริบิวต์ที่กำหนดเองที่มีรูปแบบการตั้งชื่อและมาตรฐานใหม่ที่ประกาศว่าถูกต้องตามกฎหมาย
Phrogz

@Phrogz ฉันรู้เรื่องนี้ ไม่ใช่เรื่องของเบราว์เซอร์ "สนับสนุน" คุณสมบัติที่ไม่ถูกต้อง แต่เป็นเรื่องของการละเว้นพวกเขา ไม่มีวิธีอื่นในการเขียนเว็บเบราว์เซอร์ที่ใช้งานได้ :) อย่างไรก็ตามฉันคิดว่ามันเป็นการยืดการเรียกข้อมูลแอตทริบิวต์ "ถูกต้องตามหลักไวยากรณ์" - ขึ้นอยู่กับบริบทของคุณ หากคุณมีประเภท HTML5 แสดงว่าใช่ถูกต้อง ไม่เช่นนั้นไม่ได้และจะทำให้การตรวจสอบ W3C ล้มเหลว
23432 glomad

@ithcy เบราว์เซอร์ 'ละเลย' พวกเขาตราบเท่าที่พวกเขาทำอะไรพิเศษกับพวกเขา แต่พวกเขาไม่getAttribute()สนใจพวกเขาตราบเท่าที่พวกเขาอย่างเต็มที่พร้อมที่จะ ฉันตอบกลับการอ้างสิทธิ์ครั้งแรกของคุณว่าคำตอบของฉันจะไม่ทำงานในเบราว์เซอร์ทั้งหมด ฉันยืนตามแถลงการณ์ของฉันว่ามันจะทำงานในเบราว์เซอร์ 'ทั้งหมด' (สำหรับคำนิยามที่ค่อนข้างดีของ 'ทั้งหมด' ในกรณีนี้) แสดงเบราว์เซอร์ที่สนับสนุน jQuery ให้ฉัน แต่ไม่สามารถทำงานกับคุณลักษณะข้อมูลเหล่านี้ - แม้จะเป็นประเภทที่ไม่ใช่ HTML5 - และฉันจะกินคำพูดของฉัน
Phrogz

5

สำหรับฉันดูเหมือนคุณต้องการสร้างแอตทริบิวต์ใหม่หรือไม่ คุณต้องการ

<option value="2" value2="somethingElse">...

ในการทำเช่นนี้คุณสามารถทำได้

$(your selector).attr('value2', 'the value');

จากนั้นเมื่อต้องการเรียกคืนคุณสามารถใช้

$(your selector).attr('value2')

มันจะไม่เป็นรหัสที่ถูกต้อง แต่ฉันเดาว่ามันทำงานได้ดี


วิธีอื่นคือใช้ $ (selector) .data ('value2', "your value") และ $ (selector) .data ('value2') เพื่อดึงข้อมูล ... ซึ่งยังคงใช้ได้
mikesir87

ดีมันจะไม่ถูกต้องทางไวยากรณ์ที่จะมีคุณสมบัติที่ไม่ได้มาตรฐานในมาร์กอัปเดิม แต่) ฉันไม่เคยเห็นเบราว์เซอร์ใด ๆ ตั้งแต่วันที่ของ NS4 มีปัญหาใด ๆ กับเรื่องนี้และ b) ถ้าคุณสามารถแก้ไข DOM เพื่อสร้างบางสิ่งที่ "syntactically ไม่ถูกต้อง" จริง ๆ ไหม?
Phrogz

ใช่มันเป็นจริง ... ไม่ถูกต้อง เหตุใดจึงใช้คุณสมบัติตามอำเภอใจเมื่อคุณสมบัติ data- * ถูกกำหนดไว้ในมาตรฐาน html5
stephenbayer

3
ในฐานะที่เป็น @stephenbayer กล่าวถึง ... วิธีที่ถูกต้องในการทำเช่นนี้ในขณะนี้คือการใช้คุณสมบัติ data- * ที่รองรับ html5 คุณสมบัติเหล่านั้นไม่ได้อยู่ใกล้ ๆ / ใช้งานหนักเมื่อตอบกลับมาครั้งแรกในปี 2010 :)
mikesir87

2

ฉันทำสองตัวอย่างจากสิ่งที่ฉันคิดว่าคำถามของคุณอาจเป็น:

http://jsfiddle.net/grdn4/

ลองดูสิสำหรับการเก็บค่าเพิ่มเติม มันใช้คุณลักษณะข้อมูลเพื่อเก็บค่าอื่น ๆ :

http://jsfiddle.net/27qJP/1/


-1

มาร์กอัป HTML / JSP:

<form:option 
data-libelle="${compte.libelleCompte}" 
data-raison="${compte.libelleSociale}"   data-rib="${compte.numeroCompte}"                              <c:out value="${compte.libelleCompte} *MAD*"/>
</form:option>

รหัส JQUERY: กิจกรรม: เปลี่ยน

var $this = $(this);
var $selectedOption = $this.find('option:selected');
var libelle = $selectedOption.data('libelle');

หากต้องการมีองค์ประกอบ libelle.val () หรือ libelle.text ()


<form: option data-libelle-compte = "$ {compte.libelle} data-raison =" $ {compte.raison} "data-compte =" $ {compte.numero} "> <c: out value =" $ {compte.libelleCompte} MAD "/> </ form: option>
Fadid

-4

ในการจัดเก็บค่าอื่นในตัวเลือกที่เลือก:

$("#select").append('<option value="4">another</option>')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.