Как сделать плагин jQuery в виде объекта?
Ну, название темы, может быть, сформулировано коряво. Но ниже подробности.
Принцип в голове таков: делается объект, к примеру:
var plugin = {
name: "plugin",
__init: function(){...},
foo: function(){...}
}
Потом этот объект становится частью jQuery (не знаю, как). Гуглеж дает только начальные принципы создания плагинов. Вобщем смысл примерно таков: хочу объект сделать частью jQuery, чтобы без самого объекта его методы и свойства нельзя было вызывать.
$("...").plugin.__init(); // Нет ошибки
$("...").__init(); // Ошибка, метод не является частью jQuery.
Вот так. Если что-то не понятно (а с моим описанием, наверняка многое не понятно), спрашивайте - объясню :) |
(function($){
var name="youPlug";
$.fn[name]=function(options){
//получим ссылку на контейнер
var container=$(this);
//если в контейнере это плагина нет, тогда создадим новый экземпляр
if (!container.data(name)){
//создаём плагин
var f=function(){
//здесь вы можете разместить приватные функции и переменные
// return возвращает обьект с публичными свойствами
return {
// напишем какойнибудь демонстрационный код
msg:options.msg,
test:function(){
alert(this.msg);
}
}
}
//сохраним плагин в data
container.data(name,f());
}
//если плагин есть, то возвращаем уже созданный экземпляр
else {
return container.data(name);
}
}
})(jQuery);
//эксперемент
$(function(){
$("#test").youPlug({msg:"привет"}); //создаём плагин
$("#test").youPlug().test(); //вызываем метод плагина //alert("привет")
})
|
Цитата:
jQuery.fn.plugin = plugin; |
Цитата:
2 DjDiablo: спасибо большое, решение развернутое и понятное :) |
Цитата:
|
2 melky: нужно, чтобы в объекте хранился объект jQuery и потом передавался всем методам объекта. Как-то так...
|
Непонятно, чем вас не устраивает официальная документация по написанию плагинов для jQuery? Она довольно подробна. Если вы хотите писать плагин, то и пишите его по существующим правилам, не надо придумывать свои.
|
Цитата:
Придумывайте свои правила, делайте нестандартно, делайте оригинально, далайте быстрее других, делайте надёжнее других, делайте мощнее чем у других, не стойте на месте, работайте на опережение. |
Это можно сказать опытному человеку, т.к. он сделает хоть и по своему, но правильно и понятно для других. А вот начинающие в таком случае понаписывают такого, что захочется им оторвать жопу...
|
Цитата:
(function($){
var name="youPlug";
$.fn[name]=function(options){
return this.each(function() { // проходим по всем элементам
//получим ссылку на контейнер
var container=$(this);
// ...............
});
}
})(jQuery);
Хотя в вашем случае будет работать и так как у вас, так как вы не юзаете свойства отдельных элементов. |
Цитата:
насчёт второго :
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<script>
jQuery.fn.init.prototype.foo = { bar: "ok" };
alert( $().foo.bar );
</script>
Цитата:
Цитата:
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<p>TEST</p>
<script>
jQuery.fn.colorchangers = {
toRed: function() {
// JQ-объект (контекст) хранится в свойстве _this
// this - это объект, который щас описываем.
return this._this.css("color", "red");
},
randomColors: ["green", "aqua", "lime"],
toRandom: function(){
// т.к. this равен объекту colorchangers, то может обратиться к его свойствам
var randomColor = this.randomColors[Math.floor(Math.random()*this.randomColors.length)];
return this._this.css("color", randomColor);
}
};
// тут вся магия
function createGetter(propName) {
// упс, нет такого объекта
if (typeof jQuery.fn[propName] != "object") {
return $.error("Указанное имя свойства "+propName+" не является объектом");
}
// наследование проходится в курсе молого бойца.
var F = function(){};
F.prototype = jQuery.fn[propName];
// делаем из объекта геттер.
jQuery.fn[propName] = function() {
// чтобы каждый раз не создавать, сохраним его.
var fresh = this.data(propName+"_getter");
// если не сохранён, создаём и сохраняем
if (!fresh) {
fresh = new F();
this.data(propName+"_getter", fresh);
}
// сохраняем\изменяем контекст - в любой момент он может измениться - добавиться элементы и т.д.
fresh._this = this;
return fresh;
};
}
// колдуем ...
createGetter("colorchangers");
// тестим
var test = $("p");
test.colorchangers().toRed();
</script>
<div>TEST_2</div>
<script>
setTimeout(function() {
// изменим объект JQ и ещё затестим
test = test.add("div");
test.colorchangers().toRandom();
}, 800);
</script>
Цитата:
PS послезавтра экзамен по философии. могу бредить :) |
Devote - спасибо, перебор хоть и нужен не всегда,
но в том случае который я имел ввиду он и вправду нужен, я забыл про него просто напросто. melky Это не утопия, это вроде бы как гипербола :) в общем стилистическая фигура явного и намеренного преувеличения, имеющего целью усиление выразительности :D Цитата:
А не лучше ли уж тогда вместо propName, сразу обьект передавать ?
<script src="http://code.jquery.com/jquery-1.7.2.js"></script>
<p>TEST</p>
<script>
// тут вся магия (бывший метод createGetter)
jQuery.createPlugin=function (propName,obj) {
// наследование проходится в курсе молого бойца.
var F = function(){};
F.prototype = obj;
// делаем из объекта геттер.
jQuery.fn[propName] = function() {
// чтобы каждый раз не создавать, сохраним его.
var fresh = this.data(propName+"_getter");
// если не сохранён, создаём и сохраняем
if (!fresh) {
fresh = new F();
this.data(propName+"_getter", fresh);
}
// сохраняем\изменяем контекст - в любой момент он может измениться - добавиться элементы и т.д.
fresh._this = this;
return fresh;
};
}
// колдуем ...
jQuery.createPlugin("colorchangers",{
toRed: function() {
// JQ-объект (контекст) хранится в свойстве _this
// this - это объект, который щас описываем.
return this._this.css("color", "red");
},
randomColors: ["green", "aqua", "lime"],
toRandom: function(){
// т.к. this равен объекту colorchangers, то может обратиться к его свойствам
var randomColor = this.randomColors[Math.floor(Math.random()*this.randomColors.length)];
return this._this.css("color", randomColor);
}
});
// тестим
var test = $("p");
test.colorchangers().toRed();
</script>
<div>TEST_2</div>
<script>
setTimeout(function() {
// изменим объект JQ и ещё затестим
test = test.add("div");
test.colorchangers().toRandom();
}, 800);
</script>
|
Цитата:
|
| Часовой пояс GMT +3, время: 10:15. |