2009-12-10 5 views
0

J'utilise le plugin de formulaire jQuery pour appeler une fonction avant de soumettre le formulaire. Cette fonction appelle google geocoder service, qui trouve les coordonnées d'une adresse et définit la valeur d'un champ de coordonnées cachées dans le formulaire. Il semble que le formulaire est soumis avant la fin du rappel beforeSubmit. Est-ce normal? Le formulaire n'est-il pas supposé attendre que le rappel beforeSubmit soit terminé? Quelle est la meilleure façon de faire cela?Problème avec le plugin de formulaire jQuery

Merci

javascript

$(function(){ 
    $("#submit").click(function() { 
     var options = { 
      beforeSubmit: getPosition, // pre-submit callback 
      success:  showResponse // post-submit callback    
     }; 

     // bind form using 'ajaxForm' 
     $('#addresto').ajaxForm(options); 
    }); 
}); 

function getPosition() { 

    var geocoder = new GClientGeocoder(); 

    var country = $("#id_country").val(); 
    var city = $("#id_city").val(); 
    var postal_code = $("#id_postal_code").val(); 
    var street_number = $("#id_street_number").val(); 
    var street = $("#id_street").val(); 
    var address = street_number+", "+street+", "+postal_code+", "+city+", "+country; 

    geocoder.getLatLng(address, function(point) { 
     if (point) { 
      alert(point); 
      $("#id_latitude").val(point.lat()) 
      $("#id_longitude").val(point.lng()) 
     } else { 
      alert("Geocode was not successful"); 
     } 
    }); 
    return true; 
} 

function showResponse() { 
    alert('response'); 
} 

HTML

<form id="addresto" action="" method="POST"> 

<!-- some city, country, street... fields --> 

<input type="Submit" id="submit" value="Submit" /> 
</form> 

Répondre

2

@ La deuxième solution de Jason est presque tout le chemin.

Chronologiquement:

  • Une entrée de forme avec le nom LatLongAvailable est 0 par défaut
  • utilisateur entre un lieu
  • jQuery feux de getLatLng(), lorsque getLatLng() retourne la valeur, la forme L'élément LatLongAvailable est défini sur 1
  • jQuery appelle une fonction qui commence à interroger le champ de formulaire LatLongAvailable
  • Si le clic est effectué, vérifiez d'abord si LatLongAvailabl e == 1, sinon, montrer un signe d'attente, continuer à essayer chaque seconde étrange, si elle est 1, soumettez le formulaire

Plus d'informations sur les sondages avec Javascript se trouve dans a question I had.

2

Je crois getLatLng() du géocodage est appelé de manière asynchrone. Cela signifie qu'il n'attend pas de réponse avant de continuer sur la ligne return true;.

Dans cet esprit, il y a essentiellement deux façons autour d'elle:

  1. Vous pouvez appeler getLatLng() avant l'envoi est toujours déclenché, comme lors d'un événement onchange pour l'adresse et stocker les valeurs de soumission . Ou,
  2. Vous pouvez ajouter un indicateur qui indique si vous avez déjà une réponse de géocodage et return false; dans beforeSubmit() si vous ne l'avez pas encore. Ensuite, vous pouvez déclencher une soumission à partir du code lorsque vous obtenez la réponse.
+0

Bonne réponse, vous avez raison avec getLatLng(). Solution 1 est un peu hackish et pas tout à fait à l'épreuve des balles, par exemple, que se passe-t-il si la fonction prend tout à coup tout à coup et l'utilisateur soumet avant cela? Je vais élaborer sur la deuxième solution dans une nouvelle réponse. –