使用jQuery设置select后,无法使用jQuery获取select的选定值
Cannot get selected value of select with jQuery when the select has been set with jQuery
我正在尝试创建一些级联下拉列表,我有一个我构建的函数,它起了一半的作用:
function CascadeDropDowns(parentClass, childClass, action) {
var DropDownId = $(parentClass + " option:selected").val();
$.ajax({
url: "/Terminals_configuration/" + action,
data: { DropDownId: DropDownId },
dataType: "json",
type: "POST",
error: function () {
alert("An error occurred.");
},
success: function (data) {
var items = "";
$.each(data, function (i, item) {
items += "<option value='"" + item.Value + "'">" + item.Text + "</option>";
});
$(childClass).html(items);
$(childClass)[0].selectedIndex = 0;
}
});
}
$(document).ready(function(){
$(".DeviceTypeDDL").change(function () {
CascadeDropDowns(".DeviceTypeDDL", ".ConfigGroupDDL", "GetGroups");
CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");
});
$(".ConfigGroupDDL").change(function () {
CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");
});
});
相关HTML-jQuery v1.8.2链接未包含在此处!
<form action="/Terminals_configuration" method="post"> <fieldset>
<legend>
<h2>Configuration settings</h2>
</legend>
<div class="editor-label">
<label for="DeviceType">Device type</label>
</div>
<div class="editor-field">
<select class="DeviceTypeDDL" data-val="true" data-val-number="The field DeviceTypeSelectedItem must be a number." id="DeviceTypeSelectedItem" name="DeviceTypeSelectedItem"><option value="8">IT</option>
<option value="9">RS</option>
</select>
<span class="field-validation-valid" data-valmsg-for="DeviceTypeSelectedItem" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="ConfigGroup">ConfigGroup</label>
</div>
<div class="editor-field">
<select class="ConfigGroupDDL" data-val="true" data-val-number="The field ConfigGroupSelectedItem must be a number." id="ConfigGroupSelectedItem" name="ConfigGroupSelectedItem"><option value="-1">No value</option>
</select>
<span class="field-validation-valid" data-valmsg-for="ConfigGroupSelectedItem" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="ConfigName">ConfigName</label>
</div>
<div class="editor-field">
<select class="ConfigNameDDL" data-val="true" data-val-number="The field ConfigNameSelectedItem must be a number." id="ConfigNameSelectedItem" name="ConfigNameSelectedItem"><option value="-1">No value</option>
</select>
<span class="field-validation-valid" data-valmsg-for="ConfigNameSelectedItem" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="ConfigValue">ConfigValue</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-required="Please enter the configuration value" id="ConfigValue" name="ConfigValue" type="text" value="" />
<span class="field-validation-valid" data-valmsg-for="ConfigValue" data-valmsg-replace="true"></span>
</div>
<div class="editor-label">
<label for="MergeOrDelete">MergeOrDelete</label>
</div>
<div class="editor-field">
<select class="MergeDeleteDDL" data-val="true" data-val-number="The field MergeOrDeleteSelectedItem must be a number." id="MergeOrDeleteSelectedItem" name="MergeOrDeleteSelectedItem"><option value="0">Delete</option>
<option value="1">Merge</option>
</select>
<span class="field-validation-valid" data-valmsg-for="MergeOrDeleteSelectedItem" data-valmsg-replace="true"></span>
</div>
<p>
<input type="submit" value="Add" />
</p>
</fieldset>
</form>
问题是,当第一个下拉列表更改时,我需要填充两个子项。当第二个下拉列表更改时,我只需要填充一个子项。
我认为通过设置$(childClass)[0].selectedIndex = 0;
,可以选择这个值,这样当函数第二次使用刚刚填充的子下拉列表时,它就可以获得这个值,但它没有。
我想目前DOM中可能还没有新的,但我不确定。
任何帮助都会很棒。
第二个CascadeDropDowns
函数可能是在第一个函数执行完成之前执行的(因为您正在执行异步的AJAX调用(。
让第二个函数等待第一个函数的一种方法是利用jQuery延迟:
function CascadeDropDowns(parentClass, childClass, action) {
var completeDeferred = $.Deferred();
var DropDownId = $(parentClass + " option:selected").val();
$.ajax({
url: "/Terminals_configuration/" + action,
data: { DropDownId: DropDownId },
dataType: "json",
type: "POST",
error: function () {
alert("An error occurred.");
},
success: function (data) {
var items = "";
$.each(data, function (i, item) {
items += "<option value='"" + item.Value + "'">" + item.Text + "</option>";
});
$(childClass).html(items);
$(childClass)[0].selectedIndex = 0;
completeDeferred.resolve();
}
});
return completeDeferred;
}
然后使用返回的递延:
$(".DeviceTypeDDL").change(function () {
var deferred = CascadeDropDowns(".DeviceTypeDDL", ".ConfigGroupDDL", "GetGroups");
deferred.then(function() {
CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");
})
});
一个更简单的方法可能是修改函数以接受回调:
function CascadeDropDowns(parentClass, childClass, action, callback) {
var DropDownId = $(parentClass + " option:selected").val();
$.ajax({
url: "/Terminals_configuration/" + action,
data: { DropDownId: DropDownId },
dataType: "json",
type: "POST",
error: function () {
alert("An error occurred.");
},
success: function (data) {
var items = "";
$.each(data, function (i, item) {
items += "<option value='"" + item.Value + "'">" + item.Text + "</option>";
});
$(childClass).html(items);
$(childClass)[0].selectedIndex = 0;
if (callback) {
callback();
}
}
});
}
然后这样使用:
$(".DeviceTypeDDL").change(function () {
var callback = function() {
CascadeDropDowns(".ConfigGroupDDL", ".ConfigNameDDL", "GetParameters");
};
CascadeDropDowns(".DeviceTypeDDL", ".ConfigGroupDDL", "GetGroups", callback);
});
如果您知道需要选择的选项的值,您可以使用:
$(childClass).val(valOfOption);
这里发布了一些其他选项
相关文章:
- jquery select()/window.get选择仅在鼠标抬起后更新
- 带文本区域的jQuery SELECT
- jQuery select:使用$(.class)获取不同的var
- 在jquery select类名与id's
- 从jQuery select访问插件方法
- jquery select onchange - opencart 2.x register account page
- 动态生成 jQuery select 语句
- Jquery select target of href
- .live() 中的 jQuery .select() 在 IE7 和 IE8 上不起作用
- jQuery - select 下拉列表 - focusout 在 select 之前触发
- jQuery Select All Checkbox with toggleClass
- jQuery select menu ajax 3 levels
- Javascript: Jquery Select-Object-by-Attribute-Value doen'
- jQuery .select 可以工作,但 Javascript .select 不能
- jQuery Select元素,具有基于类集的多个类
- jQuery select add update and remove
- 用多个列表填充jquery select下拉表单
- 使用jquery select all选项发出问题
- JavaScript OR jQuery select元素中出错
- POST from jQuery Select