使用jQuery更改下拉列表的选定值

时间:2009-01-31 19:39:02

标签: javascript jquery html-select

我有一个包含已知值的下拉列表。我想要做的是将下拉列表设置为我知道使用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),但它非常烦人。

16 个答案:

答案 0 :(得分:954)

jQuery's documentation州:

  

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

此行为位于jQuery版本1.2及更高版本。

你很可能想要这个:

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

答案 1 :(得分:119)

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

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

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

答案 2 :(得分:31)

只是一个FYI,您不需要使用CSS类来完成此任务。

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

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

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

答案 3 :(得分:23)

试试

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

而不是

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

答案 4 :(得分:19)

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

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

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

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

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

注意:

我想这是最短,最可靠,最普遍和最优雅的解决方案。

因为在我的情况下,我使用的是选定选项的数据属性而不是值属性。 因此,如果您没有为每个选项提供唯一值,则上述方法是最短且最甜蜜的!

答案 5 :(得分:19)

这些解决方案似乎假设您的下拉列表中的每个项目都有一个与其在下拉列表中的位置相关的 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

P !! !!

希望这有帮助。

答案 6 :(得分:14)

我知道这是一个老问题,上述解决方案除了在某些情况下工作正常。

喜欢

<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,并将“Item3”显示为已选择而不是Item4.So根据上述解决方案,如果您使用

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

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

<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等高级程序员的评论

答案 7 :(得分:4)

  

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

从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)
            );
        });
    }
});

答案 8 :(得分:3)

只是一个注释 - 我一直在jQuery中使用通配符选择器来获取被ASP.NET CLient ID混淆的项目 - 这也可能对你有所帮助:

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

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

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

答案 9 :(得分:3)

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

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

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

$.clientID("_statusDDL")

答案 10 :(得分:3)

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

答案 11 :(得分:2)

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

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

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

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

<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');

答案 14 :(得分:0)

就我而言,我可以使用.attr()方法使其正常工作。

$("._statusDDL").attr("selected", "");

答案 15 :(得分:0)

纯JS

对于modern browsers,使用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>