Определение плагина jQuery - PullRequest
       1

Определение плагина jQuery

2 голосов
/ 16 августа 2010

Есть что-то в «стандартном» определении плагина jQuery, которое я не могу понять, и кажется, что ни один учебник плагинов там не объясняет это.
Большинство определений плагинов, которые я видел, выглядят примерно так:

(function($) {
    $.extend($.fn, {
        pluginName: function( options )
            ...
    });
})(jQuery);

Теперь, хотя я понимаю, что делает часть function($) { ... } (обеспечивает работу jquery с $ даже в режиме noConflict, создает «закрытый» метод и т. Д.), Я не понимаю, почемусамый первый символ - (, и он оканчивается на )(jQuery).

Нужно ли сделать плагины цепными?Можно ли его безопасно игнорировать?

Редактировать

Вариация того же определения:

;(function($) { // why is ; there?

Ответы [ 3 ]

6 голосов
/ 16 августа 2010

Она просто определяет анонимную функцию и сразу вызывает ее, вы можете думать об этом так:

var f = function($) { /* Code goes here, can use $ */ };
f(jQuery); // assings jQuery to $ parameter

Теперь, если вы объедините эти два оператора в одно, вы получите:

(function($) { /* Code goes here */ })(jQuery);

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

1 голос
/ 16 августа 2010

Обтекание строк связано с созданием анонимной функции и последующим ее вызовом.jQuery передается и затем связывается с $, так что ваш плагин все еще будет работать в режиме jQuery noConflict ($ не будет определен).Анонимная функция - это то, что наш плагин получает локальную область видимости, поэтому мы не можем случайно определить глобальные переменные, поскольку они плохие.

Еще один момент, как для разработчика плагина jQuery, я бы не стал предлагать разработку плагинов сэтот код: $ .extend ($. fn, {pluginName: function (options) ...});

Все, что нужно будет сделать, это просто добавить ряд функций в прототип jQuery Object, например,Вы можете вызвать $ ('# el'). pluginName ().Это хорошо, если ваш плагин очень прост, но его может быть довольно сложно поддерживать, так как ваш плагин все еще определяется процедурным способом, а не объектно-ориентированным.

Лучшим подходом было бы что-то вроде этого:

$.pluginName = {
    init: function(){
        var myPlugin = $.pluginName;

        // Attach jQuery Object Prototype (fn function)
        $.fn.pluginName = myPlugin.fn;

        // Attach DomReady
        $(function(){
            myPlugin.domReady();
        });
    }
    domReady: function(){},
    fn: function(){
        // your jQuery object function
    }
});

// Initialise our Plugin
$.pluginName.init();

Этот подход также позволяет людям легко расширять ваш плагин, если он не работает в некоторой области, или самостоятельно исправлять код, не касаясь вашего.Например, я мог бы перезаписать вашу функцию fn следующим образом: $ .pluginName.fn = fixedFnFunction ();

Это отлично подходит для развития сообщества.Мне также нравится это, поскольку он сводит к минимуму то, что содержится в прототипе jQuery Object.

Я ищу статьи, которые я использовал для справки, и опубликую их, когда будет готов.

0 голосов
/ 16 августа 2010

конструкция (..) (jQuery) - это замыкание, используемое для «вставки» в пространство имен «jquery»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...