выбор полей с последующим ajax запросом jQuery

WMix

герр M:)ller
Партнер клуба
есть список чекбоксов, и пралагаемое к ним колличество

[_] чекбокс 1 [________12_]
[x] чекбокс 2 [________11_]
[x] чекбокс 3 [________45_]
[ ::КНОПОЧКА:: ]

нужно отправить колличество выбранных позиций

мне не нравиться что я придумываю некий цикл, для обработки
PHP:
$('#КНОПКА').live('click', function(event){
	var s={};
	var i=0; // начинаем с нуля
	$('input[type=checkbox]:checked').each( function( idx ){ // все выбранные чекбоксы
		s[$(this).val()] = $ ('#quantity-' + $(this).val() ).val(); // собираем колличество
		if(++i == $('#input[type=checkbox]:checked').length){ // только когда все обошел делай запрос
			$.ajax({
				data: {qty: s},
				//...
			});
		}
	});
});
как это написать правильно
 

Baton

Новичок
А просто вынести отправку из цикла нельзя чтоли?

PHP:
$('#КНОПКА').live('click', function(event){
    var s={};
    $('input[type=checkbox]:checked').each( function( idx ){ // все выбранные чекбоксы
        s[$(this).val()] = $ ('#quantity-' + $(this).val() ).val(); // собираем колличество
    });
    $.ajax({
        data: {qty: s},
        //...
    });
});
 

WMix

герр M:)ller
Партнер клуба
А просто вынести отправку из цикла нельзя чтоли?
боюсь что нет. each принимает некий callback, внутренности которого будут обрабатываться параллельно, далее выполняется следующая строчка

я не уверен, что $.ajax запустится позже чем пробежит внутренний цикл...
 

Baton

Новичок
Паралельно с чем-то может сработать Ваша первая анонимная функция, которая забиндена на click. А все что внутри нее будет обрабатываться последовательно.
 

WMix

герр M:)ller
Партнер клуба
странно,.. работает....
я думал callback всегда выполняется параллельно...
 

Baton

Новичок
В джаваскрипте всего один поток выполнения. События на элементах типа click, down, press etc являются асинхронными и прерывают поток выполнения программы, так сказать вклиниваются в него. jQuery.each не прерывает поток выполнения, т.е не является асинхронным.

Я так себе это понимаю, возможно кто-то меня поправит, буду благодарен.

ЗЫ: еще асинхронным является XMLHttpRequest (по умолчанию, можно сделать синхронным), а это значит что если добавить в вашу функцию код после отправки, то он начнет исполняться до получения результата с сервера.
 

WMix

герр M:)ller
Партнер клуба
я соурс смотрел на each
поток не прерывается...
PHP:
...
each: function( callback, args ) {
		return jQuery.each( this, callback, args );
},
...
PHP:
...
each: function( object, callback, args ) {
		var name, i = 0,
			length = object.length,
			isObj = length === undefined || jQuery.isFunction( object );

		if ( args ) {
			if ( isObj ) {
				for ( name in object ) {
					if ( callback.apply( object[ name ], args ) === false ) {
						break;
					}
				}
			} else {
				for ( ; i < length; ) {
					if ( callback.apply( object[ i++ ], args ) === false ) {
						break;
					}
				}
			}

		// A special, fast, case for the most common use of each
		} else {
			if ( isObj ) {
				for ( name in object ) {
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
						break;
					}
				}
			} else {
				for ( ; i < length; ) {
					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
						break;
					}
				}
			}
		}

		return object;
	},
...

мир стал проще...
 
Сверху