908

我有一个已知值的下拉列表。我想要做的是将下拉列表设置为我知道使用jQuery存在的特定值。使用常规JavaScript,我会做类似的事情:

ddl = document.getElementById("ID of element goes here");
ddl.value = 2; // 2 being the value I want to set it too.

但是,我需要使用jQuery来执行此操作,因为我正在为我的选择器使用CSS类(愚蠢的ASP.NET客户端 ID ...)。

以下是我尝试过的几件事:

$("._statusDDL").val(2); // Doesn't find 2 as a value.
$("._statusDDL").children("option").val(2) // Also failed.

我怎么能用jQuery做到这一点?


更新

事实证明,我第一次做对了:

$("._statusDDL").val(2);

当我在它上面放一个警报时它工作正常,但是当我删除警报并让它全速运行时,我得到了错误

无法设置选定的属性。无效索引

我不确定这是 jQuery 还是Internet Explorer 6的错误(我猜是 Internet Explorer 6),但这非常烦人。

4

18 回答 18

1071

jQuery 的文档指出:

[jQuery.val] 检查或选择与一组值匹配的所有单选按钮、复选框和选择选项。

此行为在jQuery版本1.2及更高版本中。

你很可能想要这个:

$("._statusDDL").val('2');
于 2009-01-31T19:43:42.750 回答
154

使用隐藏字段,您需要像这样使用:

$("._statusDDL").val(2);
$("._statusDDL").change();

或者

$("._statusDDL").val(2).change();
于 2012-10-09T10:21:54.843 回答
31

仅供参考,您不需要使用 CSS 类来完成此操作。

您可以编写以下代码行来获取客户端上的正确控件名称:

$("#<%= statusDDL.ClientID %>").val("2");

ASP.NET 将在 jQuery 中正确呈现控件 ID。

于 2009-04-21T02:16:22.783 回答
31

这些解决方案似乎假设下拉列表中的每个项目都有一个与其在下拉列表中的位置相关的val()值。

如果不是这种情况,事情会稍微复杂一些。

读取下拉列表的选定索引,您可以使用:

$("#dropDownList").prop("selectedIndex");

设置下拉列表的选定索引,您可以使用:

$("#dropDownList").prop("selectedIndex", 1);

请注意,prop()功能需要 JQuery v1.6 或更高版本。

让我们看看如何使用这两个函数。

假设您有一个月份名称的下拉列表。

<select id="listOfMonths">
  <option id="JAN">January</option>
  <option id="FEB">February</option>
  <option id="MAR">March</option>
</select>

您可以添加“上个月”和“下个月”按钮,查看当前选择的下拉列表项,并将其更改为上/下个月:

<button id="btnPrevMonth" title="Prev" onclick="btnPrevMonth_Click();return false;" />
<button id="btnNextMonth" title="Next" onclick="btnNextMonth_Click();return false;" />

这是这些按钮将运行的 JavaScript:

function btnPrevMonth_Click() {
    var selectedIndex = $("#listOfMonths").prop("selectedIndex");
    if (selectedIndex > 0) {
        $("#listOfMonths").prop("selectedIndex", selectedIndex - 1);
    }
}
function btnNextMonth_Click() {
    //  Note:  the JQuery "prop" function requires JQuery v1.6 or later
    var selectedIndex = $("#listOfMonths").prop("selectedIndex");
    var itemsInDropDownList = $("#listOfMonths option").length;

    //  If we're not already selecting the last item in the drop down list, then increment the SelectedIndex
    if (selectedIndex < (itemsInDropDownList - 1)) {
        $("#listOfMonths").prop("selectedIndex", selectedIndex + 1);
    }
}

我的网站对于展示如何使用 JSON 数据填充下拉列表也很有用:

http://mikesknowledgebase.com/pages/Services/WebServices-Page8.htm

于 2013-03-07T11:51:58.080 回答
27

试试看

$("._statusDDL").val("2");

而不是

$("._statusDDL").val(2);
于 2009-02-01T11:45:06.820 回答
21

在查看了一些解决方案之后,这对我有用。

我有一个包含一些值的下拉列表,我想从另一个下拉列表中选择相同的值...所以首先我放入第一个下拉列表的变量selectIndex

