我有一个jquery数据表,它显示我的数据(见下文)。您会注意到最后一列是地址,而行数据只是表示加载。
我想使用数据中的经度和纬度从谷歌地图api获取地址。
我知道获取地址可能需要一些时间,如果返回3000个结果,则需要很长时间,这就是为什么我没有在数据中传递预先编码的地址。
显示表数据后,我可以开始为每行的lat / lng进行地理编码,并在每个行完成时更新地址列吗?
我也使用谷歌地图的GMAP3 jQuery插件,所以我可以得到这样的地址:
// get address
$("#map").gmap3({
action: 'getAddress',
latLng: [lati, longi],
callback: function (results) {
content = results && results[1] ? results && results[1].formatted_address : 'No Address';
} // end callback
});
更新
差不多完成了:) 这些类被添加到lat,long和address ok,我正在接收控制台中的地理编码地址。我需要做的就是将地址放入表格中的正确行。我该怎么做?
我的代码 var historyArray = window.opener.historyArray;
$(document).ready(function() {
//$('#dynamic').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="report"></table>' );
$('#report').dataTable( {
"aaData": historyArray,
"aoColumns": [
{ "mDataProp": "User" },
{ "mDataProp": "Timestamp" },
{ "mDataProp": "Latitude" },
{ "mDataProp": "Longitude" },
{ "mDataProp": "Address" }
],
"iDisplayLength": 25,
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"sDom": '<"H"Tfr>t<"F"ip>',
"oTableTools": {
"sSwfPath": "swf/copy_csv_xls_pdf.swf",
"aButtons": ["copy", "csv", "xls", "pdf"]
},
"fnInitComplete": function () {
getAdresses();
}
} );
$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");
} );
function getAdresses() {
$.each(historyArray, function (index,data) {
// get address
var map = window.opener.document.getElementById('dispatcher');
$(map).gmap3({
action: 'getAddress',
latLng: [data.Latitude, data.Longitude],
callback: function (results) {
content = results && results[1] ? results && results[1].formatted_address : 'No Address';
console.log(content);
} // end callback
});
});
}
更新2
嗨,更新了代码。 因为我添加了$(this).html(内容);在gmap3的回调中它没有更新'addi'单元格,我该如何解决?
function getAdresses() {
$(".addi").each(function () {
var lat = $(this).siblings(".lat").html().toString();
var lng = $(this).siblings(".lng").html().toString();
// get address
$(map).gmap3({
action: 'getAddress',
latLng: [lat, lng],
callback: function (results) {
content = results && results[1] ? results && results[1].formatted_address : 'No Address';
$(this).html(content);
} // end callback
});
});
}
最终更新 给予解决方案添加到解决方案中。 我发现当我将数据导出到CSV,Excel等时,地址数据没有更新。
我将代码修改为此。
myTable = $('#report').dataTable({
"aaData": historyArray,
"aoColumns": [{
"mDataProp": "User"
}, {
"mDataProp": "Timestamp"
}, {
"mDataProp": "Latitude"
}, {
"mDataProp": "Longitude"
}, {
"mDataProp": "Address"
}],
"bPaginate": false,
"bJQueryUI": true,
"sPaginationType": "full_numbers",
"sDom": '<"H"Tfr>t<"F"ip>',
"oTableTools": {
"sSwfPath": "swf/copy_csv_xls_pdf.swf",
"aButtons": ["copy", "csv", "xls", "pdf"]
},
"fnInitComplete": function () {
addClasses();
}
});
window.setTimeout(function () {
getAdresses();
}, 1000);
});
function addClasses() {
$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");
}
function getAdresses() {
$(".addi").each(function () {
var lat = $(this).siblings(".lat").html().toString();
var lng = $(this).siblings(".lng").html().toString();
var addi = $(this);
$(addi).html("Reverse geocoding..");
var aPos = myTable.fnGetPosition(this);
// get address
$('#hidden').gmap3({
action: 'getAddress',
latLng: [lat, lng],
callback: function (results) {
content = results && results[1] ? results && results[1].formatted_address : 'No Address';
myTable.fnUpdate(content, aPos[0], 4);
} // end callback
});
});
}
现在数据真正更新了。
答案 0 :(得分:1)
如果我理解正确:
您可以通过jQuery将类添加到最终列,如下所示:
$("#table td:nth-child(5)").addClass("someClass");
然后你可以创建一个在初始化表之后运行的函数:
//Part of the datatable initialization
"fnInitComplete": function () {
myAwesomeFunction();
}
在该函数中,您可以根据类进行.each()
并抓住兄弟姐妹(lat和long)将这些传递给api并使用结果.html()
来替换加载文本。
我希望这是有道理的。如果不让我知道:)
// // EDIT
抓住兄弟姐妹: 首先给他们一个班级
$("#table td:nth-child(3)").addClass("lat");
$("#table td:nth-child(4)").addClass("long");
请记住,必须在初始化数据表后应用所有这些样式。
然后你可以:
var lat = $(this).siblings(".lat").html().toString();
var long = $(this).siblings(".long").html().toString();
///////////// ///编辑2 /// /////////////
首先移动此代码:
$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");
对于这样的函数:
$("#report").on("draw", function() {
addClasses();
});
function addClasses() {
$("#report td:nth-child(3)").addClass("lat");
$("#report td:nth-child(4)").addClass("lng");
$("#report td:nth-child(5)").addClass("addi");
}
在 addClasses()
之前将fnInitcomplete
函数添加到getAddresses()
这样,如果您更改页面或排序或者对表格进行其他更改,则将应用/重新应用这些类。
我不确定地理位置的API是如何工作的,但为了抓住长格子我会做这样的事情:
$(".addi").each(function () {
var lat = $(this).siblings(".lat").html().toString();
var lng = $(this).siblings(".lng").html().toString();
// Now pass these parameters to the geocode function and store the result in some var
//In this case lets call it result
//Now just replace the loading with the result:
$(this).html(result);
});
将上述代码放在getAddresses()
函数中,它应该会给你结果。
请告诉我这是否足够,如果工作正常;)