« Введение в библиотеку jquery. Часть 1 | Защита shareware приложений от взлома с помощью armadillo. Часть 1 » |
Введение в библиотеку jquery. Часть 2
JQuery: Быстрый старт в мире javascript. Часть 2
Сегодня мы продолжаем знакомство с jquery – библиотекой позволяющей автоматизировать и ускорить разработку javascript-решений. В прошлый раз мы разобрали одну из ключевых особенностей jquery – Selectors – механизм позволяющий адресовать элементы дерева DOM с помощью css/xpath подобной нотации. Сегодня мы рассмотрим специальные функции traversal, механизмы определения возможностей браузера, события.
Начнем мы с traversal. Что это такое и зачем оно нам нужно? Traversal – это общее название задачи поиска в дереве DOM нужной информации/узлов. Ранее мы научились записывать условие поиска узлов с помощью css/xpath нотаций, но это еще не все. Мы можем использовать комбинации специальных функций, которые будут уточнять сформированный результат поиска. Использовать эти функции удобно также и потому что мы можем записывать цепочку вызовов в сокращенной форме, например, так: первое_условие(параметры_1) . второе_условие(параметры_2) . третье_условие(параметры_3)
В таблице далее я привожу перечисление наиболее полезных функций Traversal. Эти функции достаточно гибки: почти каждая из них может принимать входной параметр, который служит для уточнения условия поиска. Если вы выстраиваете цепочку из вызовов функций, то следует помнить, что результаты – найденные узлы – которые вернула первая функция в цепочке, будут поданы на вход второй функции, и будут играть для нее роль базиса. Например, такая запись:
$('div').add('h1').not('#siteSub2')
Функция | Описание |
Add(условие) | Служит для добавления в набор искомых узлов еще одного набора задаваемого параметром - условием или явно перечисленных узлов. |
Children(условие) | Находим дочерние узлы с заданным условием отбора. |
Contains(шаблон) | Выполняет поиск среди узлов тех, которые содержат внутри себя некоторую строку текста заданную параметром функции. |
End() | Необычная функция. Ее назначение – вернуть отобранный набор узлов в предшествующее состояние (до последнего уточняющего запроса отбора). |
Filter(условие) Filter(функция) | Из заданного набора узлов выбрасываются все те узлы, которые не подходят под параметр-условие. Можно задать параметр не только строкой-фильтром, но и передать ссылку на некоторую функцию, которая будет принимать решение подходит или нет каждый из узлов. |
Next(условие) | Функция выполняет поиск для некоторого узла его “брата” (sibling-а), находящегося после узла, от которого идет поиск. |
Not(элемент) Not(условие) | Выполняет удаление из списка найденных узлов того, кто задан как входной параметр-элемент или же подходит под условие удаления. |
Parents(условие) | Для заданного узла выполняет поиск его родителя (на любом уровне). Также требуется, чтобы для этого узла (ancestor) выполнялось условие отбора. |
Parent(условие) | Функция похожа на предыдущую, но поиск узлов идет только среди непосредственных родителей базисных узлов. |
Prev(условие) | Функция выполняет поиск для некоторого узла узел sibling-а, находящегося до узла от которого идет поиск. |
Siblings(условие) | Выполняется поиск всех узлов братьев (sibling) для базисных. Также требуется, чтобы для них выполнялось некоторое условие отбора, заданное параметром функции. Здесь, а также в функиях prev. Next поиск идет только среди непосредственных узлов sibling-ов, но не их потомков. |
var elts = $('p').add('b').contains ('bold');
var elts = $('em').next('#bar');
var elts = $('li').filter ("[@id]");
var elts = $('*');
var elts = $('*').filter (
function (pos){
return this.className == 'apple' || this.id == 'item_1' || pos % 2 == 0;
}
);
$("input[@type='checkbox']").parent().is("form")
var elts = $('#item_1').parents ('p[@bar]');
var elts = $('#item_1').parents ('p[@bar$=test]');
Аналогично предыдущему примеру, но теперь тег “p” должен содержать атрибут “bar” значение, которого заканчивается на слово “test”.
Надеюсь, вы уже заметили, что строки-условия отбора аналогичны тем конструкциям, про которые я рассказывал в прошлый раз, когда мы искали элементы DOM с помощью смешанной нотации css/xpath.
Теперь, когда мы разобрались с отбором узлов, остается только научиться их обрабатывать. Самый простой способ - это воспользоваться классическим циклом, например, так:
var elts = $('span').add('h3').add ('#');
for (var i=0; i< elts.length; i++)
alert (elts [i].id + " -- " + elts[i].innerHTML);
$.each( [0,1,2,3,4,5,6,7,8,9], function(i, n){
var p = document.createElement('p');
p.innerHTML = 'p # ' + i;
$('body')[0].appendChild (p);
});
Вот схожий пример, когда итерация будет выполнена не по обычному массиву, а по ассоциативному:
$.each( { name: "John", lang: "JS" }, function(i, n){
alert( "Name: " + i + ", Value: " + n );
});
$('li').addClass(“bar”), но все же это ведь учебный пример.
$.each( $('li'), function(i, n){
n.className = 'bar';
}
);
<!-- предполагая, что у нас есть документ html, фрагмент которого выглядит так: -->
<a id="zbang" />
/* теперь пример кода javascript. Здесь выполняется привязка набора функций,
также массива свойств к элементу “a” с заданным id=”zbang” */
// создаем массив свойств-расширений
var extension = { foo: function() { alert(this.anarray); },
anarray: ['one', 'two', 'three', 'start your engines']};
// выполняем апгред тега “a”
$.extend($("#zbang").get(0), extension);
// и вот пример вызова функции foo от имени тега “a”, и, внимание,
функция может оперировать массивом свойств “anarray”.
$("#zbang").get(0).foo();
var elts = $.grep( $('li'), function(n,i){
return n.id != "item_2";
//функция должна вернуть true для тех элементов,
//которые надо оставить
}
);
// результатом работы будут те теги li, значение идентификатора
// которых не равно “item_2”
var elts = $.grep( $('li'), function(n,i){
return n.id != "item_2";
},
true
);
// а здесь третий параметр равный true говорит,
// что наоборот нужно оставить только те элементы идентификатор которых
// равен “item_2”
var elts = $.map( [1,2,-3] , function(n,i){
return -n;
}
);
$.merge( [0,1,2], [2,3,4] ) //и результатом работы будет [0,1,2,3,4]
$.trim(" hello, how are you? ");// и результатом работы будет "hello, how are you?"
<strong>1. $.browser.msie</strong> – признак того, что используемый браузер – internet explorer. <strong>2. $.browser.safari</strong> – используется safari – самый популярный под mac браузер. <strong>3. $.browser.opera</strong> – используется opera. <strong>4. $.browser.mozilla</strong> – и, наконец, браузеры mozilla, firefox, seamonkey или что-то еще построенное на базе движка gecko.
События
Теперь мы разберем обработку событий и научимся “привязывать” специальные функции обработчики, которые вызываются всякий раз, когда пользователь взаимодействует с некоторым элементом веб-страницы. Для того чтобы, например, для каждого элемента списка “li” привязать специальный обработчик события “click” который бы выделял активный элемент, скажем, красным цветом используйте следующий код:
$("li").bind("click", function(){
this.style.color = 'red';
});// ссылка на элемент, для которого произошло данное событие доступен через переменную this
Функция “bind” является родовой и может управлять всеми событиями, однако существует ряд специализированных функций (работающих не со всеми событиями, а только с одним определенным событием), но предоставляющих также возможность активации событий для целого множества отобранных узлов документа. В коде ниже я создаю обработчик события click для всех элементов списка, также создаю один обработчик события задан в старом стиле
<em onclick="функция()">
// это фрагмент html
<em onclick="this.style.color = 'green';">EM block</em>
// а это фрагмент javascript
$("li").click ( function(){
this.style.color = 'red';
});// и делаю вызов
$("li").add("em").click();
1. “blur” – служит для привязки/активации события потери фокуса для некоторого элемента. Это очень часто используемое событие при построении форм, например, по событию blur вы можете проверять, что введенные пользователем данные в текстовые поля корректны и сообщить ему, если это не так.
2. “focus” – событие вызываемое при получении некоторым элементом фокуса ввода. Например, если вы делает текстовое поле в форме и значение поля играет роль подсказки, то при получении фокуса неплохо было бы очистить поле и подготовить его для пользовательского ввода.
3. “change” – вызывается при изменении содержимого элемента. Также очень полезное событие при построении форм.
4. “dblclick” – как вы уже догадались обработка события двойного клика.
5. “hover” – этой функции следует передать в качестве параметра две функции обработчика. Одна из которых вызывается в случае если мышь наведена на целевой элемент. Вторая же вызывается, когда мышь с целевого элемента уходит. Эта функция не является простой калькой с привычных уже вам onmouseover и onmouseout т.к. более “интеллектуальна”, например, событие onmouseout часто генерируется в случаях, когда мышь уходит с самого элемента на другой элемент, но (и это важно) находящийся внутри целевого элемента. Например, если вы делаете выпадающее меню сайта, то поставив обработчик события onmouseover для пункта меню высшего уровня вам придется быть очень острожным чтобы не получить сообщение onmouseout когда пользователь водит мышь по подпунктам меню. Хотя это и не страшная проблема, но все же довольно неприятно. Например, попробуйте следующий код:
<b id="log">here is log</b>
<br /> выше размещен специальный элемент играющий роль журнала событий
<div style="border: 2px solid black; background-color: green; padding: 20px;" id="block"
onmouseover="makeOver(this)" onmouseout="makeOut(this)">
<div style="border: 2px solid black; background-color: red; padding: 20px;"
id="block2">
Hello User <br />
Bye, Bye
</div>
</div>
var log = 0;// переменная счетчик событий
function makeOver (t){
$('#log').html ('over: '+ (log++));
}
function makeOut (t){
$('#log').html ('out' + (log++)) ;
}
$('#block').hover (makeOver, makeOut);
элемента не будет происходить – что и требовалось получить.
6. “keydown” – событие срабатывает, когда происходит нажатие на какую-либо клавишу для текущего элемента и также есть парные методы “keypress”, “keyup”.
7. “load” - функция срабатывает всякий раз когда загрузка целевого элемента была успешно завершена. Традиционно это применяется для обработки загрузки изображений. Например, пока некоторая достаточно крупная картинка грузится, вы желаете на ее месте выводить специальный логотип “мол, подождите, идет загрузка” и только с помощью события “load” вы можете отследить момент, когда все изображение было полностью загружено и вам следует спрятать тот самый символ “ожидания”.
8. “submit”. Как же я мог упустить одну из важнейший функций управляющих событием “submit”. Всякий раз, когда с вашей страницы отправляется форма, вам следует выполнять проверку данных на корректность ввода. Если вы этого не сделаете, то пользователь будет очень разочарован, получив после длительного ожидания загрузки новой страницы сообщение об ошибке.
Оставшиеся события я не привожу, их не так уж и много и они частично дублируются приведенными выше событиями. Гораздо интереснее рассмотреть еще одну особую универсальную функцию привязки обработчика событий к элементу. Функция “one” очень похожа на “bind” (даже входные параметры получает один к одному), но ее отличие в том, что целевое событие срабатывает только один раз, после чего jquery удалит отработавшую функцию из списка подписчиков события. Чем-то похожа на “one” и функция “toggle”. Ее назначение – чередовать две функции обработчика событий вызываемых по очереди при клике на некоторых элементах страницы.
Функцию “ready” мы уже рассматривали в прошлый раз, но напомню что ее назначение – отследить момент, когда дерево DOM будет полностью загружено и готово для использования. Вспомните сами, в чем ее ключевое отличие от привычного нам “window.onload”.
$(document).ready(function(){ что-то делаем });
Внутри функции обработчика события вы можете управлять тем будет ли выполнено действие элемента управления по-умолчанию (для отмены используйте метод preventDefault), также вы можете отменить “bubbling” с помощью вызова stopPropagation. Эти функции следует вызывать от объекта event передаваемого как параметр функции обработчика события – словом, все как в классическом javascript.
В этой статье я ранее планировал рассказать и о том, как реализована поддержка ajax в библиотеке jquery. Но решил, что такая интересная тема требует отдельного материала и рассмотрения механизмов асинхронных вызовов не только со стороны клиента (javascript) но и на стороне сервера. Я расскажу об используемых мною в работе framework-ах для интеграции javascript-ajax-php.
« Введение в библиотеку jquery. Часть 1 | Защита shareware приложений от взлома с помощью armadillo. Часть 1 » |