2013-07-25 80 views
4

因此,我正在編寫一個需要地址輸入的應用程序,並且我有一個select元素供用戶選擇州/省。它需要支持USCanada,所以它嵌套optgroups以將它們與單個第一級選項分開,因爲它是默認值。這是一個基本的例子:jQuery - 使用值或嵌套在optgroups中的選項設置選擇框的選定選項

<select name="state" id="state"> 
    <option class="co" value="" data-placeholder="true" disabled selected>Choose your state...</option> 
    <optgroup label="United States"> 
    <option class="co" value="AL">Alabama</option> 
    <option class="co" value="AK">Alaska</option> 
    <option class="co" value="AZ">Arizona</option> 
    </optgroup> 
    <optgroup label="Canada"> 
    <option class="co" value="AB">Alberta</option> 
    <option class="co" value="BC">British Columbia</option> 
    <option class="co" value="MB">Manitoba</option> 
    </optgroup> 

現在我需要以編程方式選擇從外部源相匹配輸入的選項,我要檢查的基礎上,選擇元件的兩個值或匹配其文本。然後將選擇哪個選項作爲選擇的選項。我知道你可以使用

$("#state").val(myValue) 

設置的值選定的選項,我知道你可以用這種方式設定基於文本的選項

var myText = "The state I want."; 
$("#state").children().filter(function() { 
    return $(this).text() == myText; 
}).prop('selected', true); 

有沒有乾淨的方式來做到這一點,而不必貫穿每個孩子並檢查它是否是一個選擇組,然後通過其所有孩子檢查比賽?有沒有一種簡單的方法通過jQuery來結合設置選定選項的值和文本方法?

另外一個複雜的問題,我將在外部jQuery插件中執行此操作。在函數我需要修改我有選擇的元素作爲變量

$element 

,所以我需要一種方法來做到這一點有點像這樣如果可能的話:

$element.descendents(":option").filter(function() { 
    //do the selecting here 
}).prop('selected', true); 
+1

也許使用jquery的has()類。 http://api.jquery.com/has/ – Charles380

+0

'$('#state option')。filter(function(){return $(this).text()=== mytext;})。prop('selected ',是);'? – vsr

+0

另外一個問題,我在jQuery插件中這樣做,以便函數接收select元素作爲參數。我將此添加到問題的底部。 – climbak

回答

15

解決。既然我已經有了我的元素傳遞給函數作爲一個jQuery變量$元素,我不能只使用標準選擇的形式:

$("#state option").filter(
    // filter function 
).prop('selected', true); 

很多的努力後,我得到了這一點,它工作原理:

function functionIHadToChange($element, value) { 
    // other code 
    $element.find("option").filter(function(){ 
     return (($(this).val() == value) || ($(this).text() == value)) 
    }).prop('selected', true); 
} 
24

如果你想選擇由期權的價值,用價值選擇:

var myText = "AZ"; 
$('#state option[value="' + myText + '"]').prop('selected', true); 

如果您想選擇的標籤進行搜索,使用過濾器:

var myText = "Arizona"; 
$('#state option').filter(function() { return $(this).html() == myText; }).prop('selected', true) 
1
$element = $('select#state'); 
$options = $element.find('option'); 
$wanted_element = $options.filter(function() { 
    return $(this).val() == "Alabama" || $(this).text() == "Alabama" 
}); 
$wanted_element.prop('selected', true); 

會是一種方法。

但我猜,不知道.find()方法的準確internas,到底jQuery將使用至少兩個循環本身來執行此...

+0

看起來你只是打敗了我。這基本上是我解決它的方法。 – climbak

5

我不知道我完全理解你的問題,但我試圖通過直接設置選擇框的值

來回答這個 fiddle

訣竅在於你可以選擇它

$("#state").val(a_value); 
2

您可以通過$("#select_id").prop("selectedIndex", 3); // Select index starts from zero.

這裏閱讀例如this設置。

1

我來晚了這裏,但爲今後的遊客,要做到這一點最簡單的方法是:

HTML

<select name="dept"> 
<option value="">This doctor belongs to which department?</option> 
<option value="1">Orthopaedics</option> 
<option value="2">Pathology</option> 
<option value="3">ENT</option> 
</select> 

jQuery的

$('select[name="dept"]').val('3'); 

輸出:這將積極ENT