2013-07-25 50 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