Beenden Sie die Formularaktualisierungsseite beim Senden

150

Wie kann ich verhindern, dass die Seite aktualisiert wird, wenn Sie auf die Schaltfläche "Senden" klicken, ohne dass Daten in den Feldern vorhanden sind?

Die Validierung funktioniert einwandfrei, alle Felder werden rot, aber die Seite wird sofort aktualisiert. Meine Kenntnisse von JS sind relativ grundlegend.

Insbesondere denke ich, dass die processForm()Funktion unten "schlecht" ist.

HTML

<form id="prospects_form" method="post">
    <input id="form_name" tabindex="1" class="boxsize" type="text" name="name" placeholder="Full name*" maxlength="80" value="" />
    <input id="form_email" tabindex="2" class="boxsize" type="text" name="email" placeholder="Email*" maxlength="100" value="" />
    <input id="form_subject" class="boxsize" type="text" name="subject" placeholder="Subject*" maxlength="50" value="FORM: Row for OUBC" />
    <textarea id="form_message" class="boxsize" name="message" placeholder="Message*" tabindex="3" rows="6" cols="5" maxlength="500"></textarea>

    <button id="form_send" tabindex="5" class="btn" type="submit" onclick="return processForm()">Send</button>
    <div id="form_validation">
        <span class="form_captcha_code"></span>
        <input id="form_captcha" class="boxsize" type="text" name="form_captcha" placeholder="Enter code" tabindex="4" value="" />
    </div>
    <div class="clearfix"></div>
</form>

JS

$(document).ready(function() { 

// Add active class to inputs
$("#prospects_form .boxsize").focus(function() { $(this).addClass("hasText"); });
$("#form_validation .boxsize").focus(function() { $(this).parent().addClass("hasText"); });
// Remove active class from inputs (if empty)
$("#prospects_form .boxsize").blur(function() { if ( this.value === "") { $(this).removeClass("hasText"); } });
$("#form_validation .boxsize").blur(function() { if ( this.value === "") { $(this).parent().removeClass("hasText"); } });



///////////////////
// START VALIDATION
$("#prospects_form").ready(function() {

    // DEFINE GLOBAL VARIABLES
    var valName = $('#form_name'),
        valEmail = $("#form_email"),
        valEmailFormat = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
        valMsg = $('#form_message'),
        valCaptcha = $('#form_captcha'),
        valCaptchaCode = $('.form_captcha_code');



    // Generate captcha
    function randomgen() {
        var rannumber = "";
        // Iterate through 1 to 9, 4 times
        for(ranNum=1; ranNum<=4; ranNum++){ rannumber+=Math.floor(Math.random()*10).toString(); }
        // Apply captcha to element
        valCaptchaCode.html(rannumber);
    }
    randomgen();


    // CAPTCHA VALIDATION
    valCaptcha.blur(function() {
        function formCaptcha() {
            if ( valCaptcha.val() == valCaptchaCode.html() ) {
                // Incorrect
                valCaptcha.parent().addClass("invalid");
                return false;
            } else {
                // Correct
                valCaptcha.parent().removeClass("invalid");
                return true;
            }
        }
        formCaptcha();
    });

    // Remove invalid class from captcha if typing
    valCaptcha.keypress(function() {
        valCaptcha.parent().removeClass("invalid");
    });


    // EMAIL VALIDATION (BLUR)
    valEmail.blur(function() {
        function formEmail() {
            if (!valEmailFormat.test(valEmail.val()) && valEmail.val() !== "" ) {
                // Incorrect
                valEmail.addClass("invalid");
            } else {
                // Correct
                valEmail.removeClass("invalid");
            }
        }
        formEmail();
    });

    // Remove invalid class from email if typing
    valEmail.keypress(function() {
        valEmail.removeClass("invalid");
    });


    // VALIDATION ON SUBMIT
    $('#prospects_form').submit(function() {
        console.log('user hit send button');

        // EMAIL VALIDATION (SUBMIT)
        function formEmailSubmit() {
            if (!valEmailFormat.test(valEmail.val())) {
                // Incorrect
                valEmail.addClass("invalid");
            } else {
                // Correct
                valEmail.removeClass("invalid");
            }
        }
        formEmailSubmit();

        // Validate captcha
        function formCaptchaSubmit() {
            if( valCaptcha.val() === valCaptchaCode.html() ) {
                // Captcha is correct
            } else {
                // Captcha is incorrect
                valCaptcha.parent().addClass("invalid");
                randomgen();
            }
        }
        formCaptchaSubmit();


        // If NAME field is empty
        function formNameSubmit() {
            if ( valName.val() === "" ) {
                // Name is empty
                valName.addClass("invalid");
            } else {
                valName.removeClass("invalid");
            }
        }
        formNameSubmit();


        // If MESSAGE field is empty
        function formMessageSubmit() {
            if ( valMsg.val() === "" ) {
                // Name is empty
                valMsg.addClass("invalid");
            } else {
                valMsg.removeClass("invalid");
            }
        }
        formMessageSubmit();


        // Submit form (if all good)
        function processForm() {
            if ( formEmailSubmit() && formCaptchaSubmit() && formNameSubmit() && formMessageSubmit() ) {
                $("#prospects_form").attr("action", "/clients/oubc/row-for-oubc-send.php");
                $("#form_send").attr("type", "submit");
                return true;
            } else if( !formEmailSubmit() ) {
                valEmail.addClass("invalid");
                return false;
            } else if ( !formCaptchaSubmit() ) {
                valCaptcha.parent().addClass("invalid");
                return false;
            } else if ( !formNameSubmit() ) {
                valName.addClass("invalid");
                    return false;
                } else if ( !formMessageSubmit() ) {
                    valMsg.addClass("invalid");
                    return false;
                } else {
                    return false;
                }
            }
        });
    });
    // END VALIDATION
    /////////////////
});
M_Willett
quelle

