Dừng trang làm mới biểu mẫu khi gửi


150

Làm cách nào để ngăn chặn trang làm mới khi nhấn nút gửi mà không có bất kỳ dữ liệu nào trong các trường?

Xác thực là thiết lập hoạt động tốt, tất cả các trường chuyển sang màu đỏ nhưng sau đó trang được làm mới ngay lập tức. Kiến thức về JS của tôi tương đối cơ bản.

Cụ thể, tôi nghĩ rằng processForm()chức năng ở phía dưới là "xấu".

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>

Mã não

$(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
    /////////////////
});

Câu trả lời:


177

Bạn có thể ngăn biểu mẫu gửi với

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

Tất nhiên, trong chức năng, bạn có thể kiểm tra các trường trống và nếu bất cứ điều gì không đúng, e.preventDefault()sẽ dừng gửi.

Không có jQuery:

var form = document.getElementById("myForm");
function handleForm(event) { event.preventDefault(); } 
form.addEventListener('submit', handleForm);

4
Phương pháp này yêu cầu jQuery. Tôi nghĩ rằng nó luôn luôn thực hành tốt hơn để ngăn chặn nó với thuộc tính loại nút.
Vicky Gonsalves

25
Phương pháp này có thể được thực hiện mà không cần jQuery với một cái gì đó như: var form = document.getElementById("myForm"); function handleForm(event) { event.preventDefault(); } form.addEventListener('submit', handleForm); Và tôi không biết làm thế nào để định dạng một nhận xét đúng, dường như.
Tynach

1
Về cơ bản, bao gồm event.preventDefault();trong mã xử lý biểu mẫu gửi của bạn. Một biến thể một lớp của những gì tôi đưa vào nhận xét khác của tôi (về cơ bản giống như phiên bản jQuery) sẽ là: document.getElementById("prospects_form").addEventListener('submit', function(event){event.preventDefault();});Có thể có một cách để làm cho nó ngắn hơn (bằng cách không sử dụng addEventListener(), nhưng có vẻ như những cách làm đó thường bị cau mày khi.
Tynach

84

Thêm mã onsubmit = "return false" này:

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

Điều đó đã sửa nó cho tôi. Nó vẫn sẽ chạy chức năng onClick mà bạn chỉ định


4
Và nó vẫn sẽ chạy xác thực mẫu của trình duyệt HTML5.
Daniel Sokolowski

1
Không có libs cần thiết, jquery là bản địa tuyệt vời là tốt hơn trong trường hợp này.
calbertts

4
Đây là giải pháp sạch nhất không có JQuery. Ngoài ra, bạn cũng có thể sử dụng nó như; onsubmit = "return submitFoo ()" và trả về false trong submitFoo () nếu bạn cần gọi một hàm khi gửi.
bmkorkut

8
nhưng nó sẽ không bao giờ để cho các hình thức trình.
Arun Raaj

75

Thay thế loại nút thành button:

<button type="button">My Cool Button</button>

3
Đây là phương pháp duy nhất được đề xuất để ngăn trang làm mới ngay cả khi có lỗi Javascript có thể hữu ích cho việc kiểm tra và phát triển.
jjz

14
Điều này hữu ích, nhưng không ngăn chặn việc gửi / tải lại khi người dùng nhấn [Enter].
System.Cats.Lol

13
không tốt cho xác thực mẫu: / bạn cần một nút gửi trong phần tử biểu mẫu
RomOne

Tôi nghĩ rằng điều này sẽ hoạt động nếu bạn chắc chắn rằng phía khách hàng sẽ luôn sử dụng JavaScript nếu không không nên loại bỏ nút gửi loại
briancollins081

1
@ briancollins081 Đây không phải là giải pháp toàn cầu. Câu trả lời này chỉ đề cập đến tình hình hiện tại của OP và nếu không có javascript, OP sẽ không bao giờ có thể gửi biểu mẫu ở bất cứ đâu ngay cả button type="submit"khi anh ấy đã gửi biểu mẫu trên hành động nút bằng jQuery.
Vicky Gonsalves

15

Bạn có thể sử dụng mã này để gửi biểu mẫu mà không cần làm mới trang. Tôi đã làm điều này trong dự án của tôi.

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

              $.ajax({
                type: 'post',
                url: 'myPageName.php',
                data: $('#myFormName').serialize(),
                success: function () {
                 alert("Email has been sent!");
                }
              });
          e.preventDefault();
        });
});

