Копия jQuery
Создает копию глобального объекта jQuery, давая возможность изменять методы и параметры созданной копии, не затрагивая оригинал.
Не имеет параметров.
Эта функция позволяет безопасно вносить изменения в функциональность jQuery, в частности при написании плагинов. Стоит отметить, что при использовании $.sub(), копия и оригинал не полностью изолированны друг от друга. При выполнении, все методы копии будут обращаться к функциональности оригинала.
Примеры использования
Когда возникает необходимость добавить в jQuery новые методы, не стоит торопиться делать это напрямую. Это способствует "захламлению" его пространства имен, что в дальнейшем может привести к конфликтам имен. Вместо этого, лучше создать копию jQuery, добавить туда необходимые методы и в дальнейшем, работать с ней.
//Локализуем область работы с копией jQuery. Вне этой области, копия не будет доступна. (function(){ var sub$ = jQuery.sub(); sub$.fn.myCustomMethod = function(){ return 'just for me'; }; sub$(document).ready(function() { sub$('body').myCustomMethod() // 'just for me' }); })(); typeof jQuery('body').myCustomMethod // undefined
Создадим копию jQuery, и внесем изменения в метод remove: добавим возможности устанавливать обработчики на удаление элементов:
// Локализуем область работы с копией jQuery. Вне этой области, копия не будет доступна. (function() { var myjQuery = jQuery.sub(); myjQuery.fn.remove = function() { // Организуем вызов нового события (с типом "remove"). // В результате, станет возможно устанавливать // обработчики удаления элементов со страницы. this.trigger("remove"); // выполним оригинальный метод remove return jQuery.fn.remove.apply( this, arguments ); }; // воспользуемся новой функциональностью в myjQuery. myjQuery(function($) { // установим обработчик, удаляющий элементы, при нажатии. $(".menu").click(function() { $(this).find(".submenu").remove(); }); // установим обработчик, срабатывающий на удаление элементов $(document).bind("remove", function(e) { $(e.target).parent().hide(); }); }); })(); // Оригинал jQuery не будет обладать новой функциональностью.
Расширим возможности jQuery. Создадим его копию, которой добавим два новых метода, после чего добавим ее (копию) в оригинал (заняв всего одно имя в его пространстве имен):
(function(){ var plugin = jQuery.sub(); // расширим возможности копии добавив два новых метода plugin.fn.extend({ open: function(){ return this.show(); }, close: function(){ return this.hide(); } }); // Добавим копию в оригинал jQuery.fn.myplugin = function(){ this.addClass("plugin"); return plugin( this ); }; })(); // воспользуемся внесенными изменениями $(document).ready(function(){ $('#main').myplugin().open(); // замечание: вызов $("#main").open() не сработает! });