Ответ 1
Я уверен, что этот вопрос задавался несколько раз раньше, но я не могу найти ссылку.
$.fn
указывает на jQuery.prototype
. Любые методы или свойства, которые вы добавляете к нему, становятся доступными для всех экземпляров обернутых jQuery объектов.
$.something
добавляет свойство или функцию самому объекту jQuery.
Используйте первую форму $.fn.something
, когда вы имеете дело с элементами DOM на странице, и ваш плагин что-то делает с элементами. Когда плагин не имеет ничего общего с элементами DOM, используйте другую форму $.something
.
Например, если у вас была функция журнала, нет смысла использовать ее с элементами DOM, например:
$("p > span").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 элемента, так как вы не хотите разрушать цепочку.
Наконец, я нашел похожие вопросы: -)