Câu trả lời này là câu duy nhất giữ cho biểu mẫu hoạt động như bình thường. Trong trường hợp của tôi, đó là giải pháp duy nhất vì tôi nhận được biểu mẫu của mình từ bên thứ ba và không thể chơi với nó quá nhiều.
rustyapers

12

Một cách tuyệt vời để ngăn tải lại trang khi gửi bằng biểu mẫu là thêm return falsebằng thuộc tính onsubmit của bạn.

<form action="#" onsubmit="yourJsFunction();return false">
    <input type="text"/>
    <input type="submit"/>
</form>

3
Điều này hoàn toàn làm việc cho tôi. Điều này nên được chấp nhận câu trả lời. action='#'
Ashok MA

1
Chủ đề siêu cũ, nhưng đối với bất kỳ ai gặp phải điều này bây giờ, xin vui lòng không thử action="#"vì nó không hoạt động và không phải là một giải pháp thích hợp. Chìa khóa thực sự làonsubmit="yourJsFunction();return false"
Jeff

Nhưng bạn không nghĩ rằng trả lại sai là không duyên dáng?
Vicky Gonsalves

8

Vấn đề này trở nên phức tạp hơn khi bạn cung cấp cho người dùng 2 khả năng để gửi biểu mẫu:

  1. bằng cách nhấp vào nút ad hoc
  2. bằng cách nhấn phím Enter

Trong trường hợp như vậy, bạn sẽ cần một chức năng phát hiện phím được nhấn trong đó bạn sẽ gửi biểu mẫu nếu nhấn phím Enter.

Và bây giờ có vấn đề với IE (trong mọi trường hợp phiên bản 11) Lưu ý: Vấn đề này không tồn tại với Chrome cũng như với FireFox!

  • Khi bạn nhấp vào nút gửi, biểu mẫu được gửi một lần; khỏe.
  • Khi bạn nhấn Enter, biểu mẫu được gửi hai lần ... và servlet của bạn sẽ được thực thi hai lần. Nếu bạn không có máy chủ kiến ​​trúc PRG (post redirect get), kết quả có thể bất ngờ.

Mặc dù giải pháp có vẻ tầm thường, tôi đã mất nhiều giờ để giải quyết vấn đề này, vì vậy tôi hy vọng nó có thể hữu ích cho những người khác. Giải pháp này đã được thử nghiệm thành công, trong số các giải pháp khác, trên IE (v 11.0.9600.18426), FF (v 40.03) & Chrome (v 53.02785.143 m 64 bit)

Mã nguồn HTML & js nằm trong đoạn mã. Nguyên tắc được mô tả ở đó. Cảnh báo:

Bạn không thể kiểm tra nó trong đoạn trích vì hành động đăng bài không được xác định và nhấn phím Enter có thể can thiệp vào stackoverflow.

Nếu bạn gặp phải vấn đề này, thì chỉ cần sao chép / dán mã js vào môi trường của bạn và điều chỉnh nó theo ngữ cảnh của bạn.

