Tôi cần chọn bộ chọn nào bằng văn bản của nó?


206

Tôi cần kiểm tra nếu một <select>tùy chọn có văn bản bằng với một giá trị cụ thể.

Ví dụ, nếu có <option value="123">abc</option>, tôi sẽ tìm "abc".

Có một bộ chọn để làm điều này?

Tôi đang tìm kiếm một cái gì đó tương tự $('#select option[value="123"]');nhưng cho văn bản.


Hmm ... hascâu trả lời trong SLaks rất hữu ích, nhưng điểm trong câu trả lời của Floyd cũng tốt ... Tôi không biết phải chấp nhận điều gì.
Hailwood

Ngoài ra, những trường hợp này có nhạy cảm? (tôi đang tìm kiếm trường hợp không nhạy cảm và luôn có thể chuyển đổi thành thấp hơn
Hailwood

1
Tôi sử dụng hàm lõi JavaScript .toLowerCase () và so sánh, nếu không yêu cầu phân biệt chữ hoa chữ thường. Ngoài ra, chấp nhận trả lời câu trả lời hữu ích nhất cho câu hỏi của bạn. :)
Hari Pachuveetil

nó không hoạt động cho một danh sách thả xuống có API đa lựa chọn ?? Tôi đã thử tất cả các giải pháp có thể bt không có may mắn. Tôi đang sử dụng API dropdowm multiselect của eric hynd. Bất cứ ai có thể giải quyết vấn đề này?
Chaitanya Chandurkar

Câu trả lời:


319

Điều này có thể giúp:

$('#test').find('option[text="B"]').val();

Demo fiddle

Điều này sẽ cung cấp cho bạn tùy chọn với văn bản Bchứ không phải những cái có văn bản chứa B. Hi vọng điêu nay co ich

Đối với các phiên bản gần đây của jQuery, phần trên không hoạt động. Như đã nhận xét bởi Quandary bên dưới, đây là những gì hoạt động cho jQuery 1.9.1:

$('#test option').filter(function () { return $(this).html() == "B"; }).val();

Cập nhật fiddle


1
điều này không hoạt động với các phiên bản mới nhất của jquery (nếu bạn xóa 'value =' khỏi <tùy chọn>)
KevinDeus

27
@KevinDeus: Tại sao downvote!? Câu trả lời là cho phiên bản jQuery rồi!
Hari Pachuveetil

11
Thay vào đó, hãy sử dụng $ ('# tùy chọn kiểm tra'). Filter (function () {return $ (this) .html () == "B";}). Val ();
Stefan Steiger

84
@Quandary Tuy nhiên, đó không phải là lý do hợp lệ để bỏ phiếu trả lời khi nhận xét ngắn sẽ đủ. Hay bạn mong đợi anh ta kiểm tra lại tất cả các câu trả lời của mình cho mỗi bản phát hành mới của jQuery?
WynandB

2
Tôi nghĩ rằng downvote là do thực tế là ví dụ trên chỉ tìm thấy giá trị được chọn và không đặt giá trị được chọn.
nivs1978

133

Bạn có thể sử dụng :contains()bộ chọn để chọn các thành phần có chứa văn bản cụ thể.
Ví dụ:

$('#mySelect option:contains(abc)')

Để kiểm tra xem một <select>phần tử đã cho có tùy chọn như vậy hay không, hãy sử dụng .has()phương thức :

if (mySelect.has('option:contains(abc)').length)

Để tìm tất cả <select>các tùy chọn có chứa tùy chọn như vậy, hãy sử dụng :has()bộ chọn :

$('select:has(option:contains(abc))')

3
:containsbây giờ không dứt khoát phải không?
Hari Pachuveetil

Vấn đề chính xác với chứa là gì?
Ogier Schelvis

Làm thế nào bạn sẽ làm điều này với chỉ các tùy chọn được lựa chọn?
chập chững

