제출시 양식 새로 고침 중지 페이지 // CAPTCHA VALIDATION

필드에 데이터없이 전송 버튼을 누를 때 페이지가 새로 고쳐지지 않도록하려면 어떻게해야합니까?

유효성 검사가 제대로 설정되고 모든 필드가 빨간색으로 바뀌지 만 페이지가 즉시 새로 고쳐집니다. JS에 대한 나의 지식은 비교적 기본입니다.

특히 processForm()하단 의 기능이 ‘나쁜’것 같습니다.

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



답변

양식을 제출하지 못하게 할 수 있습니다

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

물론 함수에서 빈 필드를 확인할 수 있으며, 올바르게 보이지 않으면 e.preventDefault()제출이 중지됩니다.

jQuery없이 :

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


답변

이 onsubmit = “return false”코드를 추가하십시오.

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

그것은 나를 위해 그것을 고쳤다. 지정한 onClick 기능을 계속 실행합니다.


답변

버튼 유형을 button다음으로 바꿉니다 .

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


답변

이 코드를 사용하여 페이지를 새로 고치지 않고도 양식을 제출할 수 있습니다. 내 프로젝트 에서이 작업을 수행했습니다.

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

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


답변

양식을 사용하여 제출할 때 페이지를 다시로드하지 못하게하는 한 가지 좋은 방법은 return falseonsubmit 속성 을 추가 하는 것입니다.

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


답변

이 문제는 사용자에게 양식을 제출할 수있는 가능성을 제공 할 때 더욱 복잡해집니다.

  1. 애드혹 버튼을 클릭하여
  2. Enter 키를 쳐서

이 경우 Enter 키를 눌렀을 때 양식을 제출할 키를 감지하는 기능이 필요합니다.

이제 IE (어떤 경우 든 버전 11)에 문제가 발생합니다. 비고 :이 문제는 Chrome이나 FireFox에는 없습니다!

  • 제출 버튼을 클릭하면 양식이 한 번 제출됩니다. 좋아.
  • Enter 키를 누르면 양식이 두 번 제출됩니다 … 서블릿이 두 번 실행됩니다. PRG (포스트 리디렉션 가져 오기) 아키텍처 서버 측이없는 경우 결과가 예상치 못한 것일 수 있습니다.

해결책이 사소한 것처럼 보이지만이 문제를 해결하는 데 많은 시간이 걸렸으므로 다른 사람들에게 유용 할 수 있기를 바랍니다. 이 솔루션은 무엇보다도 IE (v 11.0.9600.18426), FF (v 40.03) 및 Chrome (v 53.02785.143m 64 비트)에서 성공적으로 테스트되었습니다.

소스 코드 HTML 및 js는 스 니펫에 있습니다. 원칙이 여기에 설명되어 있습니다. 경고:

사후 조치가 정의되지 않았고 Enter 키를 누르면 스택 오버 플로우를 방해 할 수 있으므로 스 니펫에서 테스트 할 수 없습니다.

이 문제가 발생하면 js 코드를 환경에 복사 / 붙여 넣기하여 상황에 맞게 조정하십시오.

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


답변

순수 자바 스크립트에서는 다음을 사용하십시오. e.preventDefault()

e.preventDefault() jquery에서 사용되지만 자바 스크립트에서 작동합니다.

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

  //some code

  e.preventDefault();
})