Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
表单提交失败前jQuery字段更新-javascript变量范围_Javascript_Jquery_Forms_Callback_Scope - Fatal编程技术网

表单提交失败前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();