使用javaScript显示特定记录
问题描述:
我正在使用jQuery的javaScript。我有一些数据,但显示两次。使用javaScript显示特定记录
<input type="hidden" id="btnlistTime" />
for(var i = 0; i < msg.driverList.length; i++){
$.ajax({
type: "post",
url: "data/get_lastReportedTime.php",
data: {Driver: msg.driverList[i].fullname}
}).done(function (data){
$('#btnlistTime').val(data);
for(var i = 0; i < msg.driverList.length; i++){
OnlineDriver.push([msg.driverList[i].id,
msg.driverList[i].fullname,
$('#btnlistTime').val(),
msg.driverList[i].lat,
msg.driverList[i].lng,
msg.driverList[i].logintime]);
}
});
}
UpdateOnlineDriver(OnlineDriver);
function UpdateOnlineDriver(data) {
tableOnlineDriver = $('#tblDriverDetails').dataTable({
"data": data,
"bFilter": true,
"stateSave": true,
"columnDefs": [
{"sClass": "hide_me", "aTargets": [3]},
{"sClass": "hide_me", "aTargets": [4]},
{"sClass": "hide_me", "aTargets": [5]}
]
});
}
,并使用AJAX我从数据库中获取最后一次,并添加到msg.driverList,它是来自插座,像这样。
('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');
但问题是,当我referece它表明这样的页面,
('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');
所以请帮助我我该怎么解决这个问题,我想告诉喜欢,
('1059', 'Ashish', '9.962479', '-84.082434', '1324567890');
('1060', 'Ashish1', '9.962479', '-84.082434', '1324567890');
('1061', 'Bhargav', '9.962479', '-84.082434', '0987654321');
请帮助我,thax提前。
答
请尝试更改变量名的for循环如下:
for(var i = 0; i < msg.driverList.length; i++){
$.ajax({
type: "post",
url: "data/get_lastReportedTime.php",
data: {Driver: msg.driverList[i].fullname}
}).done(function (data){
$('#btnlistTime').val(data);
// change var "i" to "j"
for(var j = 0; j < msg.driverList.length; j++){
OnlineDriver.push([msg.driverList[j].id,
msg.driverList[j].fullname,
$('#btnlistTime').val(),
msg.driverList[j].lat,
msg.driverList[j].lng,
msg.driverList[j].logintime]);
}
});
}
答
你在你的代码的几个问题:
您提供
done
职能中的异步执行代码将在之后执行您的电话UpdateOnlineDriver(OnlineDriver)
。因此,首先将执行整个外部for
循环,然后UpdateOnlineDriver
,然后才会开始调用done
的回调函数。为了解决这个问题,你需要在done
回调中调用它,并且只有当你检索到最后一个数据时。这是没有意义的有回调函数内的
for
循环,因为它会单独为每个驱动程序已经(参见外环)被称为:算了算的push
电话你会做的数量:每个迭代外部循环,您将重新迭代所有驱动程序并执行push
。所以这是一个二次推动量。不能成为你想要的。一旦内
for
环路解除,您将有怎样的变化我第一次运行到结束的问题,然后才回调函数被调用许多次,每个的价值i等于阵列的长度。但是,您需要在回调的每次调用中获得不同的i值。要做到这一点,有很多解决方案,其中之一是使用let
而不是var
。
这里是for
循环部分的修正建议:
// Use "let" instead of "var" to have a locally scoped variable
// which is available within the $.ajax callback
for(let i = 0; i < msg.driverList.length; i++){
$.ajax({
type: "post",
url: "data/get_lastReportedTime.php",
data: {Driver: msg.driverList[i].fullname}
}).done(function (data){
// Do not iterate here.
$('#btnlistTime').val(data);
OnlineDriver.push([
msg.driverList[i].id,
msg.driverList[i].fullname,
$('#btnlistTime').val(),
msg.driverList[i].lat,
msg.driverList[i].lng,
msg.driverList[i].logintime
]);
// If this is the last entry, then call out
if (i === msg.driverList.length-1) {
UpdateOnlineDriver(OnlineDriver)
}
});
}
注意,你会一次又一次地改写的btnlistTime
的价值,所以它最终只显示最后获取的数据驱动程序。
想要在'btnlistTime'中显示什么:你在每次迭代中覆盖它,所以只有你设置的最后一个值会保留... – trincot