Функция jQuery.each
jQuery.each() — это итератор, т.е. такая функция которая перебирает все элементы массива или объекта. Синтаксис данной функции имеет следующий вид:
Внимание! Не нужно путать функцию jQuery.each() с функцией $(selector).each() — в первом случае функция each работает с произвольной коллекцией, которая передается ей в качестве первого аргумента, а во втором только с элементами jQuery, которые были выбраны в рамках используемого селектора.
Более того, если посмотреть код jQuery, то легко убедиться, что функция $(selector).each() — это не что иное как обертка для функции jQuery.each(), где в качестве первого аргумента передается элемент this:
Возможно, кому-то покажется странным, что в качестве коллекции передается указать this. Хотя на самом деле ничего странного здесь нет, достаточно вспомнить, что экземпляр класса jQuery — это ни что иное как коллекция dom-элементов, которые были выбраны на основании заданного селектора.
Иногда, в процессе перебора элементов коллекции, возникает необходимость прекратить дальнейший перебор. Для этого достаточно в callback-е (см. синтаксис jQuery.each() использовать конструкцию "return false;".
Другими словами функция-обработчик возвращающая булево значение «false» останавливает дальнейший перебор элементов коллекции.
Для наглядности приведу пару примеров:
Если после прочтения заметки появились какие-то мысли, замечания или просто желание сказать спасибо, то милости прошу в комментарии.
jQuery.each(collection, callback(indexInArray, valueOfElement) )
collection - массив или объект
callback - функция которая будет вызываться для каждого элемента коллекции
Внимание! Не нужно путать функцию jQuery.each() с функцией $(selector).each() — в первом случае функция each работает с произвольной коллекцией, которая передается ей в качестве первого аргумента, а во втором только с элементами jQuery, которые были выбраны в рамках используемого селектора.
Более того, если посмотреть код jQuery, то легко убедиться, что функция $(selector).each() — это не что иное как обертка для функции jQuery.each(), где в качестве первого аргумента передается элемент this:
// Execute a callback for every element in the matched set.
// (You can seed the arguments with an array of args, but this is
// only used internally.)
each: function( callback, args ) {
return jQuery.each( this, callback, args );
}
Возможно, кому-то покажется странным, что в качестве коллекции передается указать this. Хотя на самом деле ничего странного здесь нет, достаточно вспомнить, что экземпляр класса jQuery — это ни что иное как коллекция dom-элементов, которые были выбраны на основании заданного селектора.
Иногда, в процессе перебора элементов коллекции, возникает необходимость прекратить дальнейший перебор. Для этого достаточно в callback-е (см. синтаксис jQuery.each() использовать конструкцию "return false;".
Другими словами функция-обработчик возвращающая булево значение «false» останавливает дальнейший перебор элементов коллекции.
Для наглядности приведу пару примеров:
$.each([111, 43, 43], function(index, value) {
alert(index + ': ' + value);
});
Результат:
0:111
1:43
2:43
var map = {
'flammable': 'inflammable',
'duh': 'no duh'
};
$.each(map, function(key, value) {
alert(key + ': ' + value);
});
Результат:
flammable: inflammable
duh: no duh
Если после прочтения заметки появились какие-то мысли, замечания или просто желание сказать спасибо, то милости прошу в комментарии.
Работа с checkbox в jQuery
В данной статье я расскажу о том, как в jquery можно обрабатывать элементы checkbox. В частности будет рассмотрен вопрос получения списка всех элементов checkbox на странице, а так же операции над ними. В конце будут приведены примеры кода на JavaScript.
Читать дальше
Читать дальше
Функцция jQuery.live
Начиная с версии 1.3 в jQuery появилась функция live, которая является аналогом функции bind и так же служит для назначения событий всем элементам, которые соответствуют выражению заданному в селекторе jQuery.
Основное отличие функции jQuery.live от jQuery.bind состоит в том, что bind действует только на объекты, которые существовали на момент вызова функции. Для объектов созданных позднее необходимо запускать bind повторно.
Функция jQuery.live лишена этого недостатка и будучи запущена один раз позволяет назначить события не только на созданные объекты, но и на те объекты, которые появятся позже.
Для иллюстрации сказанного, приведу небольшой пример:
Для того, чтобы «оживить» данный пример добавим обработку события «click»:
Недостаток в том, что после того как будет добавлен дополнительный элемент, с тем же классом «clickme», созданный с помощью bind обработчик событий для него действовать не будет.
Кому-то данное ограничение может показаться незначительным, но на самом деле это большая проблема. Ведь, для каждого нового элемента необходимо повторно назначать события, а это выливается в увеличение объема и сложности программы.
Появление новой функции jQuery.live значительно упрощает жизнь программиста и позволяет уменьшить сложность программы, а следовательно и риск ошибки.
Синтаксис функции аналогичен синтаксису команды bind:
Поэтому единственное отличие между приведенным выше кодом для bind и кодом для live заключается в замене имени одной функции на другое:
В дополнение хочу отметить, что начиная с версии jQuery 1.4.1 прототип функции live стал выглядеть иначе:
EventData — это необязательный параметр, который предназначен для передачи в обработчик дополнительных данных.
Одновременно с этим изменением появилась возможность назначать несколько событий на один обработчик:
Думаю, что многие оценят полезность функции live и постепенно начнут переписывать свои программы на новый лад. Что касается меня, то процесс перехода уже начат.
Основное отличие функции jQuery.live от jQuery.bind состоит в том, что bind действует только на объекты, которые существовали на момент вызова функции. Для объектов созданных позднее необходимо запускать bind повторно.
Функция jQuery.live лишена этого недостатка и будучи запущена один раз позволяет назначить события не только на созданные объекты, но и на те объекты, которые появятся позже.
Для иллюстрации сказанного, приведу небольшой пример:
<body>
<div class=clickme>
Click Here
</div>
Для того, чтобы «оживить» данный пример добавим обработку события «click»:
$('.clickme').bind('click', function() {
// Обработчик события Click
});
Недостаток в том, что после того как будет добавлен дополнительный элемент, с тем же классом «clickme», созданный с помощью bind обработчик событий для него действовать не будет.
$('body').append('<div class=clickme>Click here too</div>');
Кому-то данное ограничение может показаться незначительным, но на самом деле это большая проблема. Ведь, для каждого нового элемента необходимо повторно назначать события, а это выливается в увеличение объема и сложности программы.
Появление новой функции jQuery.live значительно упрощает жизнь программиста и позволяет уменьшить сложность программы, а следовательно и риск ошибки.
Синтаксис функции аналогичен синтаксису команды bind:
.live(eventType, handler);
Поэтому единственное отличие между приведенным выше кодом для bind и кодом для live заключается в замене имени одной функции на другое:
$('.clickme').live('click', function() {
// Обработчик события Click
});
В дополнение хочу отметить, что начиная с версии jQuery 1.4.1 прототип функции live стал выглядеть иначе:
.live( eventType, eventData, handler )
EventData — это необязательный параметр, который предназначен для передачи в обработчик дополнительных данных.
Одновременно с этим изменением появилась возможность назначать несколько событий на один обработчик:
$('.clickme').live('mouseover mouseout', function() {
if (event.type=='mouseover') {
// обрабатываем mouseover
}
if (event.type=='mouseout') {
// обрабатываем mouseout
}
});
Думаю, что многие оценят полезность функции live и постепенно начнут переписывать свои программы на новый лад. Что касается меня, то процесс перехода уже начат.
Для чего нужен jQuery.fn
Опубликовал root в блоге JavaScript 07 февраля 2010, 07:03
Каждый кто сталкивался с написанием собственных плагинов на jQuery задавал вопрос — "В чем различие между объявлением функций через jQuery и jQuery.fn?".
Для того, чтобы ответить на поставленный вопрос приведу два примера.
Пример 1.
Пример 2.
Если запустить первый пример, то произойдет одно из двух событий — браузер выдаст ошибку (например, если у Вас установлен FireBug) либо не выдаст ничего. А если запустить второй пример, то на экране появится сообщение о количестве найденных элементов.
Прежде чем делать какие-либо выводы, приведу еще один пример:
В данном примере, будет выдано сообщение о количестве найденных объектов.
Думаю теперь у нас достаточно информации, чтобы сделать некоторые выводы:
Вывод 1: Если задать функцию через jQuery.fn, то она будет работать с элементами найденными через функцию $(). Контекст этой функции будет содержать выбранные элементы;
Вывод 2: Если задать функцию через jQuery, то к ней можно обратиться только через глобальный объект jQuery. В таком случае контекст функции будет указывать на глобальный объект window.
Таким образом, если нужно написать плагин, который будет работать только с выбранными объектами, то нужно его создавать в jQuery.fn, а если нам неважно какие элементы страницы были выбраны, то лучше создавать функцию через jQuery.
Для того, чтобы ответить на поставленный вопрос приведу два примера.
Пример 1.
jQuery.sayHello = function() {
alert('Привет! Найдено ' + this.length + 'элементов' );
}
$('div').sayHello(); // ничего не происходит
Пример 2.
jQuery.fn.sayHello = function() {
alert('Привет! Найдено ' + this.length + 'элементов' );
}
$('div').sayHello(); // Выводит "Привет! найдено ХХ элементов", где ХХ - это количество найденных элементов на странице
Если запустить первый пример, то произойдет одно из двух событий — браузер выдаст ошибку (например, если у Вас установлен FireBug) либо не выдаст ничего. А если запустить второй пример, то на экране появится сообщение о количестве найденных элементов.
Прежде чем делать какие-либо выводы, приведу еще один пример:
jQuery.sayHello = function(elem) {
alert('Привет! Найдено ' + elem.length + 'элементов' );
}
jQuery.sayHello($('div'));
В данном примере, будет выдано сообщение о количестве найденных объектов.
Думаю теперь у нас достаточно информации, чтобы сделать некоторые выводы:
Вывод 1: Если задать функцию через jQuery.fn, то она будет работать с элементами найденными через функцию $(). Контекст этой функции будет содержать выбранные элементы;
Вывод 2: Если задать функцию через jQuery, то к ней можно обратиться только через глобальный объект jQuery. В таком случае контекст функции будет указывать на глобальный объект window.
Таким образом, если нужно написать плагин, который будет работать только с выбранными объектами, то нужно его создавать в jQuery.fn, а если нам неважно какие элементы страницы были выбраны, то лучше создавать функцию через jQuery.
jQuery. Как создать свой plugin
Я заметил за собой одну вещь — если у меня есть какая-то задача, которая кажется мне сложной для освоения, то я откладываю ее решение в «долгий ящик». А когда наконец добираюсь до нее и нахожу решение, понимаю, что «ларчик просто открывался».
Так, например, я очень долго откладывал вопрос по написанию собственных jQuery плагинов. Мне казалось, что это очень сложно! Но набравшись сил и переборов свое предубеждение я начал разбираться с этим вопросом и обнаружил, что все очень просто.
Необходимость написание собственных плагинов возникает по очень простой причине — каким бы хорошим не был фреймворк jQuery его функционал конечен, а значит рано или поздно возникает потребность сделать что-то, чего этот фремворк делать не умеет. Вот тогда, то и возникает необходимость написать свой jQuery plugin.
На самом деле слово «plugin» многих сбивает с толку, ведь кажется, что плагин — это что-то сложное. А на деле оказывается, что плагин это всего лишь набор функций или методов jQuery собранных в отдельный файл. Обычно файл именуется по имени плагина, например «highlight.js».
Исходя из вышесказанного легко показать как создаются плагины на базе функций и методов jQuery.
Способ №1 — создание плагина на базе функции
Здесь создается новая функция «log», которая является частью глобального объекта jQuery. Важно понимать, что при обращении к функции нельзя использовать служебное слово «this». Функция должна использоваться следующим способом:
Способ №2 — создание плагина на базе метода
В отличии от функции методы создаются для каждого объекта jQuery в отдельности, поэтому к ним можно обращаться «из объекта» используя служебное слово «this». По сути методы нужны тогда, когда появляется необходимость работать с контекстом объекта, в противном случае лучше использовать функции.
Особо хочется отметить тот факт, что при создании плагина лучше использовать имя объекта — «jQuery», а не сокращения "$". Но если уж очень хочется, то делать нужно так:
На этом пока все. Спасибо за внимание.
Так, например, я очень долго откладывал вопрос по написанию собственных jQuery плагинов. Мне казалось, что это очень сложно! Но набравшись сил и переборов свое предубеждение я начал разбираться с этим вопросом и обнаружил, что все очень просто.
Необходимость написание собственных плагинов возникает по очень простой причине — каким бы хорошим не был фреймворк jQuery его функционал конечен, а значит рано или поздно возникает потребность сделать что-то, чего этот фремворк делать не умеет. Вот тогда, то и возникает необходимость написать свой jQuery plugin.
На самом деле слово «plugin» многих сбивает с толку, ведь кажется, что плагин — это что-то сложное. А на деле оказывается, что плагин это всего лишь набор функций или методов jQuery собранных в отдельный файл. Обычно файл именуется по имени плагина, например «highlight.js».
Исходя из вышесказанного легко показать как создаются плагины на базе функций и методов jQuery.
Способ №1 — создание плагина на базе функции
jQuery.log = function(message) {
if(window.console) {
console.debug(message);
} else {
alert(message);
}
}
Здесь создается новая функция «log», которая является частью глобального объекта jQuery. Важно понимать, что при обращении к функции нельзя использовать служебное слово «this». Функция должна использоваться следующим способом:
jQuery.log("Некоторое сообщение...");
// или
$.log("Еще какое-то сообщение");
Способ №2 — создание плагина на базе метода
В отличии от функции методы создаются для каждого объекта jQuery в отдельности, поэтому к ним можно обращаться «из объекта» используя служебное слово «this». По сути методы нужны тогда, когда появляется необходимость работать с контекстом объекта, в противном случае лучше использовать функции.
jQuery.fn.highlight = function (word) {
var span = "<span class='highlight'>" + word + "</span>";
this.each(function() {
this.innerHTML = this.innerHTML.replace( new RegExp(word, 'gi'), span);
});
}
Особо хочется отметить тот факт, что при создании плагина лучше использовать имя объекта — «jQuery», а не сокращения "$". Но если уж очень хочется, то делать нужно так:
(function($){
$.fn.someFunction = function() {
//........
}
})(jQuery);
На этом пока все. Спасибо за внимание.