Điều này cũng không lấy một tùy chọn với 123abcdef?
Teepeemm

@Teepeemm Vâng, đó là sự khác biệt giữa hai câu trả lời hàng đầu. Kiểm tra hàng đầu chỉ trả về tùy chọn chỉ với văn bản cụ thể, cái này trả về tùy chọn chứa, nhưng không chỉ, văn bản cụ thể đó. Điều trùng hợp là điều tôi thực sự cần vào lúc này, vì vậy tôi rất vui mừng khi đăng nó.
Lee A.

30

Không có đề xuất nào trước đây hoạt động với tôi trong jQuery 1.7.2 vì tôi đang cố gắng đặt chỉ mục được chọn của danh sách dựa trên giá trị từ hộp văn bản và một số giá trị văn bản được chứa trong nhiều tùy chọn. Tôi đã kết thúc bằng cách sử dụng như sau:

$('#mySelect option:contains(' + value + ')').each(function(){
    if ($(this).text() == value) {
        $(this).attr('selected', 'selected');
        return false;
    }
    return true;
});

1
Tôi nghĩ rằng đây là câu trả lời tốt nhất bởi vì nó thực sự trả về kết quả chính xác. Nhưng tôi không thể không nghĩ rằng bỏ qua containshoàn toàn có thể thực sự tăng tốc mọi thứ.
styfle

Điều này hiệu quả với tôi nhưng trong kịch bản của tôi, tôi có thể nhấp vào chỉnh sửa trên lưới nhiều lần nên phải xóa thuộc tính được chọn khi không có kết quả trùng khớp nếu không tùy chọn đầu tiên được chọn sẽ vẫn còn cho các lần chỉnh sửa tiếp theo. other {$ (this) .attr ('được chọn', ''); trả lại sai; }
đặc biệt

Giải pháp này hiệu quả với tôi nhưng thay vì cài đặt thuộc tính tùy chọn, để thực sự thay đổi menu chọn tôi cần làm: $(this).parent().val($(this).val()); Bạn có thể làm cả hai, nhưng đối với tôi chỉ thiết lập cha mẹ val()đã thực hiện thủ thuật.
billynoah

20

Tôi phải đối mặt với cùng một vấn đề dưới đây là mã làm việc:

$("#test option").filter(function() {
    return $(this).text() =='Ford';
}).prop("selected", true);

Bản trình diễn: http://jsfiddle.net/YRBrp/83/


15

Điều này làm việc cho tôi: $("#test").find("option:contains('abc')");


3
Bạn nên thêm một lời giải thích tại sao nó cũng hoạt động.
Hannes Johansson

@HannesJohansson Hoặc ít nhất anh ta nên giải thích nó khác biệt như thế nào hoặc thêm một cái gì đó mới vào câu trả lời của SLaks đã gần năm tuổi. ; ^)
ruffin

4
Hãy chắc chắn rằng bạn cũng nhận ra rằng điều này cũng sẽ tìm thấy tùy chọn này: <tùy chọn> abcd </ tùy chọn>.
Charles

Cảm ơn điều này hoàn toàn chính xác và những gì mọi người đã bỏ lỡ là thêm .attr ('value'); đến cuối cùng. Đây là cách dễ nhất để thực sự nhận được giá trị để sử dụng một cách năng động! Vì vậy, mã đầy đủ nên như thế này. $("#testselect").find("option:contains('option-text')").attr('value'); bằng cách đó bạn có thể sử dụng một sự kiện như .click()để thay đổi cài đặt.
ChrisKsag

12

Đây là phương pháp tốt nhất để chọn văn bản trong danh sách thả xuống.

$("#dropdownid option:contains(your selected text)").attr('selected', true);

3
Như với câu trả lời tương tự, điều này sẽ tìm thấy một tùy chọn với this is your selected text plus more.
Teepeemm

4

Tôi đã thử một vài trong số những thứ này cho đến khi tôi có một cái để hoạt động trong cả Firefox và IE. Đây là những gì tôi đã đưa ra.

