15. Введение в jQuery

Конструируем свою jQuery

Программирование с помощью с jQuery напоминает работу на новом языке программирования, отличном от JavaScript. Но jQuery — это функция JavaScript. Магически мощная, но ничего кроме этого. Волшебство, конечно, присутствует, но обычное программистское, основанное на JavaScript-инструментарии и талантах автора.

Чтобы с самого начала понять, как устроена эта библиотека, и рассеять иллюзорный туман, сконструируем собственную маленькую jQuery (не претендуя на полное совпадение конструкций) и опробуем её в работе.

В нашем учебном варианте в качестве селектора для отбора элементов разрешим использовать только имя тега, а обёртку дополним единственным методом setClass(nаme) для установки класса с именем name во всех отобранных элементах. Кроме того, снабдим нашу библиотеку вспомогательной функцией trim(str), которая будет выполнять усечение своего строкового аргумента (удалять начальные и конечные пробелы).

Назовем нашу функцию jQuery, как и в большой библиотеке, и приступим к её созданию.

Функция jQuery должна принимать в качестве аргумента имя тега и возвращать объект подобный массиву с набором соответствующих элементов страницы.

Это несложно сделать, применяем стандартный метод интерфейса Document модели DOM W3C:


function jQuery(selector)
{
  // Отбор элементов с заданным именем тега
  var set = document.getElementsByTagName(selector);
  return set; 
}

Но мы должны вернуть не просто набор отобранных элементов, мы должны вернуть обертку, то есть нужно снабдить этот набор методом setClass(nаme). Опишем этот метод внутри функции jQuery:


function jQuery(selector)
{
  // Отбор элементов с заданным именем тега
  var set = document.getElementsByTagName(selector);

  // Создадим обертку -- добавим метод setClass к объекту set 

  // Метод setClass(name) -- устанавливает класс c именем name
  // для всех отобранных элементов
  // --> начало описания метода
  set.setClass = function (name)   
  {
    for (var i=0; i<set.length; i++) set[i].className = name;
    return this; // Вернем обёртку из метода setClass 
                 // Вспомним, что this в функции ссылается на объект,
                 // в контексте которого она работает (то есть вернем set) 
  }
  // <-- конец описания метода
  return set; // Вернем обёртку из функции jQuery
}

Теперь объект set, возвращаемый функцией jQuery, кроме отобранных элементов будет содержать еще и метод setClass, которым этот набор можно обрабатывать.

Заметим, что мы написали замыкание. В самом деле, функция jQuery возвращает объект set. Метод setClass этого объекта описан внутри jQuery. Значит, объект вызова функции jQuery уничтожаться не будет — образуется замыкание.

Теперь вызов

jQuery("a")

вернет обернутый набор всех гиперссылок страницы. На этот набор можно воздействовать методом setClass — этот метод установит класс с заданным именем на все элементы набора:

jQuery("a").setClass("link")

Приведенная выше строка выполнит отбор всех гиперссылок страницы и установку класса с именем link во все эти элементы.

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

jQuery("a").setClass("link")[0].style.background = "yellow";

Сколько всякой работы скрыто за этим коротким заклинанием!

Теперь давайте создадим «вспомогательную» функцию trim. Слово «вспомогательное» написано в кавычках, ибо trim будет являться методом функции jQuery (ещё раз вспомним, что функции в Javascript — это объекты).


// Вспомогательная функция -- усечение строки
// Эта функция определяется как метод объекта jQuery
jQuery.trim = function (str)
{
  return  str.replace(/^\s+|\s+$/g,'');
}

Теперь можно написать:

jQuery.trim("     текст      ")

Функция trim выполнит усечение строки, то есть удалит начальные и конечные пробелы и вернет строку "текст".

И вот полный код построенной библиотеки:


// --- Начало "библиотеки" -------------------------------------------
function jQuery(tagName)
{
  // Отбор элементов с заданным именем тега
  var set = document.getElementsByTagName(tagName);

  // Создадим обертку -- добавим методы к объекту set 

  // Опишем метод setClass(name) -- установить класс c именем name
  // для всех отобранных элементов 
  // --> начало описания метода
  set.setClass = function (name)   
  {
    for (var i=0; i<set.length;i++ )
      set[i].className = name;
    return this; // Вернем обёртку из метода setClass 
  }
  // <-- конец описания метода
  return set; // Вернем обёртку из функции jQuery
}

// Вспомогательная функция -- усечение строки
// Эта функция определяется как метод объекта $
jQuery.trim = function (str)
{
  return  str.replace(/^\s+|\s+$/g,'');
}
// --- Конец "библиотеки" --------------------------------------------

Пример 01 демонстрирует работу построенной библиотеки. Поработайте с этим приложением и прочитайте его коды.