Форма отправляется с предыдущими значениями полей - PullRequest
1 голос
/ 18 мая 2011

Следующий код предназначен для отправки адреса в Карты Google, получения в качестве ответа значения широты и долготы, сохранения их в соответствующих полях формы и отправки формы.
Что на самом деле происходит, когда оповещения появляются вправильный порядок - сначала два значения по умолчанию, а затем полученные от Google, но затем происходят две странные вещи: тайм-аут не происходит, и форма отправляется со значениями по умолчанию вместо значений из Google.
Можете ли выскажите пожалуйста почему?

$('#simplr-reg').submit(function(event)
{           
    $("input[name=latitude]").val(9999);    // set default values
    $("input[name=longitude]").val(9999);               
    alert($("input[name=latitude]").val());
    alert($("input[name=longitude]").val());

    codeAddress(function(success){}); //callback from googlemaps    

    setTimeout(function(){
        callback(false); //pass false indicating no/invalid response 
        }, 20000);
});

function codeAddress(callback)
{               
    var geocoder = new google.maps.Geocoder();

    geocoder.geocode( { 'address': address}, function(results, status)
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {   
            var latitude = results[0].geometry.location.lat();
            var longitude = results[0].geometry.location.lng();
            $("input[name=latitude]").val(latitude); 
            $("input[name=longitude]").val(longitude);

            alert($("input[name=latitude]").val());
            alert($("input[name=longitude]").val());            
        }                   
    });         
}  // end of code address

1 Ответ

1 голос
/ 18 мая 2011

Вы используете обратный вызов неправильно, из-за чего нужно использовать setTimeout. Также функция $.submit() происходит перед фактическим представлением формы. Вероятно, поэтому значение входов сбрасывается каждый раз.

Пожалуйста, обратитесь к .submit и .post и проверьте, какой из них соответствует вашим потребностям.

Кроме того, вы можете отказаться от отправки формы и получить что-то вроде этого (не проверено):

У вас есть кнопка для запуска события:

<input type="button" name="submitBtn">

Когда пользователь нажимает на это, он устанавливает значения входных данных:

$('#submitBtn').click(function () {
   var address = "new york"; // or an input value
   var geocoder = new google.maps.Geocoder();
   geocoder.geocode( { 'address': address}, function(results, status)
   {
        if (status == google.maps.GeocoderStatus.OK) 
        {   
            var latitude = results[0].geometry.location.lat();
            var longitude = results[0].geometry.location.lng();
            $("input[name=latitude]").val(latitude); 
            $("input[name=longitude]").val(longitude);      
        }                   
    });         
});

Нет необходимости устанавливать тайм-аут, так как сама функция обратного вызова будет вызываться после возврата ответа. Если, конечно, вам нужен тайм-аут для какой-то другой цели - например, callback(false) делает что-то еще.

Отказ от ответственности: я не знаком с API геокодера.

EDIT:

Если вы не хотите редактировать HTML, вы можете вместо этого ввести переменную.

var isCallBack = false;

$('#simplr-reg').submit(function(event)
{           
    if (!isCallBack) {
        $("input[name=latitude]").val(9999);    // set default values
        $("input[name=longitude]").val(9999);               
        event.preventDefault();
        codeAddress();
    } else
        isCallBack = false; // may not be required if the page refreshes
});

function codeAddress()
{               
    var geocoder = new google.maps.Geocoder();

    geocoder.geocode( { 'address': address}, function(results, status)
    {
        if (status == google.maps.GeocoderStatus.OK) 
        {   
            var latitude = results[0].geometry.location.lat();
            var longitude = results[0].geometry.location.lng();
            $("input[name=latitude]").val(latitude); 
            $("input[name=longitude]").val(longitude);

            isCallBack = true;
            $('#simplr-reg').trigger('submit');
        }                   
    });         
}  // end of code address
...