这是我正在使用的脚本:http://jsfiddle.net/spadez/Jfdbz/19/
基本上,当按下提交按钮时,它通过地理编码工作。但是,如果从自动建议链接中选择了一个选项,它将在用户按下按钮之前对结果进行地理编码。在这种情况下,脚本知道它已经有了答案,并且不会对结果进行重新编码。
目前,它的工作原理是将结果存储在这个变量中:
lastQuery
然后检查以下内容:
if (!query || query === lastQuery)
然而,为了逻辑起见,并且为了简化我的代码集成到这段代码中,我认为最好做以下事情:
基本上这种方式可行,所以如果位置已经过地理编码并且在提交时没有变化,那么我们得到结果并且不需要重新进行地理编码,但是在提交vwill之前对位置框的任何更改都会删除地理编码值,然后是地理编码器知道我们需要在提交时重新编码位置值。
我坚持如何整合这个逻辑,而且我对javascript的基本知识我不确定这是否真的是一个明智的解决方案。
答案 0 :(得分:1)
This fiddle可能会给你一些想法。
一些主要区别是:
// Turn google.maps.Geocoder into promise API
function googleGeocode(query) {
var geocoder = new google.maps.Geocoder(),
dfd = $.Deferred();
geocoder.geocode({
address: query
}, function (results, status) {
if (status === google.maps.GeocoderStatus.OK) {
console.log("googleGeocode", "success", query, results);
dfd.resolve(query, results);
} else {
console.log("googleGeocode", "failure", query);
dfd.reject(query);
}
});
return dfd.promise();
}
然后我们可以使用可能地理编码方法:
// Only geocodes if the query has changed since last time.
function geocode() {
var geokeyword = $.trim($("#geokeyword").val()),
loc = $.trim($("#loc").val()),
// always use geokeyword in preference to loc (if provided)
query = geokeyword || loc,
dfd;
// check for changes
if (history.query === query) {
console.log("No changes");
dfd = $.Deferred();
// resolve with results already in history
dfd.resolve(history.query, history.results);
return dfd.promise();
}
return googleGeocode(query);
}
(此处显示单个对象,但您的历史记录可能是以前所有地理编码结果的数组或地图)
var history = {
lat: null,
long: null,
query: null,
results: null
},
在请求地理编码时检查(见上文),并在执行成功的地理编码时更新(见下文 - 成功回调是传递给then()
的第一个回调,错误回调是第二):
function processLocation(history, submit) {
// only passing submit==false will prevent auto-submission
submit = (false !== submit);
geocode().then(function (query, results) {
var form = $("#geocode_form"),
lat = form.find("#lat"),
long = form.find("#lng"),
location = results[0].geometry.location;
console.log("processLocation", "success", query, results);
lat.val(location.lat());
long.val(location.lng());
history.query = query;
history.results = results;
history.lat = lat.val();
history.long = long.val();
if (submit) {
console.log("Submitting", lat.val(), long.val());
form.submit();
}
}, function (query) {
console.log("processLocation", "failure", query);
});
}