2016-05-24 9 views
0

Ich habe folgende HTML-Formular:jQuery einreichen nicht die Form nach der Modifikation

<form action="../start_timer" class="start_timer" id="447" method="post" accept-charset="utf-8"> 
<input type="hidden" name="shift_id" value="447"> 
<input type="hidden" name="latitude" class="latitude"> 
<input type="hidden" name="longitude" class="longitude"> 
<input type="submit" value="Start"> 
</form> 

und die folgende jQuery das Formular submition zu handhaben:

$(document).ready(function() { 
     $("form.start_timer, .form.end_timer").submit(function(e) { 
      if($(this).children(".latitude").val().length === 0 || $(this).children(".longitude").val().length === 0){ 
       e.preventDefault(); 
       navigator.geolocation.getCurrentPosition(foundLocation, noLocation,{timeout:10000}); 
       submits=0; 
       $(".longitude").change(function(e) { 
        if (submits==0) { 
        $(this).submit(); 
        } 
        submits++; 
       }); 
      }else if($(this).children(".latitude").val().length !== 0 && $(this).children(".longitude").val().length !== 0){ 

       return true; 

      } 
     }); 
    }); 

Hier ist foundLocation fuction, die in der füllt versteckte Felder:

function foundLocation(position){ 

     var lat = position.coords.latitude; 
     var long = position.coords.longitude; 

     if ($(".latitude").val(lat)!="lat") { 
     $(".latitude").val(lat).trigger('change'); 
     } 

     if ($(".longitude").val(long)!="long") { 
     $(".longitude").val(long).trigger('change');   
     } 
} 

Was passiert ist, dass es in derstopptFall und reicht das Formular nicht wirklich ein.

Wie kann ich es tatsächlich nach der Änderung einreichen?

Jede Hilfe oder Anleitung wird sehr geschätzt.

+0

Kommt es in den else if Block? – WillardSolutions

+0

Können Sie zeigen, was die foundLocation tut, nehme ich an, dass es die versteckten Felder Werte aktualisiert, aber ich will sicher sein, auch die else if-Anweisung kann durch eine einfache else ersetzt werden, da Breite und Länge einen Wert haben Punkt. – valarauko

+0

Sorry, das war mein Fehler. Die Frage wurde mit der Funktion foundLocation aktualisiert. Es setzt die Werte auf versteckte Felder und dann wird der else if-Block ausgeführt, aber das Formular wird nicht übergeben. Der else if-Block wird verwendet, wenn nur einer (lang oder lat) gefüllt wird. – WpDoe

Antwort

1

Das Problem ist, dass die getCurrentPosition Funktion Asynchron ist, so dass Sie das Formular auslösen, bevor Die Funktion hat die Werte zurückgegeben, die Formularübergabe sollte in etwa so aussehen:

$("form.start_timer, .form.end_timer").submit(function(e) { 
    var form = $(this); 

    if($(this).children(".latitude").val().length === 0 || $(this).children(".longitude").val().length === 0) { 
     e.preventDefault(); 
     var geolocated = function(position) { 
      foundLocation(position); 
      form.submit(); 
     }; 
     navigator.geolocation.getCurrentPosition(geolocated, noLocation,{timeout:10000}); 
    } else { 
      return true; 
    } 
}); 
+0

Vielen Dank für Ihre Antwort. Beim ersten Klick wird das Formular jedoch nicht übergeben und endet im if-Block, beim zweiten Klick endet es im zweiten Block, aber es wird auch nicht übergeben. – WpDoe

+0

Sie können es auf dieser Geige (https://jsfiddle.net/p2wumnrl/) arbeiten sehen, wenn Sie die Netzwerk-Registerkarte öffnen, können Sie sehen, dass das Formular tatsächlich die Post übermittelt (in der Geige wird es eine 404 sein) . Beachten Sie, dass Sie nicht noch einmal klicken müssen, es wird automatisch gesendet, sobald Sie die Geolocation-Werte erhalten. – valarauko

0

Ihre foundLocation-Funktion ist falsch, also auch Ihre Ereignisanlage.

Ihre foundLocation sollte sein:

function foundLocation(position){ 

    var lat = position.coords.latitude; 
    var long = position.coords.longitude; 

    $(".latitude").val(lat); 
    $(".longitude").val(long).trigger('change');   

} 

Und versuchen, die Veranstaltung wie diese einreichen Befestigung:

$(document).ready(function() { 
    $("form.start_timer, .form.end_timer").submit(function(e) { 
     var dat = $(this); 
     if($(this).children(".latitude").val().length === 0 || $(this).children(".longitude").val().length === 0){ 
      e.preventDefault(); 
      dat.on('change', '.longitude, .latitude', function(e) { 
       if(dat.find('.latitude').val() != "" && dat.find('.longitude').val() != "") dat.submit(); 
      }); 
      navigator.geolocation.getCurrentPosition(foundLocation, noLocation,{timeout:10000}); 

     } 
    }); 
}); 
+0

Vielen Dank für Ihre Hilfe, jedoch kann ich keinen solchen Callback ausführen lassen. Wie kann ich das machen? – WpDoe

+0

Beachten Sie, dass ich den Code oben und unten nicht enthalten habe, bearbeite ich meine Antwort mit dem vollständigen '.ready()' Callback – Charleshaa

Verwandte Themen