jQuery-기본값 방지 후 기본값 계속


104

제출할 때 양식을 제출하기 전에 추가 처리를해야하는 양식이 있습니다. 기본 양식 제출 동작을 방지 한 다음 추가 처리 (기본적으로 Google Maps API를 호출하고 양식에 숨겨진 필드 몇 개를 추가 함)를 수행 한 다음 제출할 양식이 필요합니다.

"불이행을 방지"하고 나중에 "불이행을 계속"하는 방법이 있습니까?


@FelixKling 당신은 stackoverflow.com/questions/7610871/… 을 의미 했습니까 ?
M. Mimpen

답변:


53

.submit()이벤트를 양식에 바인딩하고 반환하기 전에 원하는 작업을 수행하면 (true) 이러한 일이 실제 제출 전에 발생합니다.

예를 들면 :

$('form').submit(function(){
    alert('I do something before the actual submission');
    return true;
});

간단한 예

jquery.com의 또 다른 예 : http://api.jquery.com/submit/#entry-examples


2
"return true"전에 모든 코드가 제출 될 때까지 양식이 제출되지 않는다는 말입니까? 문이 실행됩니까?
developarvin

2
네, 정확히 submit () 함수가하는 일입니다.
Ron van der Heijden

8
동시 적이기 때문에 좋은 예가 아닙니다. 내가해야 할 일이 비동기 호출이면 어떻게 되나요? 따라서 사례는 "제출을 클릭-> 비동기 작업을 수행하고 양식을 제출하지 마십시오.-> 비동기 콜백에서 양식의 일부 필드를 채우십시오-> 콜백에서 양식을 제출하십시오"
The Godfather

1
비동기 jQuery 코드를 실행하는 것은 어떻습니까?! 너무 작동합니까?
캔들 잭

이것은 나를 위해 잘 작동합니다. 제출하기 전에 제어하는 ​​데 사용하고, 잘못된 경우 "return false"를 사용합니다. 이 솔루션을 하루 동안 찾았습니다. 감사합니다.
livefreeor

53

사용하다 jQuery.one()

요소의 이벤트에 핸들러를 연결합니다. 핸들러는 이벤트 유형별로 요소 당 최대 한 번 실행됩니다.

$('form').one('submit', function(e) {
    e.preventDefault();
    // do your things ...

    // and when you done:
    $(this).submit();
});

one이 사용자 정의 submit이벤트는 첫 번째 제출 후 분리 되기 때문에 방지도 무한 루프를 사용 합니다.


