表单提交失败前jQuery字段更新-javascript变量范围
我需要在提交前更新(隐藏)表单字段。表单提交失败前jQuery字段更新-javascript变量范围,javascript,jquery,forms,callback,scope,Javascript,Jquery,Forms,Callback,Scope,我需要在提交前更新(隐藏)表单字段。 我尝试了所有可能的实现,但更改后的值没有被提交->而是提交了旧值 我要更新的字段是“XXX\u place” 我首先将其设置为“”以删除旧值: $('#XXX_place').val(''); 此代码检查是否已更新: if ($('#XXX_place').val() == '') { event.preventDefault(); } 表单未提交,因为条件为true,但字段已更新并具有正确的值->这非常混乱 我最新的猜测是,它的作用域是
我尝试了所有可能的实现,但更改后的值没有被提交->而是提交了旧值
我要更新的字段是“XXX\u place”
我首先将其设置为“”以删除旧值:
$('#XXX_place').val('');
此代码检查是否已更新:
if ($('#XXX_place').val() == '') {
event.preventDefault();
}
表单未提交,因为条件为true,但字段已更新并具有正确的值->这非常混乱
我最新的猜测是,它的作用域是可变的——所有内部所做的事情
功能(结果、状态){
未设置为全局,虽然我的字段已更新,但结果未提交。我应该更改什么
以下是完整的代码:
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
});
}
JavaScript不像您可能知道的大多数脚本语言,它在很大程度上依赖于回调函数(处理程序)来避免运行类似这样的问题 提交时,您将调用CodeAddress(),在其中调用geocode方法。该方法似乎使用ajax调用。JavaScript不关心调用是否已完成,只是继续提交 您可以通过将单击事件处理程序绑定到submit按钮来解决此问题,而不是侦听submit。您必须在geocoders回调函数中防止默认并触发submit,如下所示:
$('#id_of_submit_button').click(function(e){
e.preventDefault();
codeAdress();
return false;
});
及
另一种可能是使用布尔变量处理提交
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();
不过,您最好不要依赖表单,而是手动提交数据。异步请求被视为同步的情况。这意味着什么?我的想法可能实现吗?或者我需要更改所有内容吗?这意味着
$('XXX_place')。val(placeData);
在if($('XXX_place')之后运行。val()='')
。所以,是的,你需要改变你做事的方式。
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();