问题描述:通过选择【账户】,动态添加【资金】的元素,
并且通过获取【账户】【资金】的值,进行查询。
但是获取的资金元素的值是undefine。
$("select[name='proAccout']", container).change(function () {
var params = {};
var proAccout = $(this).val();
params["proAccout"] = $.trim(proAccout);
if (params["proAccout"] != "") {
getAccIDByProAccout(params);
} else {
$("div[name='accID']", container).empty().append('<select class="select input" name="accID"></select>');
}
var accID = $("select[name='accID']", container).val();
params["accID"] = accID ? $.trim(accID) : ""; //
if (params["proAccout"] != "" && params["accID"] != "" ) {
PRODUCT_CX(params); //查询相关信息
}
}).change();
var getaccIDByProAccout= function (params) {
base_ajaxPost("url", *true*, params, "json",
function (data, status) {
if (data && data.success && parseInt(data.code) > 0) {
var result = data.object;
//拼接资金select下来菜单
var containerDiv = $("div[name='accID']", container).empty();
if (result && result.length > 0) {
containerDiv.append('<select class="select input" name="accID"></select>');
for (var i = 0; i < result.length; i++) {
$("select[name='accID']", containerDiv).append('<option value="' + result[i].accID+ '" selected="selected">' + result[i].accountName + '</option>')
}
} else {
containerDiv.append('<select class="select input" name="accID"></select>' + '<div style="display: none;">' + data + '</div>');
}
} else {
$("div[name='accID']", container).empty().append('<select class="select input" name="accID"></select>' + '<div style="display: none;">' + data + '</div>');
}
}, function (text, msg, e) {
Alert(msg, null);
}
);
};
解决方案:由于异步请求,请求还没完成,就去获取val(),导致取到的值是undefine,将异步改成同步,则可以解决。
var getAccIDByProAccout= function (params) {
base_ajaxPost("url",**false**, params, "json",
function (data, status) {
...
}
}
);
官方解释
By default, all requests are sent asynchronously (i.e. this is set to true by default). If you need synchronous requests, set this option to false.Cross-domain requests and dataType: “jsonp” requests do not support synchronous operation. Note that synchronous requests may temporarily lock the browser, disabling any actions while the request is active.
sync默认是true,即为异步方式,
.
a
j
a
x
执
行
后
,
会
继
续
执
行
a
j
a
x
后
面
的
脚
本
,
直
到
服
务
器
端
返
回
数
据
后
,
触
发
.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发
.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发.ajax里的success方法。若要将其设置为false,则所有的请求均为同步请求,在没有返回值之前,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。https://api.jquery.com/jQuery.ajax/
总结:
使用同步和异步的场景
异步:在异步模式下,当我们使用AJAX发送完请求后,可能还有代码需要执行。这个时候可能由于种种原因导致服务器还没有响应我们的请求,但是因为我们采用了异步执行方式,所有包含AJAX请求代码的函数中的剩余代码将继续执行。如果我们是将请求结果交由另外一个JS函数去处理的,那么,这个时候就好比两条线程同时执行一样。
同步:在同步模式下,当我们使用AJAX发送完请求后,后续还有代码需要执行,我们同样将服务器响应交由另一个JS函数去处理,**但是这时的代码执行情况是:在服务器没有响应或者处理响应结果的JS函数还没有处理完成return时,包含请求代码的函数的剩余代码是不能够执行的。**就好比单线程一样,请求发出后就进入阻塞状态,知道接触阻塞余下的代码才会继续执行。
什么时候用用同步模式呢?当你向服务器获取数据,需要等待数据返回后再继续其他代码时,这时候就可以同步模式。
在实际开发项目中,如要获取下拉数据后并要显示用户之前选择的选项,这时候就需要先获取下拉选项后再选择用户选择的选项,有一个先后顺序,则必须选择用同步模式。
这里,下拉账户后,通过账户获取资金的值,需选择同步模式。