/*
 * 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>


5

Trong Javascript thuần túy, sử dụng: e.preventDefault()

e.preventDefault() được sử dụng trong jquery nhưng hoạt động trong javascript.

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

  //some code

  e.preventDefault();
})

4

Hầu hết mọi người sẽ ngăn chặn biểu mẫu gửi bằng cách gọi event.preventDefault()hàm.

Một cách khác là loại bỏ thuộc tính onclick của nút và lấy mã processForm()ra .submit(function() {làm return false;nguyên nhân khiến biểu mẫu không gửi được. Ngoài ra, làm cho các formBlaSubmit()hàm trả về Boolean dựa trên tính hợp lệ, để sử dụng trongprocessForm();

katshCâu trả lời là như nhau, chỉ dễ tiêu hóa hơn.

(Nhân tiện, tôi mới sử dụng stackoverflow, vui lòng cho tôi hướng dẫn.)


2
Mặc dù thật tốt khi biết rằng điều đó return false;cũng ngăn sự kiện nổi lên DOM - đó là một cách viết tắt củaevent.preventDefault(); event.stopPropagation();
Terry

4

Giải pháp tốt nhất là onsubmit gọi bất kỳ chức năng nào bạn muốn và trả về false sau nó.

onsubmit="xxx_xxx(); return false;"

3

Cá nhân tôi muốn xác nhận mẫu khi gửi và nếu có lỗi, chỉ cần trả lại sai.

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

    var error;

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

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

});

http://jsfiddle.net/dfyXY/


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

1

Nếu bạn muốn sử dụng Pure Javascript thì đoạn mã sau sẽ tốt hơn bất kỳ thứ gì khác.

Giả sử :

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>

Hy vọng nó sẽ làm việc cho bạn !!


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

Không kiểm tra làm thế nào nó hoạt động. Bạn cũng có thể liên kết (cái này) để nó hoạt động như jquery ajaxForm

sử dụng nó như:

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

nó trả về các nút để bạn có thể làm một cái gì đó như gửi i ví dụ trên

Không hoàn hảo nhưng nó có thể hoạt động, bạn nên thêm xử lý lỗi hoặc loại bỏ điều kiện vô hiệu hóa


0

Chỉ cần sử dụng "javascript:" trong thuộc tính hành động của bạn nếu bạn không sử dụng hành động.


1
Bao gồm một số ví dụ để làm rõ hơn giải pháp của bạn.
Vikash Pathak

0

Đôi khi e.preventDefault (); công việc sau đó các nhà phát triển vui mừng nhưng đôi khi không hoạt động thì các nhà phát triển buồn bã

mã đầu tiên đôi khi hoạt động

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

lựa chọn thứ hai tại sao không làm việc? Điều này không hoạt động vì jquery hoặc thư viện javascript khác không tải đúng cách, bạn có thể kiểm tra nó trong bảng điều khiển rằng tất cả các tệp jquery và javascript có được tải đúng hay không.

Điều này giải quyết vấn đề của tôi. Tôi hy vọng điều này sẽ hữu ích cho bạn.


0

Theo tôi, hầu hết các câu trả lời đang cố gắng giải quyết vấn đề được hỏi về câu hỏi của bạn, nhưng tôi không nghĩ đó là cách tiếp cận tốt nhất cho kịch bản của bạn.

Làm cách nào để ngăn chặn trang làm mới khi nhấn nút gửi mà không có bất kỳ dữ liệu nào trong các trường?

A .preventDefault()thực sự không làm mới trang. Nhưng tôi nghĩ rằng một đơn giản requiretrên các lĩnh vực bạn muốn điền dữ liệu, sẽ giải quyết vấn đề của bạn.

<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>

Lưu ý các requirethẻ được thêm vào cuối mỗi input. Kết quả sẽ giống nhau: không làm mới trang mà không có bất kỳ dữ liệu nào trong các trường.


0

Tôi hy vọng đây sẽ là câu trả lời cuối cùng


$('#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>

-1

Đối với JavaScript thuần, sử dụng phương thức nhấp thay thế

<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>


-1

Chỉ cần tìm một giải pháp rất đơn giản nhưng hiệu quả, bằng cách xóa <form></form>khỏi phần tôi muốn ngăn không cho đăng và làm mới.

<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>

Ở đây chỉ có các nút gửi như họ cần.


Xóa thuộc tính tên trên các trường bạn không muốn gửi đến máy chủ. stackoverflow.com/a/12827917/458321
TamusJRoyce

-2

Chỉ cần trả lại như thế này:

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>

Trả về đúng và sai từ xác thực (); chức năng theo yêu cầu


bạn nên đưa ra một gợi ý hoặc cung cấp một đoạn mã thay vì đoạn mã lớn này
Felix Geenen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.