jQuery - การตั้งค่าที่เลือกของตัวควบคุมที่เลือกผ่านคำอธิบายข้อความ


530

ฉันมีการควบคุมที่เลือกและในตัวแปรจาวาสคริปต์ฉันมีสตริงข้อความ

การใช้ jQuery ฉันต้องการตั้งค่าองค์ประกอบที่เลือกของตัวควบคุมการเลือกให้เป็นรายการที่มีคำอธิบายข้อความที่ฉันมี (ตรงข้ามกับค่าที่ฉันไม่มี)

ฉันรู้ว่าการตั้งค่าตามตัวอักษรนั้นค่อนข้างน่ารำคาญ เช่น

$("#my-select").val(myVal);

แต่ฉันก็นิ่งงันกับการทำมันผ่านคำอธิบายข้อความ ฉันเดาว่าต้องมีวิธีในการรับค่าออกมาจากคำอธิบายข้อความ แต่สมองของฉันมันเกินไปบ่ายวันศุกร์ - ed เพื่อให้สามารถทำงานได้


1
@DanAtkinson กำลังจะทำเช่นเดียวกันกับตัวเอง เลือกไม่มีอะไรเกี่ยวข้องกับคำถามนี้
thecoshman

คำตอบ:


757

เลือกตามคำอธิบายสำหรับ jQuery v1.6 +

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).prop('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

jQuery เวอร์ชันต่ำกว่า 1.6 และมากกว่าหรือเท่ากับ 1.4

var text1 = 'Two';
$("select option").filter(function() {
  //may want to use $.trim in here
  return $(this).text() == text1;
}).attr('selected', true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>

โปรดทราบว่าแม้ว่าวิธีการนี้จะใช้งานได้ในเวอร์ชันที่สูงกว่า 1.6 แต่น้อยกว่า 1.9 แต่ก็ไม่ได้รับการสนับสนุนตั้งแต่ 1.6 มันจะไม่ทำงานใน jQuery 1.9+


รุ่นก่อนหน้า

val() ควรจัดการกับทั้งสองกรณี

$('select').val('1'); // selects "Two"
$('select').val('Two'); // also selects "Two"
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

<select>
  <option value="0">One</option>
  <option value="1">Two</option>
</select>


6
สิ่งนี้ให้ความรู้สึกว่ามันไม่ควรใช้งาน (ดูเหมือนว่ามันจะคลุมเครือ) แต่จริงๆแล้วมันก็ใช้ได้ดีสำหรับฉัน ขอบคุณ
DanSingerman

69
โปรดทราบว่าขณะนี้ jQuery 1.4 ได้เปลี่ยนลักษณะการทำงานนี้เพื่อเลือกโดยvalueหากมีการระบุแอททริบิวต์และจะเลือกเฉพาะข้อความหากแอvalueททริบิวนั้นหายไป ดังนั้นในตัวอย่างนี้$('select').val('Two')จะเลือกตัวเลือกที่สองใน 1.3.x แต่จะไม่ทำอะไรเลยใน 1.4.x
Crescent Fresh

18
ดังนั้นวิธีที่ดีที่สุดที่จะทำใน 1.4 ตอนนี้คืออะไร?
JR Lawhorne

4
ใน jQuery รุ่นที่ใหม่กว่า, .val ('not-an-option-value') จะรีเซ็ตตัวเลือกเป็นตัวเลือกแรก
dland

5
คำตอบแรกสำหรับคำถามนี้ดูเหมือนจะเป็นวิธีแก้ปัญหาโพสต์ 1.3.x stackoverflow.com/questions/3644449/…
DA

142

ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่อาจใช้ได้ผลกับคุณ

$("select#my-select option")
   .each(function() { this.selected = (this.text == myVal); });

90

ลองสิ่งนี้ ... เพื่อเลือกตัวเลือกด้วยข้อความ myText

$("#my-Select option[text=" + myText +"]").prop("selected", true);

@ คำตอบของ spoulson ทำงานสำหรับฉัน ... ฉันพยายามที่จะทำมันไม่ .each
เจย์คอร์เบต

2
ในหลายกรณีวิธีนี้ใช้ไม่ได้ผล ฉันยังต้องแก้ไข$("#my-Select option[text=" + myText +"]").get(0).selected = true;สไตล์คลาสสิคเป็นครั้งคราว: (...
Shahriyar Imanov

2
ตรวจสอบให้แน่ใจว่าคุณลบแอตทริบิวต์ที่เลือกไว้ก่อนการตั้งค่าอีกครั้งมิฉะนั้นจะไม่ทำงาน (ใช้งานได้สำหรับฉันใน 1.9)
esse

3
@ MarkW สำหรับ 1.9 ใช้.propแทน.attr; สาเหตุของการเปลี่ยนแปลงคือ 1.9 jQuery ปิดการใช้งานแฮ็กเก่าที่ให้คุณใช้.attrในการเปลี่ยนคุณสมบัติ DOM บางอย่างรวมถึงคุณสมบัติ HTML (Google javascript dom properties vs attributesหากคุณไม่ทราบความแตกต่าง)
Mark Amery

อัปเดตคำตอบเพื่อใช้.prop('selected', true)แทน.attr('selected', 'selected')สำหรับความเข้ากันได้ jQuery 1.9+
erwaman

43

ฉันทำอย่างนี้ (jQuery 1.9.1)

$("#my-select").val("Dutch").change();

หมายเหตุ: อย่าลืมการเปลี่ยนแปลง () ฉันต้องค้นหานานเพราะสิ่งนั้น :)


2
หวังว่าฉันจะโหวตได้หลายครั้ง เวลาผ่านไปหนึ่งชั่วโมงแล้วและตอนนี้ฉันสามารถกลับบ้านได้แล้ว
บ๊อบจอร์แดน

คำตอบที่ดี! สั้นและง่าย ... นี่ควรอยู่ด้านบน ... โหวตต่อไป
มูฮัมหมัด

มันใช้งานได้ในกรณีของฉันขอบคุณ! แต่สิ่งนี้ไม่ได้เลือกโดยข้อความที่แสดงตามที่ OP ร้องขอ แต่ด้วยค่าตัวเองซึ่ง OP ไม่มี?
Brandon Rhodes

21
$("#myselect option:contains('YourTextHere')").val();

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


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

1
จำไว้ว่ามันจะได้รับเฉพาะค่าสำหรับตัวเลือกแรกที่ตรงกับข้อความ
Russ Cam

นอกจากนี้คุณอาจห่วงโซ่ attr ( "เลือก", "เลือก") ลงบนชุดห่อแทน Val () และนี้จะทำงานคล้ายกับคำตอบของ CarolinaJay65
รัสบแคม

1
OP กล่าวว่า" การตั้งค่า"ไม่ใช่" การรับค่า"
RousseauAlexandre

15

เพื่อหลีกเลี่ยงภาวะแทรกซ้อนทุกรุ่น jQuery ฉันขอแนะนำให้ใช้ฟังก์ชั่นจาวาสคริปต์อย่างง่าย ๆ เหล่านี้ ...

function setSelectByValue(eID,val)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].value==val) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