Antworten:

177

Sie können verhindern, dass das Formular mit gesendet wird

$("#prospects_form").submit(function(e) {
    e.preventDefault();
});

Natürlich können Sie in der Funktion nach leeren Feldern suchen, und wenn etwas nicht richtig aussieht, e.preventDefault() wird die Übermittlung gestoppt.

Ohne jQuery:

var form = document.getElementById("myForm");
function handleForm(event) { event.preventDefault(); } 
form.addEventListener('submit', handleForm);
Overcode
quelle
4
Diese Methode erfordert jQuery. Ich denke, es ist immer besser, dies mit dem Attribut "Schaltflächentyp" zu verhindern.
Vicky Gonsalves
25
Diese Methode kann ohne jQuery durchgeführt werden, und zwar mit: var form = document.getElementById("myForm"); function handleForm(event) { event.preventDefault(); } form.addEventListener('submit', handleForm); Und ich habe anscheinend keine Ahnung, wie man einen Kommentar richtig formatiert.
Tynach
1
Fügen Sie grundsätzlich den event.preventDefault();Code für die Bearbeitung Ihres Formulars ein. Eine einzeilige Variante von dem, was ich in meinen anderen Kommentar eingefügt habe (im Grunde das gleiche wie die jQuery-Version), wäre: document.getElementById("prospects_form").addEventListener('submit', function(event){event.preventDefault();});Es kann eine Möglichkeit geben, dies zu verkürzen (indem man es nicht verwendet addEventListener(), aber es scheint, dass diese Methoden im Allgemeinen verpönt sind auf.
Tynach
84

Fügen Sie diesen onsubmit = "return false" -Code hinzu:

<form name="formname" onsubmit="return false">

Das hat es für mich behoben. Die von Ihnen angegebene onClick-Funktion wird weiterhin ausgeführt

user3413723
quelle
4
Die Formularüberprüfung des HTML5-Browsers wird weiterhin ausgeführt.
Daniel Sokolowski
1
Keine Bibliotheken erforderlich, jquery is awesome native ist in diesem Fall besser.
Calbertts
4
Dies ist die sauberste Lösung ohne JQuery. Darüber hinaus können Sie es auch als verwenden; onsubmit = "return submitFoo ()" und false in submitFoo () zurückgeben, wenn Sie beim Senden eine Funktion aufrufen müssen.
Bmkorkut
8
Das Formular wird jedoch niemals gesendet.
Arun Raaj
75

Ersetzen Sie den Schaltflächentyp durch button:

<button type="button">My Cool Button</button>
Vicky Gonsalves
quelle
3
Dies ist die einzige vorgeschlagene Methode, die verhindert, dass die Seite aktualisiert wird, selbst wenn ein Javascript-Fehler vorliegt, der zum Testen und Entwickeln hilfreich sein kann.
JJZ
14
Dies ist nützlich, verhindert jedoch nicht das Senden / Neuladen, wenn der Benutzer die [Eingabetaste] drückt.
System.Cats.Lol
13
Nicht gut für die Formularüberprüfung: / Sie benötigen eine Schaltfläche zum
Senden
Ich denke, dies wird funktionieren, wenn Sie sicher sind, dass die Clientseite immer JavaScript verwendet, andernfalls sollte eine Schaltfläche vom Typ "
Senden"
1
@ briancollins081 Dies ist keine globale Lösung. Diese Antwort bezieht sich nur auf die aktuelle Situation des OP. Wenn kein Javascript vorhanden ist, kann das OP das Formular nirgendwo senden, obwohl button type="submit"er das Formular über die Schaltflächenaktion mit jQuery gesendet hat.
Vicky Gonsalves
15

Sie können diesen Code zum Senden von Formularen ohne Seitenaktualisierung verwenden. Ich habe das in meinem Projekt gemacht.

$(function () {
    $('#myFormName').on('submit',function (e) {

              $.ajax({
                type: 'post',
                url: 'myPageName.php',
                data: $('#myFormName').serialize(),
                success: function () {
                 alert("Email has been sent!");
                }
              });
          e.preventDefault();
        });
});
safeer008
quelle
Diese Antwort ist die einzige, die dafür sorgt, dass das Formular ordnungsgemäß funktioniert. In meinem Fall ist dies die einzige Lösung, da ich mein Formular von einem Dritten erhalte und nicht zu viel damit spielen kann.
Rustypaper
12

Eine gute Möglichkeit, das erneute Laden der Seite beim return falseSenden mithilfe eines Formulars zu verhindern, besteht darin, das Attribut onsubmit hinzuzufügen.

<form action="#" onsubmit="yourJsFunction();return false">
    <input type="text"/>
    <input type="submit"/>
</form>
arunavkonwar
quelle
3
Das hat bei mir total geklappt. Dies sollte als Antwort akzeptiert werden. action='#'
Ashok MA
1
Super alter Thread, aber für alle, die jetzt darauf stoßen, versuchen action="#"Sie es bitte nicht, da es nicht funktioniert und keine geeignete Lösung ist. Der Schlüssel ist eigentlichonsubmit="yourJsFunction();return false"
Jeff
Aber denkst du nicht, dass es nicht anmutig ist, falsch zurückzukehren?
Vicky Gonsalves
8

Dieses Problem wird komplexer, wenn Sie dem Benutzer zwei Möglichkeiten zum Senden des Formulars geben:

  1. durch Klicken auf eine Ad-hoc-Schaltfläche
  2. durch Drücken der Eingabetaste

In einem solchen Fall benötigen Sie eine Funktion, die die gedrückte Taste erkennt, in der Sie das Formular senden, wenn die Eingabetaste gedrückt wurde.

Und jetzt kommt das Problem mit IE (auf jeden Fall Version 11). Anmerkung: Dieses Problem existiert weder mit Chrome noch mit FireFox!

  • Wenn Sie auf die Schaltfläche "Senden" klicken, wird das Formular einmal gesendet. fein.
  • Wenn Sie die Eingabetaste drücken, wird das Formular zweimal gesendet ... und Ihr Servlet wird zweimal ausgeführt. Wenn Sie keinen Server auf der PRG-Architektur (Post Redirect Get) haben, ist das Ergebnis möglicherweise unerwartet.

Obwohl die Lösung trivial aussieht, habe ich viele Stunden gebraucht, um dieses Problem zu lösen, und ich hoffe, dass sie für andere Leute nützlich sein könnte. Diese Lösung wurde unter anderem erfolgreich auf IE (Version 11.0.9600.18426), FF (Version 40.03) und Chrome (Version 53.02785.143 m 64 Bit) getestet.

Der Quellcode HTML & js befindet sich im Snippet. Dort wird das Prinzip beschrieben. Warnung:

Sie können es nicht im Snippet testen, da die Post-Aktion nicht definiert ist und das Drücken der Eingabetaste den Stackoverflow beeinträchtigen kann.

Wenn Sie mit diesem Problem konfrontiert sind, kopieren Sie einfach js-Code in Ihre Umgebung und passen Sie ihn an Ihren Kontext an.

/*
 * inForm points to the form
 */
var inForm = document.getElementById('idGetUserFrm');
/*
 * IE submits the form twice
 * To avoid this the boolean isSumbitted is:
 *  1) initialized to false when the form is displayed 4 the first time
 * Remark: it is not the same event as "body load"
 */
var isSumbitted = false;

function checkEnter(e) {
  if (e && e.keyCode == 13) {
    inForm.submit();
    /*
      * 2) set to true after the form submission was invoked
      */
    isSumbitted = true;
  }
}
function onSubmit () {
  if (isSumbitted) {
    /*
    * 3) reset to false after the form submission executed
    */
    isSumbitted = false;
    return false;
  }
}
<!DOCTYPE html>
<html>
<body>

<form id="idGetUserFrm" method="post" action="servletOrSomePhp" onsubmit="return onSubmit()">
   First name:<br>
   <input type="text" name="firstname" value="Mickey">
   <input type="submit" value="Submit">
</form>

</body>
</html>

Mathias Zaja
quelle
5

Verwenden Sie in reinem Javascript: e.preventDefault()

e.preventDefault() wird in jquery verwendet, funktioniert aber in Javascript.

document.querySelector(".buttonclick").addEventListener("click", 
function(e){

  //some code

  e.preventDefault();
})
Deke
quelle
4

Die meisten Leute würden das Senden des Formulars durch Aufrufen der event.preventDefault()Funktion verhindern.

Eine andere Möglichkeit besteht darin, das onclick-Attribut der Schaltfläche zu entfernen und den Code einzugeben processForm(), .submit(function() {da return false;das Formular nicht gesendet wird . Stellen Sie außerdem sicher, dass die formBlaSubmit()Funktionen Boolesche Werte basierend auf der Gültigkeit für die Verwendung in zurückgebenprocessForm();

katshDie Antwort ist dieselbe, nur leichter zu verdauen.

(Übrigens, ich bin neu im Stackoverflow. Geben Sie mir bitte eine Anleitung.)

Ambrosechua
quelle
2
Obwohl es gut zu wissen ist, dass das return false;Ereignis auch nicht event.preventDefault(); event.stopPropagation();
Terry
4

Die beste Lösung ist, bei jedem Aufruf eine beliebige Funktion aufzurufen und danach false zurückzugeben.

onsubmit="xxx_xxx(); return false;"
xyz xyz
quelle
3

Persönlich möchte ich das Formular beim Senden validieren und wenn es Fehler gibt, gebe ich einfach false zurück.

$('form').submit(function() {

    var error;

   if ( !$('input').val() ) {
        error = true
    }

    if (error) {
         alert('there are errors')
         return false
    }

});

http://jsfiddle.net/dfyXY/

sqram
quelle
3
 $("#buttonID").click(function (e) {
          e.preventDefault();
         //some logic here
 }
Alex
quelle
1

Wenn Sie Pure Javascript verwenden möchten, ist das folgende Snippet besser als alles andere.

Nehmen wir an :

HTML :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Form Without Submiting With Pure JS</title>
        <script type="text/javascript">
            window.onload = function(){
                /**
                 * Just Make sure to return false so that your request will not go the server script
                 */
                document.getElementById('simple_form').onsubmit = function(){
                    // After doing your logic that you want to do 

                    return false 
                }
            }
        </script>
    </head>
    <body>

    </body>
</html>
<form id="simple_form" method="post">
    <!-- Your Inputs will go here  -->
    <input type="submit" value="Submit Me!!" />
</form>

Hoffe so funktioniert es für dich !!

Herr Suryaa Jha
quelle
0
function ajax_form(selector, obj)
{

    var form = document.querySelectorAll(selector);

    if(obj)
    {

        var before = obj.before ? obj.before : function(){return true;};

        var $success = obj.success ? obj.success: function(){return true;};

        for (var i = 0; i < form.length; i++)
        {

            var url = form[i].hasAttribute('action') ? form[i].getAttribute('action') : window.location;

            var $form = form[i];

            form[i].submit = function()
            {

                var xhttp = new XMLHttpRequest();

                xhttp.open("POST", url, true);

                var FD = new FormData($form);

                /** prevent submiting twice */
                if($form.disable === true)

                    return this;

                $form.disable = true;

                if(before() === false)

                    return;

                xhttp.addEventListener('load', function()
                {

                    $form.disable = false;

                    return $success(JSON.parse(this.response));

                });

                xhttp.send(FD);

            }
        }
    }

    return form;
}

Ich habe nicht überprüft, wie es funktioniert. Sie können (dies) auch binden, damit es wie jquery ajaxForm funktioniert

benutze es wie:

ajax_form('form',
{
    before: function()
    {
        alert('submiting form');
        // if return false form shouldn't be submitted
    },
    success:function(data)
    {
        console.log(data)
    }
}
)[0].submit();

Es gibt Knoten zurück, so dass Sie so etwas wie "Senden i" über dem obigen Beispiel tun können

Soweit es nicht perfekt ist, aber es funktioniert, sollten Sie die Fehlerbehandlung hinzufügen oder die Deaktivierungsbedingung entfernen

Łukasz Szpak
quelle
0

Verwenden Sie einfach "Javascript:" in Ihrem Aktionsattribut des Formulars, wenn Sie keine Aktion verwenden.

Kailash Kaswan
quelle
1
Fügen Sie ein Beispiel hinzu, um Ihre Lösung klarer zu machen.
Vikash Pathak
0

Manchmal e.preventDefault (); funktioniert dann Entwickler sind glücklich, aber manchmal nicht arbeiten dann Entwickler sind traurig, dann habe ich eine Lösung gefunden, warum manchmal nicht funktioniert

Der erste Code funktioniert manchmal

$("#prospects_form").submit(function(e) {
    e.preventDefault();
});

zweite Option, warum nicht arbeiten? Dies funktioniert nicht, da JQuery oder eine andere Javascript-Bibliothek nicht ordnungsgemäß geladen wird. Sie können in der Konsole überprüfen, ob alle JQuery- und Javascript-Dateien ordnungsgemäß geladen wurden oder nicht.

Dies löst mein Problem. Ich hoffe das wird hilfreich für dich sein.

Sumit Kumar Gupta
quelle
0

Meiner Meinung nach versuchen die meisten Antworten, das auf Ihrer Frage gestellte Problem zu lösen, aber ich denke nicht, dass dies der beste Ansatz für Ihr Szenario ist.

Wie kann ich verhindern, dass die Seite aktualisiert wird, wenn Sie auf die Schaltfläche "Senden" klicken, ohne dass Daten in den Feldern vorhanden sind?

A .preventDefault()aktualisiert die Seite tatsächlich nicht. Aber ich denke, dass ein einfaches requireFeld, das Sie mit Daten füllen möchten, Ihr Problem lösen würde.

<form id="prospects_form" method="post">
    <input id="form_name" tabindex="1" class="boxsize" type="text" name="name" placeholder="Full name*" maxlength="80" value="" required/>
    <input id="form_email" tabindex="2" class="boxsize" type="text" name="email" placeholder="Email*" maxlength="100" value="" required/>
    <input id="form_subject" class="boxsize" type="text" name="subject" placeholder="Subject*" maxlength="50" value="FORM: Row for OUBC" required/>
    <textarea id="form_message" class="boxsize" name="message" placeholder="Message*" tabindex="3" rows="6" cols="5" maxlength="500"></textarea>
</form>

Beachten Sie das requiream Ende jeweils hinzugefügte Tag input. Das Ergebnis ist dasselbe: Die Seite wird nicht ohne Daten in den Feldern aktualisiert.

Zebiano
quelle
0

Ich hoffe, dies ist die letzte Antwort


$('#the_form').submit(function(e){
  e.preventDefault()
  alert($(this).serialize())
  // var values = $(this).serialize()
  // logic....
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form id="the_form">
   Label-A <input type="text" name='a'required><br>
   Label-B <input type="text" name="b" required><br>
   Label-C <input type="password" name="c" required><br>
   Label-D <input type="number" name="d" required><br>
   <input type="submit" value="Save without refresh">
</form>

quelle
-1

Verwenden Sie für reines JavaScript stattdessen die Klickmethode

<div id="loginForm">
    <ul class="sign-in-form">
        <li><input type="text" name="username"/></li>
        <li><input type="password" name="password"/></li>
        <li>
            <input type="submit" onclick="loginForm()" value="click" />
        </li>
    </ul>
</div>

<script>
function loginForm() {
    document.getElementById("loginForm").click();
}
</script>

Dean Vollebregt
quelle
-1

<form></form>Ich habe gerade eine sehr einfache, aber funktionierende Lösung gefunden, indem ich sie aus dem Abschnitt entfernt habe, den ich nicht veröffentlichen und aktualisieren wollte.

<select id="youId" name="yourName">
<select> 
<option value="1</option>
<option value="2</option>
<option value="3</option>
</select>
<input id="formStockVal1" type="number"><br><br>
<form> 
<button type="reset" id="stockCancel">Cancel</button>
<button type="reset" id="stockConfirm">Add</button>
</form>

Hier reichen nur Buttons ein, wie sie sollten.

John_FistaH
quelle
Entfernen Sie das Namensattribut in den Feldern, die nicht an den Server gesendet werden sollen. stackoverflow.com/a/12827917/458321
TamusJRoyce
-2

Setzen Sie einfach die Rückkehr wie folgt ein:

function validate()
{

  var username=document.getElementById('username').value;
  
	  if(username=="")
	  {
		return false;	
	  }
	  if(username.length<5&&username.length<15)
	  {
	  	alert("Length should between 5 to 15 characters");
	  	return false;
	  }
	  
	  return true;
}
body{
	padding: 0px;
	margin:0px;
}

input{
	display: block;
	margin-bottom:10px;
	height:25px;
	width:200px;
}

input[type="submit"]{
	margin:auto;
}

label{
	display:block;
	margin-bottom:10px;
}

form{
		width:500px;
		height:500px;
		border:1px solid green;
		padding:10px;
		margin:auto;
		top:0;
		bottom:0;
		left:0;
		right:0;
		position:absolute;		
}

.labels{
	width: 35%;
	box-sizing:border-box;
	display: inline-block;
}

.inputs{
	width: 63%;
	box-sizing:border-box;
	padding:10px;
	display: inline-block;
}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>FORM VALIDATION</title>
	<link rel="stylesheet" type="text/css" href="style.css">

	<script type="text/javascript" src="script.js"></script>
</head>

<body>
	<form action="#">
		<div class="labels">
			<label>Name</label>
			<label>Email</label>
		</div>

		<div class="inputs">
			<input type="text" name="username" id="username" required>
			<input type="text" name="email" id="email" required>
		</div>
		
		<input type="submit" value="submit" onclick="return validate();">
	</form>
</body>

</html>

Geben Sie true und false von validate () zurück. Funktion nach Anforderung

Mohd Jahid
quelle
Sie sollten lieber einen Hinweis geben oder ein Code-Snippet anstelle dieses großen Codeteils bereitstellen
Felix Geenen