更改jquery脚本中的逻辑

时间:2013-06-22 19:25:24

标签: javascript jquery

这是我正在使用的脚本:http://jsfiddle.net/spadez/Jfdbz/19/

基本上,当按下提交按钮时,它通过地理编码工作。但是,如果从自动建议链接中选择了一个选项,它将在用户按下按钮之前对结果进行地理编码。在这种情况下,脚本知道它已经有了答案,并且不会对结果进行重新编码。

目前,它的工作原理是将结果存储在这个变量中:

lastQuery

然后检查以下内容:

if (!query || query === lastQuery)

然而,为了逻辑起见,并且为了简化我的代码集成到这段代码中,我认为最好做以下事情:

  • 检查提交按钮时lng lat字段是否为空,如果是,则地理编码然后提交。
  • 如果更改了位置字段的内容,则从lng lat字段中删除坐标。

基本上这种方式可行,所以如果位置已经过地理编码并且在提交时没有变化,那么我们得到结果并且不需要重新进行地理编码,但是在提交vwill之前对位置框的任何更改都会删除地理编码值,然后是地理编码器知道我们需要在提交时重新编码位置值。

我坚持如何整合这个逻辑,而且我对javascript的基本知识我不确定这是否真的是一个明智的解决方案。

1 个答案:

答案 0 :(得分:1)

This fiddle可能会给你一些想法。

一些主要区别是:

将google.maps.Geocoder API转换为基于承诺的API

Promises(另见Deferred)通常比回调更好用。

// 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);
    });
}