function setSelectByText(eID,text)
{ //Loop through sequentially//
  var ele=document.getElementById(eID);
  for(var ii=0; ii<ele.length; ii++)
    if(ele.options[ii].text==text) { //Found!
      ele.options[ii].selected=true;
      return true;
    }
  return false;
}

ช่วยให้การเลือกตัวเลือกการเลือกผ่านค่าหรือข้อความ (ขึ้นอยู่กับฟังก์ชั่นที่เรียกว่า) ตัวอย่างเช่น: setSelectByValue ('sausages', '2'); จะค้นหาและเลือกตัวเลือกที่มีค่า "2" ในวัตถุการเลือกที่มีรหัส "ไส้กรอก"
เดฟ

2
@Neal Uh ... ตอบคำถามได้ไหม?
Mark Amery

10

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันไม่สามารถเลือกโดยใช้ข้อความโดยใช้ jQuery 1.10.3 และวิธีแก้ไขด้านบน ฉันลงเอยด้วยการใช้โค้ดต่อไปนี้ (ความหลากหลายของวิธีแก้ปัญหาของสปูลสัน):

      var textToSelect = "Hello World";

      $("#myDropDown option").each(function (a, b) {
            if ($(this).html() == textToSelect ) $(this).attr("selected", "selected");
        });

หวังว่าจะช่วยใครซักคน



7
 $("#Test").find("option:contains('two')").each(function(){
     if( $(this).text() == 'two' ) {
        $(this).attr("selected","selected");
     }
 });

คำสั่ง if จะจับคู่แบบตรงกับ "สอง" และ "สองสาม" จะไม่ถูกจับคู่


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

