Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Неправильно работает метод each() (https://javascript.ru/forum/jquery/23142-nepravilno-rabotaet-metod-each.html)

KamalovRadik 13.11.2011 20:09

Неправильно работает метод each()
 
$('.button2').live('click',function(){
			$('#poleGame img').each(function(){
					$('#karts').append($(this));
					$('#poleGame img').remove()})
				
			randSopernik();
			hodSoper();
			//return false;
			})



После того как я нажму кнопку , вып-ся each(), затем randSopernik(), hodUser() и опять заходит в each. Почему?

KamalovRadik 13.11.2011 21:53

в ф-ии hodSoper картинка появляется в блоке poleGame, после того как сыграет each. Но почему-то опять туда возвращается

KamalovRadik 13.11.2011 22:57

var flagBeru = false;
		$('.button2').live('click',function(){
			
			for (i=0; i< $('#poleGame img').length; i++){
				
				if(flagBeru){
					return false;
				}
				$('#karts').append($('#poleGame img').eq(i));
				flagBeru = true;
				
			
														}
			randSopernik();
			hodSoper();
			//return false;
			})


Этот код работает, скажите, в чем ошибка в первом посте?

KamalovRadik 13.11.2011 23:34

А нет, я ошибся оказывается, в 4ом посте код тоже не рабочий

И возвращается не в цикл, а в live, причём
в 1 случае - 1 раз
во 2 - 2
в 3 - 4
в 4 - 8
в 5 - 16 и т.д.

Думаю в этом есть какая-то зависимость.

DjDiablo 14.11.2011 00:18

Each удачнее чем for, можно сказать в 5ом посте исправлена ошибка.
А что такое flagBeru ? Нафига он вам нужен ?

вместо return False разумно для прерывания цикла использовать break. Прокатит только для цикла for, насколько я знаю.
Неудобство фор в том что нумерация элементов после append будет меняться. Но эта проблема легко решается если сделать выборку до цикла и сохранить её в переменную img=$('#karts').append($('#poleGame img');

trikadin 14.11.2011 00:34

Цитата:

Сообщение от DjDiablo
Прокатит только для цикла for, насколько я знаю.

Хм...
i=0;
while(i!= 9000) {
 if (++i==20)
  break
};
alert(i);

DjDiablo 14.11.2011 00:58

Цитата:

Хм...
Не цепляйся к словам :)
Я имел ввиду что each не совсем цикл, а всё таки метод.
И return в callback, для each уместнее чем break.

а у него return внутри for цикла был.

trikadin 14.11.2011 01:04

Цитата:

Сообщение от DjDiablo
Не цепляйся к словам

Не цеплялся) Просто понял тебя неправильно.

KamalovRadik 15.11.2011 23:42

Сделал вот так:

function forVzyal() {
            kolvoElem = $('#poleGame img').length;
            for (i=0; i< $('#poleGame img').length; i++){
                
                
                
                $('#karts').append($('#poleGame img').eq(i));
              
                                                        }
            
                                            }
                           
        
        $('.button2').click(function(){
            forVzyal();
            randSopernik();
            hodSoper();
            
          
            })

KamalovRadik 15.11.2011 23:43

Вот почему у меня после ф-ии hodSoper снова выполняется forVzyal()?

DjDiablo 16.11.2011 00:08

покажи код forVzyal(); randSopernik(); hodSoper();
код в 11ом сообщение, такого поведения не объясняет.

KamalovRadik 16.11.2011 12:32

function hodSoper() {
	lengthKartSoper=$('#kartsSoper img').length;  // Длина карт собперника
	//for(p=0;p<lengthKartSoper; p++){
	if($('#poleGame').html() == '') {
	
	
		
		//$('img').each(function(i, index){
			for(i=0;i<lengthKartSoper;i++) {
			
		atribSop = $('#kartsSoper img').eq(i).attr('src'); //записываю в переменную атриб значение атрибута соурс для дальшейшего использования в регулярке
		
		 regV = /\d{1,3}/; // Регудярное выражение: найти любую цифру 1 или 2хзначную
		 var resultSop = atribSop.match(regV); //Поместим в переменную резулт это число для работы с ним в массиве
	resultSop=parseInt(resultSop,10);
	
	if (resultSop<kartaHoda) {kartaHoda=resultSop; countSopHod=i; } // В первом случае резултСопер  по любому будет меньше чем картаХода, а в последующих находим минимальную карту среди карт противника
			}
			
					
			$('#poleGame').append($('#kartsSoper img').eq(countSopHod)); // Ходим этой минимальной картой
			resultOstDelSoper = kartaHoda%10; // определим масть карты, которой сходил соперник
		
		
			
		// Создадим для ф-и pokrivSop глобальные переменные
	var arrayPodkid = [];
		countPodkid=0;
		var flagBeru = false;
		
		function forVzyal() {//if(!flagBeru){
			kolvoElem = $('#poleGame img').length;
			for (i=0; i< $('#poleGame img').length; i++){
				
				
				
				$('#karts').append($('#poleGame img').eq(i));
				//flagBeru = true;
														}
			
											}
							//}
		
		$('.button2').click(function(){
			forVzyal();
			randSopernik();
			hodSoper();
			
			//return false;
			})

KamalovRadik 17.11.2011 15:51

В консоле ошибка: forVzyal is not defined


Часовой пояс GMT +3, время: 05:17.