2
그것은 :( 다시 클릭 한 후 제출
호기심을

아마 당신은 무한 루프에 직면하게 될 것이다
메흐 다드 HosseinNejad

무한 루프, 함수는 .one이 아닌
.on

26

나는 그냥 할 것입니다.

 $('#submiteButtonID').click(function(e){
     e.preventDefault();
     //do your stuff.
     $('#formId').submit();
 });

양식을 제출해야하는 경우 preventDefault처음에 호출 하고 submit()나중에 함수를 사용 하십시오.


클릭 이벤트 핸들러 내부에 로직을 포함하지 마십시오. 다른 사람의 책임에 위임하십시오.
Royi Namir

27
이것은 확실히 버튼을 클릭 할 것이라고 가정합니다. 사용자가 양식 내에서 "입력"버튼을 누르면 어떻게됩니까? 또한 양식을 제출합니다. 따라서 제출 버튼이 클릭되는 것에 의존하는 것은 좋은 생각이 아닙니다.
StackOverflowNewbie

질문에 언급 아무 관련 코드가 없었기 때문에 난 그냥 ... ... 클릭의 예를 제공했다
bipen

2
어쨌든 당신이 제공 한 스 니펫은 사용자가 버튼을 클릭해야만 작동합니다. 그것은 양식이 작동하는 방식이 아닙니다. 다른 제안이 있습니까?
StackOverflowNewbie

바인드 클릭은 기본을 방지하고 버튼 클릭을 제출 트리거
candlejack

18

이 방법을 사용하면 JS에서 무한 루프를 수행합니다. 더 나은 방법으로 다음을 사용할 수 있습니다.

var on_submit_function = function(evt){
    evt.preventDefault(); //The form wouln't be submitted Yet.
    (...yourcode...)

    $(this).off('submit', on_submit_function); //It will remove this handle and will submit the form again if it's all ok.
    $(this).submit();
}

$('form').on('submit', on_submit_function); //Registering on submit.

도움이 되었기를 바랍니다. 감사!


실제로 가장 좋은 방법은 비동기 함수를 사용한 변형 -gist.github.com/BjornMelgaard/8ba0ee9d07c20dd8c8b3550c9df3e9ef
srghma

@bjornmelgaard 나는 비동기가 비표준 이라는 것을 기억해야한다 .
발레리오 보즈

6

IMHO는 가장 일반적이고 강력한 솔루션입니다 (예 : '사용자가 버튼을 클릭'하는 경우와 같이 작업이 사용자에 의해 트리거되는 경우).

  • 핸들러가 처음 호출되면 WHO가 트리거했는지 확인하십시오.
    • 사용자가 티거를 한 경우-작업을 수행 한 다음 다시 트리거 (원하는 경우)-프로그래밍 방식
    • 그렇지 않으면-아무 작업도하지 않습니다 (= "기본값 계속").

예를 들어 "Are you sure?"를 추가하는이 우아한 솔루션에 주목하십시오. 속성으로 버튼을 장식하기 만하면 모든 버튼에 팝업이 표시됩니다. 사용자가 옵트 아웃하지 않으면 조건부로 기본 동작을 계속합니다.

1. "확실합니까"팝업을 원하는 모든 버튼에 경고 텍스트를 추가해 보겠습니다.

<button class="btn btn-success-outline float-right" type="submit"  ays_text="You will lose any unsaved changes... Do you want to continue?"                >Do something dangerous</button>

2. 이러한 모든 버튼에 핸들러를 연결합니다.

$('button[ays_text]').click(function (e, from) {
    if (from == null) {  // user clicked it!
        var btn = $(this);
        e.preventDefault();
        if (confirm() == true) {
            btn.trigger('click', ['your-app-name-here-or-anything-that-is-not-null']);
        }
    }
    // otherwise - do nothing, ie continue default
});

그게 다야.


1
좋은 대답입니다! 난 당신이 .trigger ()에 추가 인수를 전달할 수 있다는 것을 알지 못했다
제임스 히 버드

5
$('#myform').on('submit',function(event){
  // block form submit event
  event.preventDefault();

  // Do some stuff here
  ...

  // Continue the form submit
  event.currentTarget.submit();
});

3

jQuery와 @ Joepreludian의 대답은 위의 작은 변화 :

명심해야 할 중요 사항 :

  • .one(...) 대신에 .on(...) or .submit(...)
  • named대신 기능을 anonymous function우리가 내을 참조되기 때문이다 callback.

$('form#my-form').one('submit', function myFormSubmitCallback(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    var $this = $(this);
    if (allIsWell) {
        $this.submit(); // submit the form and it will not re-enter the callback because we have worked with .one(...)
    } else {
        $this.one('submit', myFormSubmitCallback); // lets get into the callback 'one' more time...
    }
});

allIsWell아래 스 니펫 의 변수 값을 변경 true하거나 false기능을 테스트 할 수 있습니다.

$('form#my-form').one('submit', function myFormSubmitCallback(evt){
  evt.stopPropagation();
  evt.preventDefault();
  var $this = $(this);
  var allIsWell = $('#allIsWell').get(0).checked;
  if(allIsWell) {
    $this.submit();
  } else {
    $this.one('submit', myFormSubmitCallback);
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="/" id="my-form">
  <input name="./fname" value="John" />
  <input name="./lname" value="Smith" />
  <input type="submit" value="Lets Do This!" />
  <br>
  <label>
    <input type="checkbox" value="true" id="allIsWell" />
    All Is Well
  </label>
</form>

행운을 빕니다...


2

순수한 자바 스크립트 방식으로 디폴트를 방지 한 후 양식을 제출할 수 있습니다.

때문이다 HTMLFormElement.submit() 호출하지onSubmit(). 따라서 우리는 여기에 사용자 정의 onsubmit 핸들러가없는 것처럼 양식을 제출하기 위해 해당 사양 이상에 의존하고 있습니다.

var submitHandler = (event) => {
  event.preventDefault()
  console.log('You should only see this once')
  document.getElementById('formId').submit()
}

동기 요청 은 이 바이올린 을 참조하십시오 .


비동기 요청이 완료 될 때까지 기다리는 것도 쉽습니다.

var submitHandler = (event) => {
  event.preventDefault()
  console.log('before')
  setTimeout(function() {
    console.log('done')
    document.getElementById('formId').submit()
  }, 1400);
  console.log('after')
}

비동기 요청 의 는 내 바이올린을 확인할 수 있습니다 .


그리고 약속에 만족한다면 :

var submitHandler = (event) => {
  event.preventDefault()
  console.log('Before')
    new Promise((res, rej) => {
      setTimeout(function() {
        console.log('done')
        res()
      }, 1400);
    }).then(() => {
      document.getElementById('bob').submit()
    })
  console.log('After')
}

그리고 여기에 요청이 있습니다.


1

e.preventDefault()현재 작업을 중지하는 데 사용할 수 있습니다 .

당신이 할 수있는 것보다$("#form").submit();

 $('#form').submit(function (e)
{
    return !!e.submit;
});
if(blabla...)
{...
}
else
{
    $('#form').submit(
    {
        submit: true
    });
}

이것은 저에게 매우 혼란 스럽습니다. 이건 그냥 돌아 다니지 않을까요?
dapidmini

1

"루핑 제출없이 유효성 검사 주입":

HTML5 유효성 검사 전에 reCaptcha 및 기타 항목을 확인하고 싶으므로 다음과 같이했습니다 (유효성 검사 함수가 true 또는 false를 반환 함).

$(document).ready(function(){
   var application_form = $('form#application-form');

   application_form.on('submit',function(e){

        if(application_form_extra_validation()===true){
           return true;
        }

        e.preventDefault();

   });
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.