2012-01-06 4 views
0

У меня есть меню, в котором есть множественный выбор. У меня есть обработчик события щелчка, установленный для кнопки отправки, так что jQuery перебирает каждое выпадающее значение и выбирает ajax-вызов. Он отлично работает, за исключением самого последнего значения; последнее значение в списке, похоже, не делает его для вызова ajax, и если выбран только один элемент, то никаких действий не происходит. Любая помощь будет принята с благодарностью.JQuery .each() loop truncating last value

Вот мой код:

$("#add_members").click(function() { 
    var members = $("#project_members").val(); 

    jQuery.each(members, function() { 
     var projectid = <? php echo $project_id; ?> ; 
     var member = this[0]; 

     $.post([url], { 
      project_id: projectid, 
      user_id: member 
     }, function (data) { 
      alert(data); 
     }); 
    }); 

    location.reload(); 
}); 
+1

Скорее всего, что ни одна из данных не отправлена ​​из-за 'location.reload()'. Когда документ выгружается, каждый запрос (AJAX) отменяется. –

ответ

1

Я согласен с остальными, что у вас, скорее всего, есть состояние гонки. Ваше location.reload получает вызов сразу после последнего сообщения и, скорее всего, отменяет ваш ajax.

настройки вашего Аякса Постарайтесь не быть асинхронными с помощью $ .ajaxSetup

jQuery.ajaxSetup({async: false}); //set to false for this method 

    $.post([url], { 
     project_id: projectid, 
      user_id: member 
     }, function (data) { 
      alert(data); 
    }); 

    jQuery.ajaxSetup({async: true}); //Change it back when done if you so desire 

Это должно закончить свое состояние гонки.

+0

Спасибо. Я пробовал это, и он решил мою проблему. –

2

Короткий ответ: У вас есть ситуации гонки.

Более длинный ответ: проблема, с которой вы сталкиваетесь, заключается в том, что хотя .each является синхронным - это означает, что все элементы, повторяемые каждой командой, выполняются перед вызовом location.reload(). Однако .post является асинхронным - это означает, что вы не можете гарантировать, что все сообщения вернулись, прежде чем выйти из каждого цикла!

+0

Спасибо, что объяснили это. –

2

Вот простой пример работы с $ .each и выбирает: http://jsfiddle.net/7fhee/

Вопрос, скорее всего, что вы ожидаете ваш АЯКС вызов завершить до вызова location.reload(), который, вероятно, не идя в случай. Чтобы устранить проблему, вы должны выполнить функцию location.reload() в обратном вызове успеха ваших вызовов ajax.

+0

Спасибо за пример. –