Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

jquery1

.pdf
Скачиваний:
8
Добавлен:
08.02.2015
Размер:
750.86 Кб
Скачать

1.3. Основы jQuery

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

45

 

 

 

 

var trimmed = $.trim(someString);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Если префикс$. кажется

вам странным , запомните

,$что– это обыч-

 

 

 

ный идентификатор

 

JavaScript,

такой

же , каклюбойи

другой . Вызов

 

 

 

той же функции использованием

идентификатораjQuery выглядит

бо-

 

 

 

лее знакомым

:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

var trimmed = jQuery.trim(someString);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Становится

 

 

совершенно

очевидно

, что функцияtrim() принадлежит

 

 

 

пространству

 

именjQuery или его псевдониму$.

 

 

 

 

 

 

 

 

 

 

 

 

Примечание

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вспомогательнымифункц ями, но со-

 

 

 

 

 

В документации

эти элементы

называются

 

 

 

 

 

вершенно

очевидно

,

чтодействительности

они являютсяметодами функции

 

 

 

 

 

$() (да , вJavaScript функции могут иметь собственные

методы ). Не углубляясь

 

 

в технические

 

детали , мы также

будем называть

 

эти вспомогательнымиметоды

 

 

 

 

 

функциями, чтобы терминология

соответствовала

 

электронной

документации .

 

 

 

 

 

 

 

 

 

 

 

 

Одну такую

вспомогательную

функцию

 

, позволяющую

 

расширять

 

 

jQuery,

мы рассмотрим разделев

1.3.5, адругую , позволяющую

jQuery

 

 

мирно

сосуществовать другимис

клиентскими

 

библиотеками– в раз, -

 

 

 

деле 1.3.6.

Но для начала рассмотрим

еще один важный

аспектфунк

 

ции $().

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.3.3. Обработчик

готовности

документа

 

 

 

 

 

 

 

 

 

Методика

ненавязчивого

JavaScript

позволяет

отделить

реализацию

 

поведения

элементов

от разметки

документа , поэтому

мы будем-

ма

 

 

нипулировать

 

 

элементами

страницы

за пределами

разметки

,-создаю

 

щей эти элементы . Для этого нам нужен механизм

, позволяющий-

до

 

ждаться окончания

 

загрузки

элементов

 

DOM страницы

, чтобы

затем

 

выполнить необходимые операциипримере. В

сгруппой

радиокнопок

 

 

 

мы должны

дождаться

момента , когда

будет загружена

вся страница ,

 

и только потом

выполнить

необходимые

 

операции .

 

 

 

 

 

 

 

 

Традиционно

 

для этих целей

используется

 

обработчикonload объекта

 

 

 

window, который выполняет инструкции

после того , как страница

будет

 

загружена

целиком . Обычно

он вызывается

 

так :

 

 

 

 

 

 

 

 

 

