Вы здесь: Главная >> Jquery-учебник >> Получаем в jQuery доступ к элементу по индексу
Получаем в jQuery доступ к элементу по индексу
Как получить в jQuery доступ к элементу по индексу
Итак, мы уже разобрались с тем, как получать коллекцию элементов с помощью функции $ () и механизма селекторов.
Большинство же методов библиотеки jQuery позволяет изменить какое-либо свойство сразу всех элементов коллекции. Например, выведем во всех тегах <р> текст "Добрый день!"
$ ("р") .text("Добрый день!") ;
Это, конечно, удобно. Но иногда необходимо получить доступ к какому-либо отдельному элементу коллекции. Прежде чем обратиться к конкретному элементу, следует с помощью свойства length узнать количество элементов в коллекции,
alert($("р").length);
Кроме того, можно воспользоваться методом size ().
alert($("р") .size ());
Теперь, когда мы знаем количество элементов, можно приступить к перебору всех элементов коллекции.
Получить доступ к элементу можно, указав его индекс в квадратных скобках. Нумерация начинается с нуля. В качестве примера выведем текст "Добрый день!" только во втором теге р.
var elems = $ ("р") ;
if (elems.size() >= 2) {
elems[1].innerHTML = "Добрый день!";
}
else {
alert("Элемента для вывода нет!");
}
Обратите внимание на тот факт, что доступ по индексу возвращает ссылку на DOM-элемент. Поэтому изменить содержимое можно с помощью свойства innerHTML объекта document. Применить метод jQuery text () можно только после нахождения элемента.
$(elems[1]).text("Добрый день!");
Вместо квадратных скобок можно использовать метод get (). Метод имеет следующий формат.
get ( [<Индекс элемента>] )
Если индекс элемента не указан, то возвращается массив DOM-элементов,
var elems = $("р").get();
alert("Количество DOM-элементов " + elems.length);
Указание параметра позволяет получить доступ к конкретному элементу. Нумерация элементов начинается с 0. В качестве примера во всех тегах р выведем индекс текущего абзаца.
var elems = $("р");
for (var i=0, count=elems.length; i<count; i++) { elems.get(i).innerHTML = i;
}
Все рассмотренные способы позволяли получить доступ к конкретному DOM-элементу. Если необходимо получить доступ к элементу коллекции jQuery, то следует использовать метод eq (). Нумерация элементов начинается с 0. Переделаем наш предыдущий пример и используем метод jQuery html () вместо свойства innerHTML объекта document,
var elems = $("р");
for (var i=0, count=elems.length; i<count; i++) { elems.eq(i).html(i);
}
Метод slice () позволяет получить срез коллекции. Возвращает новую коллекцию элементов. Имеет следующий формат.
slice (<Начальная позиция>[, <Конечная позиция>])
Следует учитывать, что нумерация позиций начинается с 0, а конечная позиция не попадает в диапазон возвращаемых значений. Выделим первую ссылку в коллекции.
$("а") .slice (0,1) .css("color", "red");
А теперь выделим только вторую и третью ссылки.
$("а").slice(1,3).css("color", "red");
Если второй параметр не указан, то будут возвращены элементы от начальной позиции до конца коллекции. Выделим все ссылки, начиная с третьей.
$("а") .slice (2) .css("color", "red") ;
В случае указания отрицательного значения позиции будут отсчитываться с конца коллекции. Выделим две последние ссылки.
$("а") .slice (-2) .css("color", "red");
Пронумеруем все ссылки в документе с помощью метода slice ().
var elem = $ ("а") ;
for (var i=0, count=elem.size(); i<count; i++) { elem.slice(i,i+1).html("Ссылка " + i);
}
С помощью метода index () можно получить индекс элемента на странице. Если элемент не найден, то возвращается значение -1. Нумерация элементов начинается с нуля. Метод имеет следующий формат,
index (<DOM-элемент>)
При щелчке на абзаце выведем его индекс.
$("р").click(function() {
alert("Индекс: " + $("р").index(this));
});
<р>Абзац 1</р> <р>Абзац 2</р> <р>Абзац 3</р> <р>Абзац 4</р>
Метод each()
Метод each () позволяет перебрать все элементы коллекции без использования циклов. Имеет следующий синтаксис,
each(Функция обратного вызова)
В параметре Функция обратного вызова указывается ссылка на функцию следующего формата.
function <Название функции> ( [<Индекс> [, <Элемент DOM>]]) { ...}
Все параметры являются необязательными. Если в параметре Индекс указать переменную, то на каждой итерации в нее будет передаваться текущий индекс элемента в коллекции. Нумерация начинается с 0. Выведем индекс элемента во всех тегах div.
$("div").each(function(i) {
this.innerHTML = "DIV с индексом " + i;
});
Текущий элемент доступен внутри функции через указатель this. Обратите внимание, указатель this ссылается на текущий элемент объектной модели документа, а не на элемент коллекции jQuery. По этой причине применять методы jQuery для этого элемента нельзя. В последнем примере для вывода текста внутри тегов div мы использовали свойство innerHTML объекта document, а не метод из библиотеки jQuery. Если необходимо использовать методы из библиотеки jQuery, то предварительно следует найти элемент с помощью функции $ (). В качестве примера заменим свойство innerHTML на jQuery-метод html () .
$("div").each(function(i) {
$(this).html("DIV с индексом " + i);
});
Если в параметре Элемент DOM указать переменную, то на каждой итерации в нее будет передаваться ссылка на текущий элемент DOM. Эту переменную можно использовать вместо указателя this.
$("div").each(function(i, d) {
$(d).html("DIV с индексом " + i);
});
Если внутри функции вернуть значение false, то выполнение метода each () будет остановлено. При индексе, равном двум, прервем выполнение метода.
$("div").each(function(i) {
$(this).html("DIV с индексом " + i);
if (i == 2) { return false;
}
});
Во всех этих примерах мы использовали анонимную функцию. Если необходимо вызвать обычную функцию, то ее имя указывается в качестве параметра метода each () без скобок.
function myFunc(i, d) {
$(d) .html("DIV с индексом " + i) ; if (i == 2) { return false;
}
}
$(document).ready(function() { $("div").each(myFunc);
});
В качестве примера использования метода each () получим URL-адреса всех ссылок в документе (листинг 3.1).
Листинг 3.1.
Получение URL-адресов всех ссылок
<html>
<head>
<title>Получение URL-адресов всех ссылок</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
<script src="jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$("a").each(function() {
$("#div1").append($(this).attr("href") + "
");
});
});
</script>
</head>
<body>
<a href="link1.html">Ссылка 1</a><br>
<a href="link2.html">Ссылка 2</a><br>
<a href="link3.html">Ссылка 3</a><br>
Все URL-адреса:<br>
<div id="div1"></div>
</body>
</html>
После загрузки структуры документа находим коллекцию всех тегов а ($ ("а")). Далее с помощью метода each () перебираем все элементы. В качестве параметра указываем анонимную функцию. На каждой итерации внутри анонимной функции доступен указатель (this) на текущий элемент коллекции. Находим текущий элемент ($ (this)) и с помощью метода attr () получаем значение параметра href (attr ("href")). Для вывода результата находим элемент с идентификатором divl ($ ("#divl")) и с помощью метода append () добавляем результат в конец к имеющемуся значению элемента.
Сергей Владимирцев
20.02.2011