 
			
				14.02.2011, 17:38
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.11.2009 
					
					
					
						Сообщений: 79
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Если селектор возвращает массив узлов, как работать с каждым по отдельности?
			 
			
		
		
		
		Сорри, тупой вопрос. Может быть я сильно торможу =( Не могу понять такую штуку. Допустим на странице есть несколько инпутов, и я их  выбираю таким способом: 
var inputs = $('input');
Как я понимаю, теперь inputs - просто массив, в котором хранятся узлы в jqueryвском формате (простите, не знаю, как правильно их называть). Но когда я делаю так:
 
for (var i = 0; i < inputs.length; i++) {
    var $input = inputs[i];
    // $input - это jqueryвский элемент и я могу обращаться ко
    // всяким функциям, например attr()
    $input.attr('name'); // и вижу ошибку, мол элемент не имеет метода attr
}
В чем ошибка?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.02.2011, 17:54
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 ⊞ Развернуть 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2010 
					
					
					
						Сообщений: 1,810
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Ошибка в том, что inputs[i] - это не jQuery-объект, а обычный DOM узел. И у него нет метода attr. 
И вообще, я не понимаю, зачем Вам обычные циклы, когда jQuery предоставляет более удобные и соответствующие концепции фреймворка средства для работы с коллекциями -  each, например. Не говоря уже о том, что многие другие методы корректно работают с несколькими элементами.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось B@rmaley.e><e, 14.02.2011 в 17:57.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.02.2011, 18:03
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.11.2009 
					
					
					
						Сообщений: 79
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Спасибо, понял =) 
Ну, в моем случае удобней было бы вызывать функцию напрямую, чтоб передать туда еще какие-то параметры. А то each вызывает функцию передавая ей только два параметра: index, value. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.02.2011, 04:50
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.12.2010 
					
					
					
						Сообщений: 114
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от балерун
			 
		
	 | 
 
	
		Спасибо, понял =) 
А то each вызывает функцию передавая ей только два параметра: index, value.
	 | 
 
	
 
 В конструкции each() доступен указатель this ссылающийся на текущий объект. Для того чтобы работать с ним как с jquery объектом достаточно использовать конструкцию $(this). RTFM!  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.02.2011, 08:10
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.11.2009 
					
					
					
						Сообщений: 79
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Я знаю. Мануал читал. Вот, что я делаю: 
есть несколько селектов (<select>), которые надо заполнить значениями. Для этого я создал функцию populate, которой в качестве первого аргумента передается массив селектов. Для этого достаточно и простого each. Так раньше и было. Потом понадобилось, чтоб в этих селектах устанавливалось значением по умолчанию. Но! Это надо не всегда. Поэтому вторым параметром в функцию populate я передаю true, когда надо устанавливать дефолтные значения и ничего не передаю, когда не надо. 
Вот соб-сно поэтому и стал использовать функцию вместо each. Если можно это будет сделать с помощью each, я только за. Опыта у меня мало, так что может быть делаю глупые ошибки. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.02.2011, 11:32
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.12.2010 
					
					
					
						Сообщений: 114
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от балерун
			 
		
	 | 
 
	
		Я знаю. Мануал читал. Вот, что я делаю: 
есть несколько селектов (<select>), которые надо заполнить значениями. Для этого я создал функцию populate, которой в качестве первого аргумента передается массив селектов. Для этого достаточно и простого each. Так раньше и было. Потом понадобилось, чтоб в этих селектах устанавливалось значением по умолчанию. Но! Это надо не всегда. Поэтому вторым параметром в функцию populate я передаю true, когда надо устанавливать дефолтные значения и ничего не передаю, когда не надо. 
Вот соб-сно поэтому и стал использовать функцию вместо each. Если можно это будет сделать с помощью each, я только за. Опыта у меня мало, так что может быть делаю глупые ошибки.
	 | 
 
	
 
 В функции внутри each почти так же доступны все переменные как и за ее пределами, т.е. одна из возможностей передать дополнительные параметры, будет выглядеть так:
 
var param = 'Я параметр!';
$('селектор').each(function(){alert(param);})
Конечно это будет рабочий но не самый правильный способ, так как нет инкапсуляции, но для ее реализации есть достаточно методов.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.02.2011, 11:51
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.11.2009 
					
					
					
						Сообщений: 79
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Ага, ясно. А инкапсуляцию можно делать так: 
var selects = $('селектор');
foo(selects, true);
function foo(selects, param)
{
    selects.each(function(){alert(param);})
}
Или я не так понял?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.02.2011, 12:42
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 10.12.2010 
					
					
					
						Сообщений: 114
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Все зависит от конкретной задачи. Например в данном случае param становится свойством объекта window или по другому становится глобальной переменной. Для небольших задач это не станет проблемой, но для чего-то более серьезного не рекомендуется хранить переменные в глобальной области видимости если они используются лишь в одном месте кода. Если говорить о jQuery то в нем есть метод  data позволяющий связать переменную с каким-нибудь элементом страницы. Но конечно же инкапсуляция важна тогда когда требуется писать код по всем канонам ООП, хотя иногда его применять - как палить из пушки по воробьям.
 
З.Ы  
Что-то меня понесло =)  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось kadabrik, 15.02.2011 в 12:57.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |