Javascript каждый цикл вопросов - PullRequest
0 голосов
/ 28 июля 2011

У меня странная проблема, и я хотел бы получить профессиональную обратную связь.

Я создаю приложение CRM, где у меня есть форма с кнопкой предварительного просмотра. Когда кнопка предварительного просмотра нажата, моя функция FIRST сохраняет все поля формы в БД через Ajax и затем отправляет форму для предварительного просмотра.

Поля формы хранятся в массиве (так как эти поля изменяются). Я зацикливаю массив с помощью jQuery.each (myArray, function (index, value).

Проблема в том, что форма отправляется до выполнения цикла. Если я помещаю предупреждение в цикл или добавляю установленное время ожидания в document.submit (), все работает хорошо.

Я хотел бы знать, почему цикл не завершается, прежде чем перейти к следующей строке в коде.

Вот мой код.

var myArray = ['sub','msg','pic','field4','field5','field6','field7'];
jQuery(document).ready(function($){
  $.each(myArray, function(index, value) {
       SaveFields(value); // my function that saves to db via Ajax call
     });
  });

//document.formName.submit(); // this submits the form before .each loop can execute
eval("setTimeout('document."+formName+".submit()', 700)"); // THIS WORKS AS INTENDED

Я также попытался посчитать элементы массива и добавил submit () внутри цикла следующим образом ...

var ArrCount = myArray.length - 1;

 jQuery(document).ready(function($){
   $.each(myArray, function(index, value) {
      var saveIt = SaveFields(value);

        if (ArrCount == index){
        document.formName.submit(); // this also submits the form before .each loop can execute
         }

    });
  });

Те же результаты! Он будет работать только с предупреждением или setTimout!

Любая помощь приветствуется, потому что я действительно хочу знать, почему цикл не завершается, прежде чем перейти к следующей строке.

Ответы [ 5 ]

2 голосов
/ 28 июля 2011

Функция jQuery.ready заставляет ваш цикл выполняться, когда DOM загружен и готов. Поскольку ваш document.formName.submit () находится за пределами вызова готовности, он выполняется немедленно. Попробуйте переместить его в готовый вызов, например, так:

var myArray = ['sub','msg','pic','field4','field5','field6','field7'];
jQuery(document).ready(function($){
  $.each(myArray, function(index, value) {
    SaveFields(value); 
  });
  document.formName.submit(); 
});
1 голос
/ 28 июля 2011

То, как ваш код, вы выполняете функцию при загрузке страницы (или после таймера или предупреждения), кажется, что вам нужно сделать это при событии отправки. Примерно так должно работать:

$("#formElementId").submit(function() {
  $.each(myArray, function(index, value) {
       SaveFields(value); // my function that saves to db via Ajax call
     });
  });
});
0 голосов
/ 28 июля 2011

Что вам нужно сделать, это установить обработчик события для функции отправки формы

, например,

$(document).ready(function($){

$("#yourForm").submit(function (e) {

e.preventDefault();

$.each(myArray, function(index, value) {
       SaveFields(value); // my function that saves to db via Ajax call
     });
  });

$("#yourForm").submit(); // or using your own $.ajax submit call

});
0 голосов
/ 28 июля 2011

Вам необходимо сделать метод сохранения данных обработчиком для onSubmit вашей формы:

<form id="myForm" ... onsubmit="return saveAndLoadPreview(this, window.event)">

...

function saveAndLoadPreview(sender, evt){
    // ajax-post the data
    return true;
}
0 голосов
/ 28 июля 2011

Функция jQuery .ready () - это обработчик событий, который срабатывает только при загрузке DOM.Поскольку функция submit () вызывается вне блока ready (), выполнение передается ему после загрузки обработчика, а не при его запуске.

...