6

วิธีที่ง่ายที่สุดด้วย 1.7+ คือ:

$("#myDropDown option:text=" + myText +"").attr("selected", "selected"); 

1.9+

$("#myDropDown option:text=" + myText +"").prop("selected", "selected"); 

ผ่านการทดสอบและทำงาน


1
ไม่ใช่ใน 1.9+ ไม่ได้ ตั้งแต่ 1.6 คุณควรใช้.propเพื่อเปลี่ยนคุณสมบัติ DOM ไม่ใช่.attr(ซึ่งใช้สำหรับแอตทริบิวต์ HTML / DOM) ดูstackoverflow.com/q/5874652/1709587
Mark Amery

ฉันจะใช้ ("เลือก" จริง) แทนค่าความจริงของ "เลือก"
mplungjan


4

ลองดูที่ปลั๊กอิน jquery Selectedbox

selectOptions(value[, clear]): 

เลือกตัวเลือกโดยค่าใช้สตริงเป็นพารามิเตอร์หรือการแสดงออกปกติ$("#myselect2").selectOptions("Value 1");$("#myselect2").selectOptions(/^val/i);

คุณยังสามารถล้างตัวเลือกที่เลือกไว้แล้ว: $("#myselect2").selectOptions("Value 2", true);


3

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

$("#SelectMonth option[value=" + DataFromWebService + "]").attr('selected', 'selected'); 
$("#SelectMonth").selectmenu('refresh', true);

ดังนั้นการรีเฟรชตัวเลือกจึงเป็นสิ่งเดียวที่ฉันขาดหายไป


นี่คือสิ่งที่ถูกต้อง - altough ... ฉันไม่เห็นเหตุผลสำหรับบรรทัดที่สอง ควรทำงานตามที่เป็นอยู่
Sagive SEO

2

ฉันพบว่าการใช้attrคุณจะจบลงด้วยการเลือกหลายตัวเลือกเมื่อคุณไม่ต้องการ - โซลูชันคือการใช้prop:

$("#myDropDown option:text=" + myText +"").prop("selected", "selected");


1

ฉันมีปัญหากับตัวอย่างข้างต้นและปัญหาเกิดจากความจริงที่ว่าค่ากล่องที่เลือกของฉันถูกเติมข้อมูลล่วงหน้าด้วยสตริงความยาวคงที่จำนวน 6 ตัวอักษร แต่พารามิเตอร์ที่ส่งผ่านนั้นไม่ได้มีความยาวคงที่

ฉันมีฟังก์ชั่น rpad ซึ่งจะทำให้สตริงถูกต้องตามความยาวที่ระบุและด้วยอักขระที่ระบุ ดังนั้นหลังจาก padding พารามิเตอร์มันใช้งานได้

$('#wsWorkCenter').val(rpad(wsWorkCenter, 6, ' '));


function rpad(pStr, pLen, pPadStr) {
if (pPadStr == '') {pPadStr == ' '};
while (pStr.length < pLen)
    pStr = pStr + pPadStr;
return pStr; 
} 

1
 $('#theYear').on('change', function () {
 FY = $(this).find('option:selected').text();
 $('#theFolders').each(function () {
     $('option:not(:contains(' + FY + '))', this).hide();
 });
 $('#theFolders').val(0);
});

$('#theYear').on('mousedown', function () {
 $('#theFolders option').show().find('option:contains("Select")', this).attr('selected', 'selected');
});

0

คำตอบที่ยอมรับนี้ดูเหมือนจะไม่ถูกต้องในขณะที่. val ('newValue') นั้นถูกต้องสำหรับฟังก์ชั่นพยายามที่จะดึงตัวเลือกตามชื่อไม่ทำงานสำหรับฉันฉันต้องใช้ ID และ classname เพื่อรับองค์ประกอบของฉัน


0

นี่เป็นตัวเลือกที่ง่าย เพียงตั้งค่าตัวเลือกรายการของคุณจากนั้นตั้งค่าข้อความเป็นค่าที่เลือก:

$("#ddlScheduleFrequency option").selected(text("Select One..."));

-1

รับลูกของกล่องที่เลือก; วนรอบพวกเขา; เมื่อคุณพบสิ่งที่คุณต้องการให้ตั้งเป็นตัวเลือกที่เลือก กลับเท็จเพื่อหยุดการวนลูป

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