Javascript 使用jQuery更改下拉列表的选定值
我有一个包含已知值的下拉列表。我试图做的是将下拉列表设置为我知道使用jQuery存在的特定值。 使用常规JavaScript,我将执行以下操作:Javascript 使用jQuery更改下拉列表的选定值,javascript,jquery,asp.net,html-select,Javascript,Jquery,Asp.net,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来实现这一点,因为我正在为我愚蠢的客户端ID使用CSS类 以下是我尝试过的几件事: $("._
ddl = document.getElementById("ID of element goes here");
ddl.value = 2; // 2 being the value I want to set it too.
然而,我需要用jQuery来实现这一点,因为我正在为我愚蠢的客户端ID使用CSS类
以下是我尝试过的几件事:
$("._statusDDL").val(2); // Doesn't find 2 as a value.
$("._statusDDL").children("option").val(2) // Also failed.
我如何使用jQuery实现它
更新
因此,事实证明,我第一次做对了:
$("._statusDDL").val(2);
当我把一个警报放在它上面时,效果很好,但是当我删除警报并让它全速运行时,我得到了错误
无法设置所选属性。无效索引
我不确定这是jQuery还是InternetExplorer6的一个bug,我猜是InternetExplorer6,但它非常烦人。指出:
[jQuery.val]检查或选择与该组值匹配的所有单选按钮、复选框和选择选项
这种行为在jQuery 1.2及更高版本中存在
您很可能希望:
$("._statusDDL").val('2');
试试看
$("._statusDDL").val("2");
而不是与
$("._statusDDL").val(2);
您如何将这些值加载到下拉列表中或确定要选择的值?如果使用Ajax执行此操作,那么在选择发生之前需要延迟的原因可能是因为在执行相关行时没有加载值。这也解释了为什么在设置状态之前在行上放置一条警报语句会起作用,因为警报操作会给数据加载带来足够的延迟 如果您使用的是jQuery的一种Ajax方法,那么可以指定一个回调函数,然后放入$。\u statusDDL.val2;进入回调函数
这将是一种更可靠的处理问题的方法,因为您可以确保在数据准备就绪时执行该方法,即使它花费的时间超过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'> </option>"); //etc
注意id*通配符-即使名称为ctl00$ctl00$ContentPlaceholder 1$ContentPlaceholder 1$MyDropDown,它也会找到您的元素
所以我改变了它,现在它
在300毫秒后使用
设置超时。现在好像在工作
在从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)
);
});
}
});
使用$select[name$='MyDropDown'].val.我使用扩展函数获取客户端ID,如下所示:
$.extend({
clientID: function(id) {
return $("[id$='" + id + "']");
}
});
然后可以在jQuery中调用ASP.NET控件,如下所示:
$.clientID("_statusDDL")
$("._statusDDL").val(2);
$("._statusDDL").change();
另一个选项是在.net中设置控件参数ClientID=Static,然后您可以通过设置的ID访问JQuery中的对象。在查看了一些解决方案后,这对我很有用 我有一个带有一些值的下拉列表,我想从另一个下拉列表中选择相同的值。。。首先,我在第一个下拉列表中输入一个变量selectIndex
var indiceDatos = $('#myidddl')[0].selectedIndex;
然后,我在第二个下拉列表中选择该索引
$('#myidddl2')[0].selectedIndex = indiceDatos;
注:
我想这是最短、可靠、通用和优雅的解决方案
因为在我的例子中,我使用的是选定选项的数据属性,而不是值属性。
因此,如果您没有每个选项的唯一值,则上述方法是最短和最甜的 对于隐藏字段,您需要这样使用:
$.clientID("_statusDDL")
$("._statusDDL").val(2);
$("._statusDDL").change();
或
这些解决方案似乎假设下拉列表中的每个项目都有一个与它们在下拉列表中的位置相关的val值
$('#myidddl2')[0].selectedIndex = indiceDatos;
如果不是这样的话,事情就复杂了一点
要读取下拉列表中选定的索引,请使用以下命令:
$("#dropDownList").prop("selectedIndex");
$("#dropDownList").prop("selectedIndex", 1);
要设置下拉列表的选定索引,请使用以下命令:
$("#dropDownList").prop("selectedIndex");
$("#dropDownList").prop("selectedIndex", 1);
注意,prop特性需要jqueryv1.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);
}
}
My site还可用于显示如何使用JSON数据填充下拉列表:
我知道这是一个老生常谈的问题,除了在某些情况下,上述解决方案都很有效 像
<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>
您将在浏览器中看到所选的项目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>
编辑:在+newselectedIndex+周围添加单引号,以便相同的功能可用于非数值
实际上,我要做的是删除选定的属性,然后将新属性设为选定属性
如果我们有一个标题为“数据分类”的下拉列表,我将非常感谢@strager、@y0mbo、@ISIK和其他高级程序员对此的评论:
<select title="Data Classification">
<option value="Top Secret">Top Secret</option>
<option value="Secret">Secret</option>
<option value="Confidential">Confidential</option>
</select>
然后在另一个变量中输入我们希望下拉列表具有的值:
var myValue = "Top Secret"; // this would have been "2" in your example
然后我们可以使用放入dataClsField的字段,查找myValue并使用.prop将其选中:
或者,您可以只使用.val,但您可以选择。只能在与下拉列表中的类匹配时使用,并且应在括号内的值上使用引号,或者只使用我们前面设置的变量:
dataClsField.val(myValue);
在我的例子中,我能够使用.attr方法使它工作
$("._statusDDL").attr("selected", "");
纯JS
对于纯JS来说,使用CSS选择器不是问题
document.querySelector('._statusDDL').value = 2;
功能改变{
document.querySelector'.\u statusDDL'.value=2;
}
A.
B
C
仅当javascript位于.aspx或.ascx标记内部时,而不是在.js文件中时(如此处所示)才起作用的更改。此外,根据控件嵌套在应用程序中的深度(在我的例子中,它们大约有10层深),ClientID可能会变得非常长,如果使用太多,实际上会给javascript的大小增加很大的膨胀。我尽量保持我的标记尽可能小,如果可以的话。@y0mbo但是即使你转向MVC,你仍然应该为你的JavaScript使用外部的.JS文件,这样浏览器和代理服务器可以缓存它以提高性能。@Roberto-但是MVC没有使用asp.net webforms那样愚蠢的命名约定,所以你可以在外部的JS文件中轻松地引用你需要的控件。如果你创建OO风格的javascript,您可以将客户端ID传递到对象的构造函数中。目标代码都包含在外部js文件中,但您可以从aspx代码中实例化它。我最好在asp控件上设置ClientIDMode=Static,这样您就知道ID将是您指定的ID。但是,如果你要把那个控件放在中继器中,你必须小心。这里的问题最终成为IE6的一个问题。我正在为select元素创建新的option元素,然后尝试将值设置为这些新创建的option元素之一。IE6错误地等待,直到它从脚本获得控制权,才真正在DOM中创建新元素。发生的事情是,我试图将下拉列表设置为不存在的选项,即使它们应该存在;dd1.0值=2;如果“选择”处于隐藏状态,则此操作是否有效?显示:无;?我无法让它正常工作…这使我免于编写类似$'的东西。_statusDDL[value=2]'。attr'selected',true;谢谢@Nordes如果获得选定的值,则会出现这种情况。在这种情况下,它正在设置选定的值,或者更准确地说,设置选定的选项。@JL:您需要添加.change以在下拉列表前端查看该选项,即$'myID'.val3.change;链接。更改应添加到答案中。我想我已经疯了,这个解决方案不起作用了,直到我读了下面的评论。如果你匹配的名称,你可能会删除$,所以它是一个完整的匹配,而不是“以结尾”。但是你的建议可能比只匹配一个类名要快。更快的是element.classname或idname。这是正确的答案,每个没有立即说“selectedIndex”的人都应该更清楚。Hurray DOM API和石器时代的人。你能解释一下为什么你需要为隐藏字段触发更改事件吗?@Samuel:因为如果你用jQuery更改select的选定选项,更改不会被触发,因此,需要手动触发。如果在更改dropbox的值后需要触发更改事件,则需要在设置值后调用更改函数。我特别需要触发更改事件,因此这对重复相同故事的记忆答案最有帮助,对我来说,关键的解决方案是更改。哇,这变化让我的一天变好了
dataClsField.val(myValue);
$("._statusDDL").attr("selected", "");
document.querySelector('._statusDDL').value = 2;