jQuery - различие между $ .functionName и $ .fn. FunctionName

В jQuery я видел обоих следующие способы определить функцию jQuery:

$.fn.CustomAlert = function() {
  alert('boo!');
};

$.CustomAlert = function() {
  alert('boo!');
};

Я понимаю, что они присоединены к объекту jQuery (или $), но каково различие между двумя? Когда я должен использовать один или другой?

Спасибо.

33
задан Russell 16 May 2010 в 23:55
поделиться

2 ответа

Я уверен, что этот вопрос задавали несколько раз раньше, но я не могу найти ссылку.

$ .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), который берет данные из

и генерирует график, вы должны использовать форму $. Fn. * .

$.fn.plotGraph = function() {
    // read the table data and generate a graph
};

$("#someTable").plotGraph();

В связи с этим предположим, что у вас есть плагин, который можно использовать либо с элементами, либо отдельно, и вы хотите получить к нему доступ как $. MyPlugin или $ ("" ) .myPlugin () , вы можете повторно использовать одну и ту же функцию для обоих.

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

(function($) {
    function myAlert(message) {
        alert(new Date().toUTCString() + " - " + message);
    }

    $.myAlert = myAlert;

    $.fn.myAlert = function() {
        return this.each(function() {
            myAlert($(this).text());
        });
    };
})(jQuery);

Он заключен в самоисполняющуюся функцию поэтому myAlert не распространяется на глобальную область. Это пример повторного использования функций между обеими формами плагина.

Как упоминалось в IV, рекомендуется возвращать сам обернутый элемент jQuery, так как вы не хотите разрывать цепочку.

Наконец, я нашел похожие вопросы: -)

66
ответ дан 27 November 2019 в 17:55
поделиться

A

$.a = function() {
  return "hello world";
};

alert($.a());

B

$.fn.b = function() {
  return "hello " + $(this).length + " elements";
}

alert($("p").b());
12
ответ дан 27 November 2019 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: