Pergunta

Estou implementando um pequeno recurso e tipo de preso.

Eu tenho um botão para executar alguma ação, como

<input type="submit" value="My Button" onclick="javascript:DoSomething();" />

Quando o usuário clica no botão da função DoSomething é chamado.

    function DoSomething()
    {
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;
            }
          });
}

Dentro da função uma função de retorno é definido, que executa uma operação assíncrona que escreve o nome da cidade em um campo de formulário. O problema é que o retorno de chamada assíncrono vai tentar escrever no campo após a página é remetida. Existe alguma era eu posso tornar a espera pós processo para o resultado de retorno de chamada? O retorno é definido na API do Google Maps e não posso evitá-lo.

Agradecemos antecipadamente

Foi útil?

Solução

Primeiro você deseja modificar o código manipulador onclick para incluir uma instrução de retorno assim:

<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />

Em seguida, modificar a função DoSomething para retornar false para que sumit será cancelado se ele está funcionando no retorno de chamada assíncrono .. E modificar o retorno de chamada assíncrono para enviar o formulário quando feito.

function DoSomething(doPost)
{
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;

                // resubmit the form here 
                $('#yourFormID').submit();
            }
          });

         return false; // cancel the submitting of the form
}

No entanto, outra abordagem seria incluir um onSubmit manipulador em seu formulário e usar um sinalizador global para determinar se a submeter do formulário é permitido (ou seja, se houver não assíncrono callback ainda em vôo). Quando os assíncrono callback retorna você iria limpar o sinalizador e reenvie a forma de javascript como eu demonstrei acima, chamando o método submit () na forma elemento .

Outras dicas

Use um botão normal (type = "button") em vez de um botão de envio para que o formulário não é lançado. Postar o formulário a partir da função de retorno em seu lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top