$("#my-Select").val($("#my-Select" + " option").filter(function() { return this.text == myText }).val());

một cách khác để viết nó trong một fading dễ đọc hơn:

var valofText = $("#my-Select" + " option").filter(function() {
    return this.text == myText
}).val();
$(ElementID).val(valofText);

Mã giả:

$("#my-Select").val( getValOfText( myText ) );

Có ý nghĩa với các phiên bản mới nhất của jQuery
Fr0zenFyr

Điểm của là "#my-Select" + " option"gì? Tại sao không chỉ "#my-Select option"?
Teepeemm

3

Sử dụng sau đây

$('#select option:contains(ABC)').val();

1
mã bạn cung cấp có thể giải quyết vấn đề nhưng vui lòng thêm một mô tả ngắn gọn về cách giải quyết vấn đề này. Chào mừng bạn đến với Stack Overflow, nên đọc Cách trả lời .
Dan Beaulieu

3
nếu có một số tùy chọn: ABC, ABCD, ABCDEF, thì sao?
hungndv

1

Điều này sẽ hoạt động trong jQuery 1.6 (lưu ý dấu hai chấm trước dấu ngoặc mở), nhưng không thành công trên các bản phát hành mới hơn (1.10 tại thời điểm đó).

$('#mySelect option:[text=abc]")

5
Thật thú vị nhưng thật không may, nó dường như không hoạt động (jQuery 1.10.2).
WynandB

Bạn sẽ muốn bao gồm một cái gì đó giống như $("#mySelect option").filter(function() { return this.text == "abc"; });sẽ hoạt động với các phiên bản mới nhất của jQuery .. Hoặc có thể là một số cách khác mà bạn thích sử dụng ..
Fr0zenFyr

1

Đối với phiên bản jquery 1.10.2 dưới đây làm việc cho tôi

  var selectedText="YourMatchText";
    $('#YourDropdownId option').map(function () {
       if ($(this).text() == selectedText) return this;
      }).attr('selected', 'selected');
    });

1

Công việc này đối với tôi

$('#mySelect option:contains(' + value + ')').attr('selected', 'selected');

0

Điều này làm việc cho tôi:

var result = $('#SubjectID option')
            .filter(function () 
             { return $(this).html() == "English"; }).val();

Các resultbiến sẽ trở lại với chỉ số của các giá trị văn bản phù hợp. Bây giờ tôi sẽ chỉ thiết lập nó bằng chỉ mục của nó:

$('#SubjectID').val(result);

-1

Hoặc bạn lặp qua các tùy chọn hoặc đặt cùng một văn bản bên trong một thuộc tính khác của tùy chọn và chọn với nó.


-1

Điều này cũng sẽ làm việc.

$ ('# test'). find ("tùy chọn select: chứa ('B')"). filter (": đã chọn");


2
Điều này cũng sẽ lấy tùy chọn ABC.
Teepeemm

-1

Như được mô tả trong câu trả lời này , bạn có thể dễ dàng tạo bộ chọn của riêng mình cho hasText. Điều này cho phép bạn tìm tùy chọn với$('#test').find('option:hastText("B")').val();

Đây là phương thức hasText tôi đã thêm:

 if( ! $.expr[':']['hasText'] ) {
     $.expr[':']['hasText'] = function( node, index, props ) {
       var retVal = false;
       // Verify single text child node with matching text
       if( node.nodeType == 1 && node.childNodes.length == 1 ) {
         var childNode = node.childNodes[0];
         retVal = childNode.nodeType == 3 && childNode.nodeValue === props[3];
       }
       return retVal;
     };
  }

-2

Điều này làm việc cho tôi

var options = $(dropdown).find('option');
var targetOption = $(options).filter(
function () { return $(this).html() == value; });

console.log($(targetOption).val());

Cảm ơn tất cả các bài viết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.