« Узнай больше об плагине rss для mediawiki | Введение в библиотеку jquery. Часть 2 » |
Введение в библиотеку jquery. Часть 1
JQuery: Быстрый старт в мире javascript. Часть 1
С каждым годом все большее внимание уделяется вопросу разработки веб-приложений с достаточно сложным интерфейсом, асинхронно загружающих нужные для работы данные с сервера. Одновременно с этим ряд, как достаточно крупных компаний, так и open source сообществ разрабатывают и предлагают продукты для автоматизации рутинных и повторяющихся действий в ходе разработки подобных приложений. Например, библиотеки элементов для проектирования пользовательского интерфейса (деревья, наборы закладок, таблицы). Плохо, что достаточно много таких библиотек и проектов носят экспериментальный характер и не претендуют на роль каких-либо де-факто стандартов, вынуждая разработчиков изобретать очередной велосипед. Некоторые проекты умирают из-за потери интереса и необходимости выдерживать достаточно жесткий timeline; некоторые проекты сливаются в единое целое. Достаточно примеров, когда разработчики излишне жаждут денег, обрекая проект на скудную базу подписчиков и, в конце концов, загнивание (ох, Laszlo, Laszlo, что же с тобой творится). Но все же философский закон перехода количества в качество и наоборот, работает и способствует появлению некоторых достаточно устойчивых framework-ов для javascript|html|css. Сегодня я расскажу о библиотеке JQuery, ее домашний сайт http://jquery.com/. Ее основное назначение - упрощение работы с документами DOM из javascript.
Мне трудно выделить и сказать что jQuery “самая-самая”. По крайней мере, я не встречался с проблемами совместного использования jQuery и других, более специализированных библиотек. Также в плюсы можно записать и небольшой размер библиотеки - порядка 15 кб (в сжатом виде, естественно), и совместимость с основными браузерами. Периодически в Интернет проводятся всяческие голосования на тему “кто на свете всех милее”. Например, такое исследование я нашел на сайте http://www.habrahabr.ru
Процент выбора | Предпочитаемый framework |
1.7% | Dojo Toolkit |
4.11% | YUI |
30.64% | Prototype |
27.52% | jQuery |
4.4% | ExtJS |
1.28% | MochiKit |
8.65% | Mootools |
21.7% | Иное |
Итак, для того чтобы обратиться и изменить внешний вид” чего-то” - вам необходимо найти это “чего-то” среди всех остальных узлов дерева DOM. В ходе этого поиска часто возникают трудности связанные с тем, что нет механизмов, позволяющих декларативно записать/задать набор узлов на которые идет воздействие, а мы вынуждены применять морально устаревший императивный подход с кучей циклов, условий и т.д. Давайте для примера рассмотрим задачу создания некоторого выпадающего меню. Предположим, что собственно ряд пунктов первого уровня реализован в виде таблицы из одной строки. Каждая ячейка, которой содержит следующий набор вложенных тегов:
<td>
<div class=”menu_item”>
<span class=”simply”>
<a href=”…”>It’s First Menu Item</a>
</span>
</div>
</td>
<div class=”cde”>
<p class=”abc”>
<a href=”…”>…</a>
</p>
</div>
… <div class=”menu_item” onmouseover=”makeShowMenu();” onmouseout=”makeHideMenu()”> …
1) var tds = document.getElementsByTagName (‘td’);
2) for (var I = 0; I < tds.length; i++){
3) var td = tds [i];
4) var divs = td.getElementsByTagName (‘div’);
5) for (var j =0; j < divs.length; j++)
6) if (divs[j].className = ‘menu_item’ ){
7) var spans = divs[i].getElementsByTagName (‘span’);
8) for (var k = 0; k < spans.length; k++)
9) spans [k].addListener (….);
10) } }
#tab_menus td div.menu_item span a {color : red};
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>DOM bagged</title>
</head>
<body>
<table>
<tr>
<td>User FIO</td>
<td>User Age:</td>
</tr>
</table>
</body>
</html>
Первое что сразу бросается в глаза, так это различие в регистре имен тегов. Далее в html-варианте (слева) элемент таблица содержит дочерний элемент TBODY, и уже в него помещаются строки и столбцы. Для xhtml (вариант справа) такого “обертывания” нет. Естественно, что это не единственный пример, вы легко можете найти в Интернете особенности формирования DOM в случае различных форматов. И, следовательно, при создании алгоритма поиска некоторых элементов страницы нужно учитывать такие “назойливые” подробности.
Так вот, перебор в строках 1-8 с помощью jquery будет заменен на, всего лишь, одну строку кода. Также вы можете забыть об особенностях используемого браузера и не писать больше такой ужасный код:
if (element.addEventListener) {
//присоединяем в стиле firefox | opera
}
else
if (element.attachEvent) {
//Присоединяем обработчик события в стиле internet explorer
}
else{
//element.имя_события = …;
}
window.onload = func_1;
window.onload = func_2;
window.attachEvent("onload", func_1);
window.attachEvent("onload", func_2);
В jquery используется другой подход. Мы не ждем, когда загрузится абсолютно вся страница, а только момента, когда будет сформировано и доступно для использования дерево DOM. Прежде всего, необходимо подключить библиотеку к вашему файлу html.
<script type="text/javascript" src="то_место_где_находится_библиотека_jquery.js"></script>
Затем мы выполняем привязку функции к самому документу:
$(document).ready(function(){
// какие-то действия
});
При вызове функции “$” вы можете не только передать первым параметром строку запроса, но и указать ссылку на узел, относительно которого будет выполнен поиск. В противном случае поиск будет начат с самой вершины дерева dom – html. Более того, в jquery предусмотрена функция расширения его возможностей с помощью плагинов. Так что если вы обратитесь к сайту http://www.softwareunity.com/sandbox/JQueryMoreSelectors/ то сможете найти там еще несколько интересных видов синтаксиса запроса.
Полное описание возможных форматов записи “пути” довольно велико и я приведу лишь некоторые возможные варианты. Если же вам интересны иные виды селекторов, то прошу http://docs.jquery.com/Category:Selectors, откуда я и взял часть нижеследующих примеров.
Селектор | Примечание | |
"p[a]" | Найти в документе все теги “p”, внутри которых содержится тег “а” | |
“ul/li” | Все элементы “li” неупорядоченных списков “ul” | |
“p.foo[a]” | Все теги “p” с классом “foo” и вложенным тегом “a” | |
“input[@name=bar]" | Все теги “input” с атрибутом “name” значение которого равно “bar” | |
"input[@type=radio][@checked]" | Найти все теги “input”, которые имеют значение атрибута type равным “radio”, а также установленное значение атрибута “checked” | |
“p,span,td” | Все элементы тегов “p” или “span” или “td” | |
“p#secret” | Элемент параграфа “p”, с идентификатором “id” равным слову “secret” | |
“p span” | Тег “span” являющийся потомком тега “p” (не обязательно прямым потомком). Если же это вам необходимо, то рекомендую применять “p > span” или “p/span” | |
p[@foo^=bar] | Тег “p”, содержащий атрибут “foo” текстовое значение которого начинается на слово “bar” | |
P[@foo$=bar] | Тег “p”, атрибут “foo” которого содержит значение заканчивающееся на “bar” | |
P[@foo*=bar] | Тег “p”, атрибут которого “foo” содержит в произвольном месте подстроку “bar” | |
p//span | Тег “span” являющийся потомком (не обязательно прямым) к тегу “p” | |
p/../span | Тег “span” являющийся “внуком” тега “p” |
Кроме того возможна запись, которая указывает, какой именно, узел среди множества возможных следует выбрать на основании его порядкового номера. Например, если тег p содержит 10 тегов span, то вы можете использовать следующие условия отбора:
1. <strong>p/span:eq{4}</strong> – четвертый но номеру элемент “span”; 2. <strong>p/span:lt{5}</strong> – элементы “span”, номер которых менее чем 5; 3. <strong>p/span:gt{2}</strong> – элементы “span”, номер которых превосходит 2; 4. <strong>p/span:first</strong> – первый элемент “span” среди своих “siblings”; 5. <strong>p/span:last</strong> – последний элемент “span” среди своих “siblings”.После того как мы разобрались, как может выглядеть “путь” я перечислю возможные значения “операции”. Начнем мы с самого простого. Все о чем я говорю, может быть найдено на следующих страницах: http://docs.jquery.com/DOM/Attributes, http://docs.jquery.com/CSS.
Для изменения внешнего вида найденных элементов можно использовать метод css. Который, если его вызвать с единственным параметром – именем некоторого css-свойства, возвращает значение этого свойства, или же если его вызвать передав в качестве параметра некоторый ассоциативный массив с перечислением пар “ключ:значение”, то в этом случае ко всем найденным узлам будут применены новые стили.
<div id="content" style="font-size: 12px;">
…. Много-много кода …
</div>
<script>
alert ($("div#bodyContent").css ('font-size'));
$("div").css(
{ color: "red", background: "blue" }
);
</script>
Также возможно определить текущее значение размеров элемента или же установить новое значение высоты или широты блока:
alert ($("div#bodyContent").height())
$("div#bodyContent").height ('200px');
alert ($("div#bodyContent").width())
$("div#bodyContent").width ('200px');
alert ($("img").attr("src"));
$("img").attr( { src: "test.jpg", alt: "Test Image" });
<p class=”foo bar tar var”>
some text
</p>
$("div").addClass ('bar');
$("div").removeClass ('bar');
$("div").toggleClass ('foo');
alert ( $("h1#firstHeading").html() );
$("h1#firstHeading").html('<p>hello </p>');
« Узнай больше об плагине rss для mediawiki | Введение в библиотеку jquery. Часть 2 » |