Javascript условно предотвратяване по подразбиране въз основа на обратно извикване

Опитвам се да използвам javascript на бутон за изпращане. При натискане на бутона за изпращане стартирам рутина, която извършва отдалечено обратно извикване с манипулатор на обратно извикване h. Въз основа на резултата от h ще реша дали да продължа с изпращането или не, или да предотвратя Default и да остана на страницата.

Опитах няколко подхода. Първият е да стартирате изпращането с помощта на jquery след обратното извикване:

$('#submit').on('click', function(e) {
  e.preventDefault();
  run_func_with_callback(h);
}

h() {
  if (success) {
    $('#submit').submit();
  }
}

Друг се опитва за безкраен цикъл, докато флагът не бъде променен от обратното извикване:

callback_flag = 0;

$('#submit').on('click', function(e) {
  run_func_with_callback(h);
  while(callback_flag == 0) {
    setTimeout(function() {}, 1000); // I want some form of sleep function here
  }

  if (callback_flag == -1) {
    e.preventDefault();
  }
}

h() {
  if (success) {
    callback_flag = 1;
  } else {
    callback_flag = -1;
  }
}

Нито едно от тези решения обаче не работи. Първият, предполагам, че jQuery просто не работи по този начин. Вторият метод, който направих, не беше функция за сън и не се държи по начина, по който трябва.

Всякакви прозрения са добре дошли. Благодаря!


person gtr32x    schedule 12.01.2013    source източник
comment
Единственият начин е незабавно да предотвратите събитието и след това да го задействате отново от обратното извикване, ако е необходимо.   -  person Felix Kling    schedule 12.01.2013
comment
Прозрението ви е правилно - вторият метод няма да работи. Трябва да задействате изпращането от обратното извикване.   -  person John Dvorak    schedule 12.01.2013
comment
Изглежда и двамата споменавате, че трябва да задействам изпращането от обратното извикване, както в първия ми метод. Въпреки това, когато го опитам, страницата все още замръзва и нищо не се случва. Трябва ли да направя нещо друго или синтаксисът е различен?   -  person gtr32x    schedule 12.01.2013
comment
Първият подход изглежда добре, с една важна подробност: какво е success? Очаквам да бъде извлечен от отговора, но вие дори не декларирате аргумента на отговора на вашето обратно извикване.   -  person John Dvorak    schedule 12.01.2013
comment
Опитайте първия метод, но .submit() формуляра, а не бутона.   -  person darma    schedule 12.01.2013
comment
свързани stackoverflow.com/q/14241980/218196   -  person Felix Kling    schedule 12.01.2013
comment
@gtr32x: Трябва да сте сигурни, че няма да попаднете в безкраен цикъл на събития, напр. с помощта на флаг. т.е. втори път, когато изпратите формуляра, асинхронното извикване не трябва да се извършва и не трябва да извиквате .prevenDefault.   -  person Felix Kling    schedule 12.01.2013


Отговори (2)


Придържайки се към първия си подход, нещо като това ще свърши ли работа:

$('#submit').on('click', function(e) {
    if(!success) {
        e.preventDefault();
        run_func_with_callback(h);
    }
    else {
        success = false;
    }
}

h() {
    if (success) {
        $('#submit').click();
    }
}

Важното е да задействате събитието click в обратното извикване и след това да използвате стойността на success за условно изпълнение на подаването.

person nick_w    schedule 12.01.2013

Можете ли да опитате това?

$('#submit').on('click', function(e) {
  e.preventDefault();
  run_func_with_callback(h);
}

h() {
  if (success) {
    $('#submit').closest("form").submit();
  }
}
person ATOzTOA    schedule 12.01.2013
comment
Не, изглежда, че submit() просто не функционира по някаква причина. - person gtr32x; 12.01.2013