2016-12-09 4 views
0

HTMLSchaltfläche Senden nicht mit Anfrage gesendet wird, wenn über JavaScript

<form method='POST' id='signup_form'> 
    <label for='email'>E-mail:</label><br /> 
    <input type='email' name='email' /><br /><br /> 
    <label for='username'>Username:</label><br /> 
    <input type='text' name='username' /><br /><br /> 
    <label for='password'>Password:</label><br /> 
    <input type='password' name='password' /><br /><br /> 
    <label for='confirmpassword'>Confirm Password:</label><br /> 
    <input type='password' name='confirmpassword' /><br /><br /> 
    <input type='submit' name='signup' /> 
</form> 

JavaScript

const signup_form = document.getElementById('signup_form'); 

signup_form.addEventListener('submit', function() { 
    event.preventDefault(); 

    let missing_input = false; 

    for (let i = 0; i < this.children.length; i++) { 
     if (this.children[i].type !== undefined && this.children[i].type !== 'submit') 
      if (this.children[i].value === '') { 
       missing_input = true; 
       break; 
      } 
    } 

    if (!missing_input) 
     this.submit(); 
}); 
einreichen

Also ich versuche, einige Validierung in meinem JavaScript zu tun, bevor ich meine Form zu PHP einreichen. Wenn der Benutzer versucht, das Formular zu senden, überprüfe ich die Eingaben, um zu sehen, ob sie leer sind und wenn einer von ihnen dann bin, übermittle ich das Formular nicht. Diese Funktionalität funktioniert einwandfrei, aber wenn das Formular übermittelt wird, wird <input type='submit' name='signup' /> nicht in _POST angezeigt. Alle anderen Eingaben tun es. Es funktionierte gut, bevor ich den Event-Listener implementierte.

Dies ist, was $_POST wie nach aussieht erfolgreich einreichen:

Array ([email] => [email protected] [username] => ericsartor [password] => asdasdasd [confirmpassword] => asdasdasd) 

ich etwas falsch gemacht? Es funktioniert definitiv gut, wenn ich den Ereignis-Listener entferne, aber ich verstehe nicht, warum, wenn das Verhindern der Übermittlungsschaltfläche in der Anfrage enthalten ist ...

EDIT: Ich fand die Lösung dank eines Links, den Andre gepostet hat. Ich habe meine eigene Antwort geschrieben, aber ich kann sie noch nicht akzeptieren.

+0

es gibt keinen "Wert" zu "submit", was vielleicht der Grund ist! Versuchen Sie es mit '' etc – RamRaider

+0

Ich habe versucht, einen Wert hinzuzufügen, es hat keinen Unterschied gemacht. In der Tat, wenn ich den Event-Listener entferne und das Formular wie normal übertrage, weist PHP einen Vorschlagswert von "Submit" zu, um Elemente zu übermitteln, wie es scheint. Ich habe 'if (isset ($ _ POST ['signup']))' 'verwendet, um nach dem Senden von Formularen zu suchen, und das funktioniert ohne einen expliziten Wert! –

Antwort

1

Das Problem war, dass ich event.preventDefault() zur falschen Zeit rief. Ich habe meine JavaScript dies geändert:

const signup_form = document.getElementById('signup_form'); 

signup_form.addEventListener('submit', function() { 
    let missing_input = false; 

    for (let i = 0; i < this.children.length; i++) { 
     if (this.children[i].type !== undefined && this.children[i].type !== 'submit') 
      if (this.children[i].value === '') { 
       missing_input = true; 
       break; 
      } 
    } 

    if (missing_input) 
     event.preventDefault(); 
}); 

ich die Standard-Vorlage nur verhindern, wenn ich wirklich ein Problem finden. Zuvor verhinderte ich jedes Mal die anfängliche Einreichung und versuchte dann erneut zu senden, sobald ich alles validiert hatte. Etwas hat dazu geführt, dass die Variable nicht in die Anfrage gelangt ist. Props an Andre Rodrigues für das Posten eines Links zu einer anderen Frage, die das erwähnte!

0

Nicht sicher, ob es hilft, aber Sie müssen zumindest das Ereignis Argument für den Rückruf wie dies passieren, sonst können Sie nicht darauf zugreifen:

signup_form.addEventListener('submit', function(event) {//content}) 
+0

Das ist meiner Erfahrung nach nicht wahr.Wenn Sie ein Ereignis auslösen, ohne das Ereignis zu übergeben, und dann ein 'console.log (Ereignis) 'ausführen, ist es weiterhin verfügbar. Ich kenne den Grund hinter den Kulissen nicht, aber es scheint, dass "Ereignis" einer jener Werte ist, die in einem Ereignis immer verfügbar sind, ähnlich wie "dieses" immer zur Verfügung gestellt wird. –

+1

Ich habe gerade herausgefunden, dass Firefox das globale Ereignis blockiert (du verwendest das globale Ereignis), weshalb ich immer undefiniert werde. (Siehe: http://stackoverflow.com/questions/37367752/event-global-object-in-firefox) Wie auch immer, froh, dass Sie eine Lösung gefunden haben. –

+0

Nun, da ist das Problem, ich benutze immer nur Chrome ... Lektion gelernt, immer passieren die Veranstaltung in! –

1

Ich denke, die einfache Art und Weise es ist mit: onsubmit='return validaForm(this)'

so ...

<form method='POST' id='signup_form' onsubmit='return validaForm(this)'> 
    <label for='email'>E-mail:</label><br /> 
    <input type='email' name='email' /><br /><br /> 
    <label for='username'>Username:</label><br /> 
    <input type='text' name='username' /><br /><br /> 
    <label for='password'>Password:</label><br /> 
    <input type='password' name='password' /><br /><br /> 
    <label for='confirmpassword'>Confirm Password:</label><br /> 
    <input type='password' name='confirmpassword' /><br /><br /> 
    <input type='submit' name='signup' /> 
</form> 

und

<script> 

    var validaForm = function(signup_form) { 

     event.preventDefault(); 

     let missing_input = false; 

     for (let i = 0; i < signup_form.children.length; i++) { 
      if (signup_form.children[i].type !== undefined && signup_form.children[i].type !== 'submit') 
       if (signup_form.children[i].value === '') { 
        missing_input = true; 
        break; 
       } 
     } 

     if (!missing_input) { 
      signup_form.submit(); 
     } else { 
      alert('field empty'); 
     } 

    } 

    </script> 

Referenzen:

javascript: validate form before submit?

HTML/Javascript: Simple form validation on submit

get all the elements of a particular form

+0

Der zweite Link dort bot eine Lösung. Ich rief 'event.preventDefault()' sofort an und versuchte dann, das Formular nach der Validierung erneut zu senden. Der richtige Weg, dies zu tun, war, 'event.preventDefault()' nur aufzurufen, wenn ich tatsächlich ein Problem entdeckt habe. Das ist es behoben! Danke für die Referenzen. Ich denke, ich habe beim googeln keine Lösung gefunden, weil ich überzeugt war, dass der Event-Listener das Problem war, nicht der Code selbst ... –

+1

Schön! Problem gelöst. Mein Code ist eine andere Lösung, lol. –

Verwandte Themen