Задайте свой вопрос о JavaScript на нашем форуме

Библиотека prototype.js - знакомство

Prototype.js — довольно популярный фреймворк, способный облегчить жизнь JavaScript-разработчику.

На данный момент проект prototype.js располагается по адресу www.prototypejs.org, где вы сможете скачать последнюю стабильную версию или ознакомится с документацией.

Цель данной статьи — краткий обзор самых полезных возможностей библиотеки. К настоящему моменту (осень, 2008) последняя стабильная версия прототайпа — 1.6.0.2, и весит она совсем не мало — 130Кб. Однако, эти 130Кб занимает девелоперская версия кода с табуляцией и комментариями. При желании можно ужать её, удалив ненужные фрагменты.

Для подключения библиотеки достаточно скачать единственный js-файл и добавить его на вашу страницу:

<script type="text/javascript" src="prototype-1.6.0.2.js"></script>

Не все начинающие JavaScript-разработчики знают, но в JavaScript можно в именах переменных использовать знак доллара ($). Эту особенность используют разработчики prototytpe.js, начиная имена базовых методов с $

Функция $()

Пожалуй, самая знаменитая и часто используемая функция. В качестве аргумента она принимает идентификатор (или массив идентификаторов) и отдает ссылку на объект с этим идентификатором (или массив соот-но).

HTML:

<div id="id_1">First DIV</div>
<div id="id_2">Second DIV</div>

JavaScript:

alert(
    $("id_1").innerHTML
); // Выведет 'First DIV'

var divArray = $("id_1","id_2");
alert(divArray.length); // Выведет 2

Функция "доллар" по сути является эквивалентом метода document.getElementById, но более продвинутым, т.к.:

  1. более короткая и удобная в записи,
  2. может принимать несколько аргументов,
  3. может принимать в качестве аргумента ссылку на элемент и возвращать её же.

Последний момент можно проиллюстрировать дополнением к предыдущему примеру:

alert(
    $(
        $("id_1")
    ).innerHTML
); // Выведет 'First DIV'

Функция $$()

Функция "доллар-доллар" является существенным расширением предыдущей, т.к. в качестве аргументов принимает не только идентификаторы, но и в целом CSS-селекторы:

$$('div'); // Вернет все ДИВы, также как document.getElementsByTagName('div')
$$('div','span'); // Вернет массив всех ДИВов и СПАНов
$$('#id_1'); // Вернет элемент с id="id_1", также как $('id_1')
$$('li.faux'); // Вернет все элементы LI с классом 'faux'

Как видно из примера, $$('div') аналогично вызову document.getElementsByTagName('div'). Однако, в prototype.js существует надстройка в виде метода select(), который также возвращает массив элементов по селектору, но ищет их в дочерних элементах из контекстного объекта:

HTML:

<div id="parent">
    <span>Q</span>
    <span>W</span>
    <span>E</span>
</div>
<span>R</span>

JavaScript:

$('parent').select('span'); // Вернет массив СПАНов внутри элемента с id="parent"

Реализована поддержка атрибутов в селекторах (CSS 2.1):

$$('input[type=text]'); // Вернет массив ИНПУТов только с type="text"

Также, начиная с версии 1.5.1, заявлено о поддержке селекторов CSS3:

$$('div#parent :first-child') // Вернет первого потомка для ДИВа с id="parent"

Функция "доллар-доллар" имеет все шансы вытеснить своего исторического предка, т.к. дает огромные возможности разработчику для получения доступа к узлам документа.

Функция $F()

Удобна для работы с полями форм — возвращает их значение. В качестве аргумента принимает либо ID элемента, либо сам элемент:

HTML :

<input type="text" value="Hello!" id="inputId" />

JavaScript :

$F('inputId'); // Вернет 'Hello!'

Функции $A() и $H()

В JavaScript есть базовые объекты, такие как Array, Date, Object и др. В некотором приближении их можно рассматривать в качестве классов (в терминах ООП). Библиотека prototype.js умеет создавать собственные классы и расширять уже имеющиеся.

В частности, класс Enumerable (перечисляемый) является расширением Array, а функция $A() приводит передаваемые ей массивы к виду экземпляра объекта Enumerable. Для примера, получим массив всех ДИВов на странице и изменим их внешний вид с помощью метода each() класса Enumerable:

HTML :

<div>First DIV</div>
<div>Second DIV</div>
<div>Third DIV</div>

JavaScript :

var allDiv = document.getElementsByTagName('div'); // Получим все ДИВы на странице
allDiv = $A(allDiv); // Приведем их к виду экземпляра класса Enumerable
allDiv.each(setColor); // С помощью метода each для каждого элемента применим функцию setColor

