2

助けてもらった JavaScript に問題があります。これは私が得るエラーです:

Uncaught TypeError: undefined is not a function 

それは私の行にあるようです:

callback(lastResult); // send the result back

奇妙なことに、コードは期待どおりに動作しているように見えますが、コードにエラーが発生することは明らかに望んでいません。誰かが私が間違っているところを教えてもらえますか?

Jsfiddle: http://jsfiddle.net/spadez/uaZkV/3/

完全なコード:

$(function () {
    var input = $("#loc"),
        lat = $("#lat"),
        lng = $("#lng"),
        lastQuery = null,
        lastResult = null, // new!
        autocomplete;

    function processLocation(callback) { // accept a callback argument
        var query = $.trim(input.val()),
            geocoder;

        // if query is empty or the same as last time...
        if (!query || query == lastQuery) {
            callback(lastResult); // send the same result as before
            return; // and stop here
        }

        lastQuery = query; // store for next time

        geocoder = new google.maps.Geocoder();
        geocoder.geocode({
            address: query
        }, function (results, status) {
            if (status === google.maps.GeocoderStatus.OK) {
                lat.val(results[0].geometry.location.lat());
                lng.val(results[0].geometry.location.lng());
                lastResult = true; // success!
            } else {
                alert("Sorry - We couldn't find this location. Please try an alternative");
                lastResult = false; // failure!
            }
            callback(lastResult); // send the result back
        });
    }

    autocomplete = new google.maps.places.Autocomplete(input[0], {
        types: ["geocode"],
        componentRestrictions: {
            country: "uk"
        }
    });

    google.maps.event.addListener(autocomplete, 'place_changed', processLocation);

    $('#searchform').on('submit', function (event) {
        var form = this;

        event.preventDefault(); // stop the submission

        processLocation(function (success) {
            if (success) { // if the geocoding succeeded, submit the form
                form.submit()
            }
        });

    });
});
4

2 に答える 2

2

ドキュメントgoogle.maps.event.addListenerは、コールバック関数 ( processLocation) を呼び出すときに、引数なしで呼び出すことを暗示しています。

callbackは、 の関数定義の最初の引数であるprocessLocationためundefined、Google マップ コードによって呼び出されます。

関数かどうかをテストせずに、関数として呼び出そうとします。

その呼び出しの試みを削除するか、typeof最初にテストしてください。

于 2013-05-29T16:03:46.843 に答える
2
google.maps.event.addListener(autocomplete, 'place_changed', processLocation);

マップ イベント リスナーとして追加するprocessLocationと、イベントの発生時に引数が渡されません。callback引数はその後であり、undefined例外を引き起こします(ただし、最後のステートメントであるため、制御フローを停止しません)。

つまり、callback呼び出す前に実際の関数が渡されたかどうかを確認します。

function processLocation(callback) { // accept a callback argument
    var query = $.trim(input.val()),
        geocoder;

    // if query is empty or the same as last time...
    if (!query || query == lastQuery) {
        if (typeof callback=="function")
            callback(lastResult); // send the same result as before
        return; // and stop here
    }

    lastQuery = query; // store for next time

    geocoder = new google.maps.Geocoder();
    geocoder.geocode({
        address: query
    }, function (results, status) {
        lastResult = status === google.maps.GeocoderStatus.OK;
        if (lastResult) {
            lat.val(results[0].geometry.location.lat());
            lng.val(results[0].geometry.location.lng());
        } else {
            alert("Sorry - We couldn't find this location. Please try an alternative");
        }
        if (typeof callback=="function")
            callback(lastResult); // send the result back
    });
}

複数の呼び出しがcallbackあり、どこでもタイプチェックを実行したくない場合は、

function noOperation() {}

callback何も渡されない場合のデフォルト値としてそれを使用します。

function processLocation(callback) { // accept a callback argument
    if (typeof callback != "function")
        callback = jQuery.noop; // predefined by jQuery
    …
}
于 2013-05-29T16:07:26.850 に答える