var indiceDatos = $('#myidddl')[0].selectedIndex;

然后,我在第二个下拉列表中选择该索引。

$('#myidddl2')[0].selectedIndex = indiceDatos;

笔记:

我想这是最短、可靠、通用和优雅的解决方案。

因为就我而言,我使用的是选定选项的数据属性而不是值属性。因此,如果您对每个选项都没有独特的价值,那么上述方法是最短的和甜蜜的!

于 2012-05-17T17:24:26.007 回答
17

我知道这是一个老问题,除某些情况外,上述解决方案都可以正常工作。

<select id="select_selector">
<option value="1">Item1</option>
<option value="2">Item2</option>
<option value="3">Item3</option>
<option value="4" selected="selected">Item4</option>
<option value="5">Item5</option>
</select>

所以项目 4 将在浏览器中显示为“已选择”,现在您要将值更改为 3 并将“项目 3”显示为已选择而不是项目 4。所以按照上述解决方案,如果您使用

jQuery("#select_selector").val(3);

您会在浏览器中看到第 3 项被选中。但是当您在 php 或 asp 中处理数据时,您会发现所选值为“4”。原因是,您的 html 将如下所示。

<select id="select_selector">
<option value="1">Item1</option>
<option value="2">Item2</option>
<option value="3" selected="selected">Item3</option>
<option value="4" selected="selected">Item4</option>
<option value="5">Item5</option>
</select>

它在服务器端语言中获得最后一个值为“4”。

所以我在这方面的最终解决方案

newselectedIndex = 3;
jQuery("#select_selector option:selected").removeAttr("selected");
jQuery("#select_selector option[value='"+newselectedIndex +"']").attr('selected', 'selected');  

编辑:在 "+newselectedIndex+" 周围添加单引号,以便可以将相同的功能用于非数值。

所以我实际上是删除了选定的属性,然后将新属性设为选定。

我很感谢@strager、@y0mbo、@ISIK 等高级程序员对此的评论

于 2015-02-11T07:52:29.367 回答
11

如果我们有一个标题为“数据分类”的下拉菜单:

<select title="Data Classification">
    <option value="Top Secret">Top Secret</option>
    <option value="Secret">Secret</option>
    <option value="Confidential">Confidential</option>
</select>

我们可以把它变成一个变量:

var dataClsField = $('select[title="Data Classification"]');

然后将我们希望下拉列表具有的值放入另一个变量中:

var myValue = "Top Secret";  // this would have been "2" in your example

然后我们可以使用我们放入的字段dataClsField,查找myValue并使用.prop()

dataClsField.find('option[value="'+ myValue +'"]').prop('selected', 'selected');

或者,您可以只使用.val(),但您的选择器.只有在它与下拉列表中的类匹配时才能使用,并且您应该在括号内的值上使用引号,或者只使用我们之前设置的变量:

dataClsField.val(myValue);
于 2015-09-18T19:51:40.140 回答
4

所以我改变了它,现在它使用 setTimeout 在 300 毫秒后执行。似乎现在正在工作。

从 Ajax 调用加载数据时,我曾多次遇到这种情况。我也使用 .NET,使用 jQuery 选择器时需要时间来适应 clientId。要纠正您遇到的问题并避免添加setTimeout属性,您可以简单地将“ async: false”放在 Ajax 调用中,它会给 DOM 足够的时间来将您添加到选择中的对象返回。下面是一个小样本:

$.ajax({
    type: "POST",
    url: document.URL + '/PageList',
    data: "{}",
    async: false,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (response) {
        var pages = (typeof response.d) == 'string' ? eval('(' + response.d + ')') : response.d;

        $('#locPage' + locId).find('option').remove();

        $.each(pages, function () {
            $('#locPage' + locId).append(
                $('<option></option>').val(this.PageId).html(this.Name)
            );
        });
    }
});
于 2010-06-21T04:59:23.773 回答
3

请注意——我一直在 jQuery 中使用通配符选择器来获取被 ASP.NET 客户端 ID 混淆的项目——这也可能对您有所帮助:

<asp:DropDownList id="MyDropDown" runat="server" />

$("[id* = 'MyDropDown']").append("<option value='-1'>&nbsp;</option>"); //etc