function setColor(element,index) { // arg[0] - ссылка на элемент, arg[1] - индекс в массиве
    element.style.backgroundColor = 'red'; // Задаем фоновый цвет для ДИВа
}

Класс Hash является расширением класса Object. Экземпляры класса Object — это ассоциативные массивы, содержащие набор пар ключ=значение. К сожалению, в JavaScript всего один явный способ перебора ассоциативных массивов — конструкция for in. А к экземплярам класса Hash можно применить множество полезный методов, таких как keys(), values() и др.

Более подробно о классах и их реализации в prototype речь пойдет в следущей статье.

Функция $w()

Небольшая полезная функция, преобразующая строку в массив слов. В качестве разделителей метод использует пробелы:

$w('apples bananas kiwis') // Вернет массив ['apples', 'bananas', 'kiwis']

Подведем итоги

Надеюсь, что знакомство с библиотекой prototype у вас состоялось. Данная статья является первой в цикле, посвященной работе с prototype.js. В ближайших сериях ждите описание работы с классами и AJAX-объектом.

Александр Бурцев 15 сентября 2008

© Все права на данную статью принадлежат порталу fastcoder.org. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.

Комментарии

rgbeast 15 сентября 2008, 20:33 #
Удобно ли то, что функции $(), $$() могут вернуть как один элемент, так и массив? Не потребуется ли дополнительная проверка возвращаемых ими значений?
 
Bur 15 сентября 2008, 23:40 #
В случае функции доллар ($) это удобно, т.к. есть четкое правило: "Задал одну переменную - получил ссылку на объект, а если задал несколько - получил массив объектов". Идентификатор на странице может быть только один, поэтому всегда есть взаимоодназначное соот-ие.

А функция доллар-доллар, в отличие от предыдущей, всегда возвращает массив, что верно по сути, даже если массив состоит из одного элемента:

$$("div.one")[0].backgroundColor = "red";
 
rgbeast 16 сентября 2008, 15:35 #
спасибо, теперь логика типа значения понятна
 
Octane 18 сентября 2008, 17:53 #
Для чего загромождать фреймворк функциями на подобие «$w», стандартный метод «split» не такой уж и громоздкий, а учитывая то, насколько она часта бывает нужна, вообще не понятно зачем ее написали. Видимо она выполняет не просто «split», а может быть еще приводит к типу «Enumerable»? Пойду почитаю доки… фсе, скоро напишу убийцу «jQuery» и «PrototypeJS» :-D
 
Bur 18 сентября 2008, 17:56 #
Неблагадарное это дело, в одиночку фреймворки писать :-)
 
Octane 18 сентября 2008, 19:16 #
Это хороший способ научиться профессионально разрабатывать веб-интерфейсы. Да и совесть не позволяет, в некоторых проектах, ради нескольких манипуляций с DOM и CSS подключать огромный фреймворк, хотя что есть огромный, если взять «ExtJS», то «jQuery» и «Prototypejs» просто крохотные покажутся :)
 
Bur 18 сентября 2008, 19:47 #
К примеру jQuery в min-версии весит не так уж и много - 15Кб.
Но для нескольких манипуляций действительно нет смысла в использовании библиотеки, даже собственноручно написанной. Достаточно пары функций с неймспейсом.
 
Megabyte 18 января 2009, 18:54 #
Вся фишка jQuery в ее способе взаимодействия с элементами. А именно пакетно-оберточный поход и ленточное применение методов.
К примеру:
Это Prototype:
var allDiv = document.getElementsByTagName('div'); // Получим все ДИВы на странице
allDiv = $A(allDiv); // Приведем их к виду экземпляра класса Enumerable
allDiv.each(setColor); // С помощью метода each для каждого элемента применим функцию setColor

function setColor(element,index) { // arg[0] - ссылка на элемент, arg[1] - индекс в массиве
    element.style.backgroundColor = 'red'; // Задаем фоновый цвет для ДИВа
}


А это jQuery:
$('div').css({backgroundСolor: 'red'});


Выбирайте сами что удобнее.
P.S. В jQuery функции типа $.each и пр. тоже присутствуют.
 
skaurus 17 февраля 2009, 14:00 #
Ну вот уж совсем-то набрасывать не надо.

$$('div').each(function(elem) { elem.setStyle('backgroundColor', 'red') });

и это не должно являться критерием выбора. Часто используется этот участок - обернете его в функцию.
 
Alexander 5 марта 2009, 15:34 #
Даже короче:

$$('div').invoke('setStyle', {backgroundColor: 'red'});

 
 
Rambler's Top100 Flede HTML valid CSS valid