我有一个已知值的下拉列表。我要做的是将下拉列表设置为我知道使用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的bug(我猜是Internet Explorer 6),但这非常烦人。


jQuery的文档声明:

(jQuery。Val]检查或选择所有单选按钮、复选框,并选择与该值集匹配的选项。

这个行为在jQuery 1.2及以上版本中。

你很可能想要这个:

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

添加.change()以查看下拉列表前端的选项:

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

试试

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

而不是和

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

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

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

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


仅供参考,你不需要使用CSS类来完成这一点。

你可以写下面这行代码在客户端上获得正确的控件名称:

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

ASP。NET将在jQuery内部正确地呈现控件ID。


只是一个注释-我一直在使用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”


所以我把它改了 在300毫秒使用后执行 setTimeout。现在好像起作用了。

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

$.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)
            );
        });
    }
});

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

使用$(“选择[名称$ = ' MyDropDown '] ") .val()。


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

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

然后您可以调用ASP。jQuery中的NET控件如下:

$.clientID("_statusDDL")

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


在研究了一些解决方案后,这对我来说很管用。

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

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

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

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

注意:

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

因为在我的例子中,我使用selected option的data属性而不是value属性。 所以如果你对每个选项都没有独特的价值,上面的方法是最简单和甜蜜的!!


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

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

or

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

这些解决方案似乎假设下拉列表中的每个项都有一个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


<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=“Static”

$('#DropUserType').val('1');

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

就像

<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>

因此,Item4将在浏览器中显示为“Selected”,现在您想将值更改为3,并显示“Item3”,而不是Item4。所以按照上面的解决方案,如果你使用

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

您将在浏览器中看到Item 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等高级程序员的评论


如果我们有一个标题为“Data Classification”的下拉列表:

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

在我的情况下,我能够让它工作使用.attr()方法。

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

纯JS

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

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

函数变化(){ document.querySelector(“._statusDDL”)。Value = 2; } <选择类= " _statusDDL " > <option value="1" selected>A</option> . B <选项值= " 2 " > < /选项> <选项值= 3 > C > < /选项 < /选择> <按钮onclick = "变化()“>改变> < /按钮


如果我们想从选项名中找到然后用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>

我希望这对你有所帮助!