请注意 id* 通配符 - 即使名称为“ctl00$ctl00$ContentPlaceHolder1$ContentPlaceHolder1$MyDropDown”,它也会找到您的元素

于 2010-03-29T20:07:22.970 回答
3
<asp:DropDownList id="MyDropDown" runat="server" />

使用$("select[name$='MyDropDown']").val().

于 2010-10-07T20:25:53.630 回答
3

我使用扩展函数来获取客户端 ID,如下所示:

$.extend({
    clientID: function(id) {
        return $("[id$='" + id + "']");
    }
});

然后你可以像这样在 jQuery 中调用 ASP.NET 控件:

$.clientID("_statusDDL")
于 2011-04-07T02:05:17.553 回答
3

另一种选择是在.net 中设置控制参数ClientID="Static",然后您可以通过您设置的ID 访问JQuery 中的对象。

于 2012-03-12T15:05:42.750 回答
2

您如何将值加载到下拉列表中或确定选择哪个值?如果您使用 Ajax 执行此操作,那么在选择发生之前需要延迟的原因可能是因为在相关行执行时未加载值。这也可以解释为什么在设置状态之前将警报语句放在行上时它会起作用,因为警报操作会给数据加载提供足够的延迟。

如果您使用 jQuery 的 Ajax 方法之一,您可以指定一个回调函数,然后放入$("._statusDDL").val(2);您的回调函数中。

这将是一种更可靠的处理问题的方法,因为您可以确定该方法在数据准备好时执行,即使它花费的时间超过 300 毫秒。

于 2009-02-01T12:12:01.587 回答
1
<asp:DropDownList ID="DropUserType" ClientIDMode="Static" runat="server">
     <asp:ListItem Value="1" Text="aaa"></asp:ListItem>
     <asp:ListItem Value="2" Text="bbb"></asp:ListItem>
</asp:DropDownList>

ClientIDMode="静态"

$('#DropUserType').val('1');
于 2015-01-05T06:34:42.740 回答
1

就我而言,我能够使用 .attr() 方法让它工作。

$("._statusDDL").attr("selected", "");
于 2018-09-18T18:10:55.483 回答
1

纯JS

对于现代浏览器,使用 CSS 选择器对于纯 JS 来说不是问题

document.querySelector('._statusDDL').value = 2;

function change() {
  document.querySelector('._statusDDL').value = 2;
}
<select class="_statusDDL">
  <option value="1" selected>A</option>
  <option value="2">B</option>
  <option value="3">C</option>
</select>

<button onclick="change()">Change</button>

于 2020-06-26T20:06:19.927 回答
1

如果我们想从选项名称中查找,然后使用 jQuery 选择选项,请参见下面的代码:-

<div class="control">
           <select name="country_id" id="country" class="required-entry" title="Country" data-validate="{'validate-select':true}" aria-required="true">
              <option value=""> </option>
              <option value="SA">Saudi Arabia</option>
              <option value="AF">Afghanistan</option>
              <option value="AR">Argentina</option>
              <option value="AM">Armenia</option>
              <option value="AW">Aruba</option>
              <option value="AU">Australia</option>
              <option value="AT">Austria</option>
              <option value="IS">Iceland</option>
              <option value="IN">India</option>
              <option value="ID">Indonesia</option>
              <option value="IR">Iran</option>
              <option value="IQ">Iraq</option>
              <option value="IE">Ireland</option>
              <option value="IM">Isle of Man</option>
              <option value="IL">Israel</option>
              <option value="IT">Italy</option>
              <option value="JM">Jamaica</option>
              <option value="JP">Japan</option>
              <option value="JE">Jersey</option>
              <option value="JO">Jordan</option>
              <option value="AE">United Arab Emirates</option>
              <option value="GB">United Kingdom</option>
              <option value="US" selected="selected">United States</option>
           </select>
        </div>
<script type='text/javascript'>
let countryRegion="India";
     jQuery("#country option:selected").removeAttr("selected");
        let cValue= jQuery("#country option:contains("+countryRegion+")").val();
        jQuery("#country option[value='"+cValue +"']").attr('selected', 'selected');
</script>

我希望这个能帮上忙!

于 2021-12-20T05:14:42.510 回答