Domanda

Sto implementando una piccola funzione e un po 'bloccato.

Ho un pulsante per eseguire alcune azioni, come

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

Quando l'utente fa clic sul pulsante viene chiamata la funzione DoSomething.

    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;
            }
          });
}

All'interno della funzione è definita una funzione di richiamata, che esegue un'operazione asincrona che scrive il nome di una città in un campo modulo. Il problema è che il callback asincrono proverà a scrivere nel campo dopo che la pagina è stata pubblicata. È possibile che il processo di post attenda il risultato della richiamata? Il callback è definito nell'API di Google Maps e non posso evitarlo.

Grazie in anticipo

È stato utile?

Soluzione

Innanzitutto si desidera modificare il codice del gestore onclick per includere un'istruzione return in questo modo:

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

Quindi modifica la funzione DoSomething per restituire false in modo che sumit venga annullato se funziona sul callback asincrono .. E modifica il callback asincrono per pubblicare il modulo al termine.

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
}

Ancora un altro approccio sarebbe quello di includere un gestore onSubmit nel modulo e utilizzare un flag globale per determinare se è consentito l'invio del modulo (ovvero se è presente nessuna richiamata asincrona è ancora in volo). Quando il callback asincrono ritorna, deselezionate il flag e reinviate il modulo da javascript come ho dimostrato sopra, chiamando il metodo submit () sul modulo elemento .

Altri suggerimenti

Utilizza un pulsante normale (tipo = " pulsante ") invece di un pulsante di invio in modo che il modulo non venga pubblicato. Pubblica invece il modulo dalla funzione di callback.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top