Можно ли создать пространство имен в jQuery?
У YUI есть хороший способ создания пространства имен для ваших методов и т. Д. В javascript.
У jQuery есть что-то похожее?
9 ответов
lpfavreau предлагает решение для расширения объекта jQuery с помощью ваших собственных методов (чтобы их функциональность применялась к реальному контексту объекта jQuery).
Если вы ищете просто пространство имен для своего кода, вы можете использовать символ доллара, например:
$.myNamespace = { .. };
или "JQuery":
jQuery.myNamespace = { .. };
Будьте осторожны с выбранным пространством имен, так как это может перезаписать существующие методы jQuery (я бы посоветовал сначала выполнить поиск в коде jQuery, чтобы вы этого не сделали).
Вы можете перейти по этой ссылке: http://www.zachleat.com/web/2007/08/28/namespacing-outside-of-the-yahoo-namespace/
Посмотрите, как легко создать свою собственную функцию для копирования того, что делает YUI:
// include jQuery first.
jQuery.namespace = function() {
var a=arguments, o=null, i, j, d;
for (i=0; i<a.length; i=i+1) {
d=a[i].split(".");
o=window;
for (j=0; j<d.length; j=j+1) {
o[d[j]]=o[d[j]] || {};
o=o[d[j]];
}
}
return o;
};
// definition
jQuery.namespace( 'jQuery.debug' );
jQuery.debug.test1 = function()
{
alert( 'test1 function' );
};
jQuery.debug.test2 = function()
{
alert( 'test2 function' );
};
// usage
jQuery.debug.test1();
jQuery.debug.test2();
Вот как я создаю пространства имен для моих плагинов:
(function ($) {
// do not overwrite the namespace, if it already exists
$.MyNamespace = $.MyNamespace || {};
$.MyNamespace.MyPlugin = function () {/*here's the logic*/}
})($);
А потом:
$.MyNamespace.MyPlugin ();
В jQuery есть множество плагинов, которые расширяют базовую функциональность. Есть этот плагин для простых пространств имен.
Плагин пространства имен ПОЛНОСТЬЮ НЕОБХОДИМО! Самый старый трюк в мире, использование arguments.callee, Function.prototype, а затем вызов нового экземпляра Function, позволяет создавать вложенные пространства имен с помощью $.fn.extend!
Вот простой и простой пример:
;(function($){
var options= {
root: function(){ //you don't have to call it 'root', of course :)
//identify the function from within itself with arguments.callee
var fn= arguments.callee;
//'this' at this level is the jquery object list matching your given selector
//we equate fn.prototype to this
//thus when we call a new instance of root, we are returned 'this'
fn.prototype= this;
fn.value= function(){
//Note: "new this" will work in the below line of code as well,
//because in the current context, 'this' is fn;
//I use fn to make the code more intuitive to understand;
var context= new fn;
console.log(context, fn.prototype); //test
return context.html(); //test
}
return this;
}
}
//you can obviously append additional nested properties in this manner as well
options.root.position= function(){
var context= new this; //in this context, fn is undefined, so we leverage 'this'
console.log(context, this.prototype); //test
return context.offset(); //test
}
//don't forget to extend in the end :)
$.fn.extend(options);
})(jQuery);
;$(function(){
var div= $('div#div')
.root();
console.log(div.root.value());
console.log(div.root.position());
});
Если вы хотите использовать jQuery таким образом:
$("*").namespace.do();
тогда в настоящее время нет плагинов, делающих это. (Я не могу найти ни плагин Джона Ресига jquery.space, который, по-видимому, перестал работать в jQuery 1.4, ни плагин Gilberto Saraiva, который, очевидно, не работал должным образом). Я бы с удовольствием посмотрел на функцию Джона, чтобы понять, почему она перестала работать, и что можно сделать, чтобы заставить ее работать, и, честно говоря, это был бы лучший подход для создания беспорядочных пространств имен.
Согласно http://malnotna.wordpress.com/2009/01/12/jquery-namespace-support/ другой подход заключается в том, чтобы сделать пространство имен как (используя jQuery.Modularize от Ariel Flesler):
$("*").namespace().do()
но такой синтаксис не "красивый". Мы также передаем результаты от одной функции к другой.
Мой подход к созданию пространств имен заключается не в том, чтобы помещать пространства имен в конец, а в начало $, поэтому наш синтаксис пространства имен $('*').
$.namespace("*").do()
Как ни странно, я не знаю, почему такой подход не упоминается, так как он позволяет легко создавать незакрашенные пространства имен без перезаписи уже существующих функций (с помощью $.sub()). Кроме того, чтобы это работало, ничего не требуется. Так:
(function($){
$.namespace = $.sub();
$.fn.test = function(){ return 1 };
$.namespace.fn.test = function() { return 2};
})(jQuery);
console.log($('*').test(), $.namespace('*').test());
И ты готов к работе.
В зависимости от того, что вы пытаетесь сделать, архитектура плагина jQuery может быть тем, что вы ищете:
$.fn.myPlugin = function() {
return $(this).each(function() {
// do stuff
});
};
или же...
$.fn.myPlugin = function() {
var myNamespace = {
// your stuff
};
};
на самом деле это зависит от того, что вы пытаетесь сделать.
Проверьте этот блог: http://javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/
самопризывающееся динамическое пространство имен - это то, что я использовал раньше:
var myApp = {};
(function(context) {
var id = 0;
context.next = function() {
return id++;
};
context.reset = function() {
id = 0;
}
})(myApp);
window.console && console.log(
myApp.next(),
myApp.next(),
myApp.reset(),
myApp.next()
); //0, 1, undefined, 0
Благодарю @Diego Fluery, я просто взял его слайд-колоду и сделал прототип работающего кода, но это может сэкономить вам несколько минут, если вы пойдете по этому пути:
<!DOCTYPE html>
<html>
<head>
<script type="application/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script type="application/javascript">
$(document).ready(function() {
(function () {
$.fn.AppRedirect = function() {
this.sendRequest = parts.sendRequest;
this.doRedirect = parts.doRedirect;
return this;
}
var parts = {
doRedirect: function() {
console.log('doRedirect');
},
sendRequest: function() {
console.log('sendRequest');
}
};
})();
$("body").AppRedirect().sendRequest();
$("body").AppRedirect().doRedirect();
});
</script>
</head>
<body>
</body>
</html>
Работа в jQuery 3.6.0
Я знаю, что этот вопрос древний, и этот ответ может не соответствовать точному уровню, которого хотел ОП. Однако теперь пространства имен в jQuery на функциональном уровне упрощены.
Пример:
$("body").off(".myNamespace"); /* prevent duplicate listeners in the namespace */
$("body").on("click.myNamespace", "tr.dtrg-start", function() {
...
}