2014-01-24 4 views
0

Мне нужно обновить (скрытое) поле формы перед отправкой.
Я перепробовал все возможные варианты реализации, но измененное значение просто не получает представлено -> старое значение представляется вместо
поле Я хочу обновить это
Я поставил его 'первым, чтобы удалить старое значение «XXX_place» :Обновление поля jQuery перед представлением формы сбой - javascript variable scope

проверки
$('#XXX_place').val(''); 

этот код ли это обновление:

if ($('#XXX_place').val() == '') { 
     event.preventDefault(); 
} 

форма не представляется becouse условие истинно, но поле обновляется и имеет правильное значение -> это очень сбивает с толку

Моя последняя догадка это переменная сфера - все, что сделано в

функции (результаты, статус) {

не установлен globaly и хотя мое поле обновляется результат не представляется , Что я должен изменить?

здесь полный код:

var geocoder; 
var placeData; 
geocoder = new google.maps.Geocoder(); 

var input = document.getElementById('XXX_address'), 
     options = { 
      types: ['geocode'], 
      language: ['de'], 
      componentRestrictions: {country: 'de'} 
     }, 
     autocomplete = new google.maps.places.Autocomplete(input, options); 

$('#searchform').submit(function(event) { 
    codeAddress(); 
    if ($('#XXX_place').val() == '') { 
     event.preventDefault(); 
    } 
}); 


function codeAddress() { 
    $('#XXX_place').val(''); 
    placeData = ''; 
    var bounds = new google.maps.LatLngBounds(new google.maps.LatLng(48.257141, 11.335030), 
     new google.maps.LatLng(48.014731, 11.828041)); 
    geocoder.geocode({ 'componentRestrictions':{'locality': 'Munich'}, 
     'bounds': bounds, 'address': $('#XXX_address').val()}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      placeData = stringifyPlace(results[0].formatted_address, results[0].geometry.location); 
      $('#XXX_place').val(placeData); 
      } 
    }); 

     alert(placeData); 
} 

function stringifyPlace(address, location) { 

    return JSON.stringify({"formatted_address": address, 
            "latitude": location.d, 
            "longitude": location.e 
            }); 
} 
+0

Случай асинхронного запроса рассматривается как синхронный. – epascarello

+0

Что это значит? Может ли моя идея реализовать или мне нужно все изменить? – jeff

+0

Это означает '$ ('# XXX_place'). Val (placeData);' запускается после 'if ($ ('# XXX_place'). Val() == '')'. Так что да, вам нужно изменить, как вы поступаете. – epascarello

ответ

1

JavaScript не действует, как и большинство сценариев-Языки вы могли бы знать. Это сильно зависит от функций обратного вызова (обработчик), чтобы избежать проблем с запуском, подобных этому.

На отправке вы вызываете кодAdress(), в котором вы вызываете метод геокода. Этот метод, похоже, использует вызов ajax. JavaScript не волнует, завершился ли этот вызов, просто продолжается с отправкой.

Вы можете обойти это с привязкой обработчика события клика к кнопке отправки, вместо прослушивания отправки. Вы должны предотвратить дефолт и триггер представить в функции обратного вызова geocoders так:

$('#id_of_submit_button').click(function(e){ 
e.preventDefault(); 
codeAdress(); 

return false; 
}); 

и

geocoder.geocode({ 'componentRestrictions':{'locality': 'Munich'}, 
        'bounds': bounds, 'address': $('#XXX_address').val()}, 
        function(results, status) { 
         if (status == google.maps.GeocoderStatus.OK) { 
         placeData = stringifyPlace(results[0].formatted_address, 
         results[0].geometry.location); 
         $('#XXX_place').val(placeData); 
         $('#searchform').submit(); 
         } 
        }); 

Другая возможность обработки вашего Подавать с булевой вар.

var val_unchanged = false; 

// some code 

$('#searchform').submit(function(e){ 
    if val_unchanged{ 
    e.preventDefault 
    codeAdress(); 
    return false; 
    }else{ 
    return true; 
    } 
}); 

// add at the end of geocode callback 
val_unchanged = false; 
$('#searchform').submit(); 

Возможно, вам будет лучше не полагаться на форму и представить свои данные вручную.