window.onload = function() {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//

выполнитьтребуемые операции

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В результате

 

программный

код будет

вызван толькопосле того , как до-

 

 

 

кумент

будет

полностью

загруженсожалению. К

, броузер

задерживает

 

 

выполнение

обработчикаonload не только

до момента создания

полного

 

 

дерева

DOM,

 

но также ждет , пока будут

загружены все изображения

 

и другие внешние

ресурсы

страница

отобразится

окнев

броузера .

 

 

 

В результате

 

посетитель

может заметить

задержку

между

теммомен

46

 

 

 

 

 

 

 

 

 

 

 

 

Глава 1. Введение jQueryв

 

 

 

том , когда он впервые

 

увидит

страницутем, и, когда

будет выполнен

 

 

сценарий onload.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Хуже того , если изображение

или другой

ресурс

загружается - достаточ

но долго , посетитель

вынужден

ждать

окончания

его загрузки , прежде

чем дополнительные

особенности

поведения

элементов

станутдоступ

ными . Во многих

реальных

применениях

это могло

бы обречь - идею не

навязчивого

JavaScript

на неудачу .

 

 

 

 

 

 

 

 

 

 

 

Намного лучший подход заключаетсятом ,в чтобы задерживать

запуск

 

сценариев

, обеспечивающих

 

дополнительные

особенности поведения ,

только до момента

окончания

загрузки

структуры

документа , когда

HTMLкод страницы

будет

преобразован

броузеромдерево DOM. До-

 

 

биться этого независимым

 

от типа броузера

способом

достаточно-

слож

но , но библиотека

jQuery

предоставляет

 

простой

способ

запуска-

про

граммного

кода

сразу

 

после загрузки

дерева

DOM ( но до загрузки-

внеш

них изображений

). Формальный

синтаксис

определения

такого

кода ( и

примера сокрытия

элементов

):

 

 

 

 

 

 

 

 

 

 

 

 

jQuery(document).ready(function() {

 

 

 

 

 

 

 

 

 

 

 

 

 

$(“div.notLongForThisWorld”).hide();

 

 

 

 

 

 

 

 

 

 

 

 

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сначала производится

 

обертывание

экземпляраdocument документа

 

 

в функцию jQuery(), а затем

применяется

методready(), которому

пере-

 

 

дается функция

для исполнения

после

того , как документ

станет-

до

ступным

для манипуляций .

 

 

 

 

 

 

 

 

 

 

 

 

 

Этот синтаксис

мы назвалиформальным потому,

что гораздо

чаще - ис

 

пользуется

сокращенная

форма

его записи :

 

 

 

 

 

 

 

jQuery(function() {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

$(“div.notLongForThisWorld”).hide();

 

 

 

 

 

 

 

 

 

 

 

 

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вызывая

функциюjQuery() или $(), мы тем самым предписываем

броу-

 

зеру дождаться , пока дерево

DOM ( и только

дерево DOM) будетполно

стью загружено , прежде чем выполнить

этот код . Более

тогодном, в

 

 

и том же HTMLдокументе

 

мы можем применять

этот прием многократ-

но , и броузер

выполнитвсе указанные

функции порядкев

следования

 

 

объявлений

. Напротив

, методика на базе обработчикаonload

объек-

 

 

та window позволяет

указать

 

единственную

функцию . Это ограничение

чревато трудноуловимыми

 

ошибками , если какой -либо подключенный

сторонний

сценарий использует

механизмonload для собственных

нужд

 

(что никак нельзя признать

хорошей

практикой ).

 

 

 

 

 

 

 

Мы познакомились со вторым назначением функции$(). Давайте посмотрим , что еще она может нам предложить .

1.3. Основы jQuery

47

1.3.4. Создание

элементовDOM

 

 

 

 

 

 

 

 

 

 

 

 

Совершенно

очевидно

, что авторы

jQuery

избежали

введения -дополни

тельных

глобальных

идентификаторовпространство

имен JavaScript,

сделав функцию$() ( которая является

обычным

псевдонимом

функции

jQuery()) достаточно универсальной

для выполнения

 

множества-

опера

ций . Итак , уэтой функции

есть еще одна особенность

, которую

мы

должны

исследовать .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Передавая функции$() строку скодом

разметки HTMLэлементовде

рева DOM, мы можем создавать

эти элементы

на лету . Например

, так

можно

создать

новый элемент -абзац :

 

 

 

 

 

 

 

 

 

 

$(“<p>Hi there!</p>”)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Но создание

ни счем не связанных

элементов

DOM ( или иерархии-

 

эле

ментов ) само по себе не приносит

никакой

пользы . Обычно

созданные

таким

образом

иерархии элементов

затем

задействуются

другими-

функ

циями

jQuery,

манипулирующими

 

деревом

DOM.

 

 

 

 

 

 

Давайте

исследуем качестве

примера

листинг

1.1.

 

 

 

 

 

 

Листинг 1.1. Создание элементов HTML на лету

 

 

 

 

 

 

 

 

 

<html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<head>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<title>Follow me!</title>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<link rel=”stylesheet” type=”text/css”

 

 

 

 

 

 

 

 

 

 

 

 

 

href=”../styles/core.css”/>

 

 

 

 

 

 

 

 

 

 

 

 

 

<script type=”text/javascript” src=”../scripts/jquery-1.4.js”>

 

 

 

 

 

</script>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<script type=”text/javascript”>

 

 

 

q Обработчик готовности документа ,

 

$(function(){

 

 

 

 

 

 

создающий

элементы HTML

 

 

 

 

$(“<p>Hi there!</p>”).insertAfter(“#followMe”);

 

 

 

 

 

 

 

 

 

 

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

</script>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

</head>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<body>

 

 

 

 

 

 

 

w Существующий

элемент ,

 

 

 

<p id=”followMe”>Follow me!</p>

 

 

 

 

за которым

будет

вставлен

новый

 

 

</body>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В этом примере

телев документа

определяется

 

существующий

HTML-

элемент

абзаца

именемс followMe w. В элементе <script>, который

на-

 

 

ходится

вразделе <head>, определяется

сценарий

обработчика

события

готовности документаq. Этот сценарий добавляет

вновь

создаваемый

абзац

вдерево

DOM сразу вслед

за существующим

 

элементом

:

 

 

$(“<p>Hi there!</p>”).insertAfter(“#followMe”);

Результат показан на рис1.3..

48

Глава 1. Введение jQueryв

Рис . 1.3.Для создания и добавления элемента в документ обычно требуется несколько строк кода ,однако jQuery позволяет сделать это с помощью единственной инструкции

Полный комплект

функций

манипулирования

деревом

DOM мырассмот

рим вглаве 3, где вы увидите , что jQuery

предоставляет

много функций

манипулирования

деревом

DOM, позволяющих

придать документу

желаемую структуру .

 

 

 

 

 

Теперь , когда вы познакомилисьбазовымс

синтаксисом

jQuery, давай-

те взглянем на одну из самых мощных

особенностей

этой библиотеки .

1.3.5. Расширение jQuery

Функция -оберткаjQuery обеспечивает

доступ

ко многим полезным -функ

циям , которые

мы постоянно

будем

использоватьстраницахв

. Но ни

 

одна библиотека

не всостоянии

удовлетворить все потребности

безис

 

ключения . Можно даже утверждать

, что ни одна библиотека

не должна

стремиться

удовлетворить все возможные

потребности , иначе

появится

огромная неуклюжая масса программного

кода , содержащая

редко-

ис

пользуемые

функции , которые

только мешают работе !

 

 

 

Понимая это , авторы библиотеки jQuery прилагают усилия длявыяв ления функциональных особенностей , востребованных большинством авторов страниц , чтобы включатьбиблиотекув только такие особенности . Поскольку каждогоу автора страниц могут быть собственные

неповторимые потребности , библиотека jQuery была создана легкорас ширяемой .

Для удовлетворения

своих потребностей мы могли

бы писать

-собствен

ные функции , никак

не пересекающиесябиблиотекойс

jQuery. Но -, по

чувствовав вкус jQuery, вы поймете , насколько утомительны

прежние

подходы . Кроме того , расширяя

библиотеку

, мы можем использовать е

мощные особенности

частности, в

, возможность

выбора элементов .

Рассмотрим конкретный примербиблиотеке: в jQuery отсутствует -пред определенная функция , которая деактивировала бы элементы. форм Если во всех приложениях используются формы , пригодилась - бы воз можность применять примеру, к , такой синтаксис :

1.3. Основы jQuery

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

49

 

 

 

 

$(“form#myForm input.special”).disable();

 

 

 

 

 

 

 

 

 

 

 

 

 

К счастью , архитектура

jQuery

позволяет

легко

расширять

имеющийся

набор функций

, расширяя

 

обертку , возвращаемую

вызовом$(). Рассмот-

 

 

 

рим базовую

идиому , позволяющую

этого достигнуть

:

 

 

 

 

 

 

$.fn.disable = function() {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return this.each(function() {

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

if (this.disabled == null) this.disabled = true;

 

 

 

 

 

 

 

 

 

 

 

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Здесь много

новых синтаксических

конструкций

, но не стоит -из -за это

го сильно

волноваться

. Все встанет

на свои места , когда вы прочитаете

следующие

несколько

главэтой. С

базовой

идиомой

вы столкнетесь

еще

 

много раз .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Во -первых , конструкция$.fn.disable означает , что мы расширяем

оберт-

 

ку $ методом

сименем disable. Внутри этой функции

коллекцию

оберну-

 

тых элементов

DOM,

над которыми

будет

выполняться

операция-

, пред

ставляет

идентификаторthis.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Во -вторых , методeach() этой

 

обертки

вызывается

для

обхода

всех-

эле

ментов коллекции . Подробнее

этотподобныеи

ему методы

рассматрива-

 

 

ются вглаве 3. Внутри функции , передаваемой

методуeach(), ключевое

 

 

 

слово this является

ссылкой

на

конкретный

элемент

текущейDOM в

 

 

 

итерации

. Пусть вас не смущает

тот факт , что внутри

вложенной-

функ

ции ссылкаthis указывает

на различные

объекты . Когда

вы напишете

 

несколько

функций

расширения

, это станет

привычныместествени -

 

 

 

ным . ( Кроме того , в приложении

вы найдете

описание

 

особенностей-

по

ведения идентификатораthis в JavaScript.)

 

 

 

 

 

 

 

 

 

 

 

 

Для каждого элемента

выполняется

проверка , естьтекущеголи

эле-

 

 

 

мента атрибутdisabled, иесли такой атрибут

имеется , ему присваивает-

 

ся значение true. Результат

методаeach() ( обертка ) возвращается вы-

 

 

 

зывающую

программу

, чтобы

обеспечить

возможность

составления-

це

почек снашим новым методомdisable(), как это делают многие методы

 

библиотеки

jQuery.

После

этого

можно

написать

такую

инструкцию

:

$(“form#myForm input.special”).disable().addClass(“moreSpecial”);

 

 

 

 

 

 

 

 

С точки зрения

кода нашей

 

страницы

все выглядит

так , как если бы

наш новый

методdisable() был встроен

непосредственно библиотекув

!

 

 

Этот прием

обладает

такой

мощью , что большинство

 

пользователей-

, на

чинающих

изучать

jQuery,

 

обнаруживаютсебе вспособность

создавать

 

 

небольшие

расширения

для

jQuery,

как только

начинают применять

библиотеку .

Более того , наиболее инициативные пользователи расширяют - возмож ности jQuery наборами полезных функций , которые называютсяпод-

ключаемыми модулями, или модулями расширения (plugins). Мы еще вернемся кэтому способу расширения jQueryглаве 7.

50 Глава 1. Введение jQueryв

Проверка на существование

Возможно , вам уже приходилось

встречать

этот распространен-

ный способ

проверки

существования

элементов

:

 

if (item) {

 

 

 

 

 

 

 

 

 

 

 

// выполнить

операции

,

если

элемент

существует

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

else {

 

 

 

 

 

 

 

 

 

 

 

 

// выполнить

операции

,

если

элемент

не

существует

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

В основе

этого

приема

лежит идея , случаечтов

отсутствия

элемен-

та условное

выражение

должно возвращатьfalse.

 

 

 

Несмотря

на то , что большинстве

случаев

этот прием

работает ,

тем не менее авторы библиотекиjQuery считают

его недостаточно

надежным

ирекомендуют

использовать

более явный

способпро

верки , как показано примерев

функции$.fn.disable:

 

 

if (item == null) ...

 

 

 

 

 

 

 

 

 

Это выражение

будет

возвращать

корректный

результатв случаеи

значения null, и в случае значенияundefined.

Полное описание различных приемов программирования ,- реко мендованных разработчикамиjQuery, вы найдете в электронной документации по адресуhttp://docs.jquery.com/JQuery_Core_Style_ Guidelines.

Прежде

чем углубиться тонкостив

использования

jQuery,

вы можете-

за

даться

вопросом , можно ли применять jQuery

совместнодругимис биб-

 

лиотеками , такими как Prototype,

ведьнихв, как известно

, тоже есть

 

сокращение $. Ответ на этот вопрос

вы найдетеследующемв

разделе .

 

1.3.6. Сочетание

jQueryдругимис

библиотеками

 

 

 

jQuery предоставляет

распоряжениев

программиста

набор мощных

инструментов

, способных

удовлетворить

насущные

потребности-

боль

шинства

авторов

страниц , но даже при этом иногдастраницев

требует-

 

ся задействовать

возможности нескольких библиотек JavaScript. Такие

ситуации

могут

возникать

, например

, во время

перевода

приложения

на использование

библиотеки jQuery

или когда

необходимо

использо-

вать внаших

страницах другую библиотеку совместноjQueryс.

 

 

 

Разработчики

jQuery

четко понимают потребности

пользователейсво-

в

ем сообществе

неи стремятся

блокировать

применение других

библио-

тек , создавая

все условия для обеспечения

мирного

сосуществования

jQuery сдругими

библиотеками ваших

страницах .

 

 

 

 

1.4. Итоги

 

 

 

 

 

 

 

 

 

 

 

 

51

 

 

В первую

очередь

по общепринятой

рекомендации

они стремятся-

из

бегать « загрязнения

» глобального

пространства

имен идентификатора-

ми , которые могут вызывать конфликты

не толькодругимис

библио-

 

теками , но , возможно ,с иименами

из ваших собственных

сценариев .

Идентификатор jQuery и его псевдоним $ – это единственные

имена ,

 

внедряемые вглобальное пространство имен. Определение вспомога-

 

тельных

 

функций которых,

говорилось разделев

1.3.2, как части про-

 

странства

именjQuery – это прекрасный

пример

такой

заботы .

 

Весьма

маловероятно

, чтобы какая -то другая библиотека

имела-

доста

точно веские причины объявить глобальный

идентификаторjQuery,

 

но здесь

вводится

иболее

очевидный

идентификатор– псевдоним $.

 

Другие

библиотеки

 

JavaScript,частностив

библиотека

Prototype, ис-

 

пользуют

имя$ для своих

собственных

целейпоскольку. А

применение

 

идентификатора $ в таких

библиотеках

является ключомихкфунк-

 

циональности , это чревато

серьезным конфликтом .

 

 

 

 

Авторы jQuery постарались избежать этого конфликтапомощьюс вспомогательной функции , которая такназываетсяи noConflict(). В любой момент , как только будут загружены конфликтующие библиотеки , можно вызвать функцию

jQuery.noConflict();

которая установит значение идентификатора$ в соответствии требосваниями библиотеки , отличной от jQuery.

Тонкости использования этой вспомогательной функции мы подробнее рассмотрим главе 7.

1.4. Итоги

В этом кратком

введенииjQueryв

мы рассмотрели

 

множество

подгото-

вительных

сведений , чтобы вы могли легкобыстрои

приступить разк -

 

работке полнофункциональных

 

веб -приложений

следующего - поколе

ния сиспользованием

jQuery.

 

 

 

 

 

 

 

 

Библиотека

jQuery

будет

полезна

для любой страницы

, которая

должна

выполнять

какие -либо действия

помимо простейших

операций-

Java

Script, и позволит авторам страниц применять

методику

ненавязчи-

вого JavaScript.

При таком подходе поведение

элементов

отделяется от

структуры

документа , так же как CSS позволяет

отделить

информацию

о представлении

от структуры

, за счет чего улучшается

организация

страниц иувеличивается

гибкость

программного

 

кода .

 

 

 

 

jQuery вводит пространство имен JavaScript всего два новых идентификатора – функцию jQuery и ее псевдоним $. Тем не менее через эту функцию библиотека предоставляет массу новых возможностей , что делает ее весьма гибким инструментом , определяя операцию ,- выпол няемую этой функцией , передаваемыми ей параметрами .

52

Глава 1. Введение jQueryв

Как показано выше , функцияjQuery() служит для :

x

Отбора

иобертывания

 

элементов

DOM, участвующихоперациив

 

 

x

Исполнения

роли пространства

имен

для глобальных

вспомогатель-

 

ных функций

 

 

 

 

 

 

 

 

 

 

 

 

 

x

Создания

элементов

DOM из кода разметки HTML

 

 

 

 

x Определения

программного кода , выполняемого

после

того-, как де

 

рево DOM будет готовоманипуляциямк

 

 

 

 

 

 

 

 

Библиотека

jQuery

ведет

себя на странице

как добропорядочный-

граж

данин , не только минимизируя

свое вторжениеглобальноев

простран-

 

 

ство имен , но обеспечивая

возврат

официального

значения

идентифи-

 

катора $ в случаях , когда

это имя может

вызвать

конфликт

, что еще

 

сильнее уменьшает вторжениеглобальноев

пространство

имен– вслу, -

 

 

чаях , когда какая -нибудь другая

библиотека , например Prototype,-

за

действует

идентификатор$ для своих

нужд . Как вамтакое отношение

 

 

к пользователю

?

 

 

 

 

 

 

 

 

 

 

 

 

 

В следующих

 

главах мы рассмотрим все , что может

предложить

jQuery

нам как авторам полнофункциональных

 

интернет -приложений

для

 

страниц . Путешествие

, которые

мы начнемследующейв

главе , пока-

 

 

жет , как использовать

селекторы

jQuery

для идентификации - элемен

тов , над которыми

требуется выполнить

некоторые

операции .

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]