Я уверен, что этот вопрос уже задавался несколько раз, но я не могу найти ссылку.
$.fn
указывает на jQuery.prototype
. Любые методы или свойства, которые вы добавляете в него, становятся доступными для всех экземпляров обернутых объектов jQuery.
$.something
добавляет свойство или функцию к самому объекту jQuery.
Используйте первую форму $.fn.something
, когда вы имеете дело с элементами DOM на странице, и ваш плагин что-то делает с элементами. Когда плагин не имеет ничего общего с элементами DOM, используйте другую форму $.something
.
Например, если у вас была функция логгера, нет смысла использовать ее с элементами DOM, как в:
$("p > span").log();
Для этого случая вы просто добавите метод log к объекту jQuery iself:
jQuery.log = function(message) {
// log somewhere
};
$.log("much better");
Однако при работе с элементами вы бы хотели использовать другую форму. Например, если у вас есть графический плагин (plotGraph), который берет данные из <table>
и генерирует график - вы должны использовать форму $.fn.*
.
$.fn.plotGraph = function() {
// read the table data and generate a graph
};
$("#someTable").plotGraph();
В связанной заметке предположим, что у вас есть плагин, который можно использовать с элементами или автономно, и вы хотите получить к нему доступ как $.myPlugin
или $("<selector>").myPlugin()
, вы можете использовать одну и ту же функцию для обоих.
Скажем, мы хотим получить пользовательское оповещение, в котором перед каждым оповещением добавляется дата. При использовании в качестве автономной функции мы передаем ему сообщение в качестве аргумента, а при использовании с элементами в качестве сообщения используется text
элемента:
(function($) {
function myAlert(message) {
alert(new Date().toUTCString() + " - " + message);
}
$.myAlert = myAlert;
$.fn.myAlert = function() {
return this.each(function() {
myAlert($(this).text());
});
};
})(jQuery);
Она заключена в самовыполняющуюся функцию, поэтому myAlert не выпадает в глобальную область. Это пример или повторное использование функциональности между обеими формами плагина.
Как уже упоминалось выше, рекомендуется возвращать сам обернутый элемент jQuery, поскольку вы не захотите разрывать цепочку.
Наконец-то я нашел похожие вопросы: -)