Jump to content
  • 0

Можно ли так использовать DOM?


mishka
 Share

Question

Может название темы и не информативно, но лучше не придумал.

Пишу плагин на jQuery.

Использую такой подход:

jQuery ( function () {
var obj = jQuery ( '#obj' ).functionName ({
// свои значения, если отличны от дэфолтных
})

// при каком-то событии нужно этот obj остановить

event = function () { // образно покажу событие
obj.stop ()
}

// минус подхода - obj доступно только внутри этой функции
})
;(function($){
$.fn.functionName = function ( options ) {
return this.each ( function () {
new FunctionName ( this, options );
});
};
function FunctionName ( context, options ) {
this.defaults = {
// дефолтные значения
};
$.extend ( true, this.defaults, options );
this.init ( context );
}

FunctionName.prototype = {
init: function ( context, options ) {
// что-то выполняем
},
stop: function () {
// что-то выполняем
}
}
}(jQuery));

Есть еще вариант:

jQuery ( function () {
jQuery ( '#obj' ).functionName ({
// свои значения, если отличны от дэфолтных
})

// при каком-то событии нужно этот obj остановить

event = function () { // образно покажу событие
document.getElementById ( 'obj' ).functionName.stop () // "достать" можно практичесски с любого места
}
// минусов пока не вижу, вот хочу узнать
})
;(function($){
$.fn.functionName = function ( options ) {
return this.each ( function () {
new FunctionName ( this, options );
});
};
function FunctionName ( context, options ) {
this.defaults = {
// дефолтные значения
};
$.extend ( true, this.defaults, options );
this.init ( context );
}

FunctionName.prototype = {
init: function ( context, options ) {
context.FunctionName = this // присвоим этот объект самой ноде
// что-то выполняем
},
stop: function () {
// что-то выполняем
}
}
}(jQuery));

Какие негативные последствия обеих подходов, какой из них лучше?

Есть ли что-то лучше?

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Пишу плагин на jQuery.

Использую такой подход:

Какие негативные последствия обеих подходов, какой из них лучше?

Есть ли что-то лучше?

Для начала давай определимся, какую задачу ты решаешь. Без этой информации трудно оценить качество подходов.

Я хоть и ни разу не написал ни одного из плагинов jQuery, могу сходу сказать, что DOM в jq является грязным хаком. Лучше не использовать такие фишки вообще. Чем ближе код плана к стилю самого jq - тем лучше. Если концепция плагина не вписывается в концепцию jq, то лучше не использовать jq вовсе. Иначе мысли всегда только абстракциями jq.

  • Like 1
Link to comment
Share on other sites

  • 0

Делал я счетчик обратного отсчета на чистом. И вот чтобы везде иметь доступ к его методам, я просто прицепил его к ноде, и тогда в любом месте кода, через саму ноду я мог его остановить, запустить, сбросить.

Вот подумал что и в jq тоже будет неплохо так писать плагины.

Для jq можно юзать data().

Как пример в jscrollpane можно обновлять кастомный скролл, например после добавления контента в блок со скроллом. Там это реализованно с помощью jq, так:


var api = jQuery ( '#scrollarea' ).data ( 'jsp' )

и тогда в любом месте есть доступ к этому кастом скроллу:
api.reinitialise(); - обновить скролл, и он пересчитается в случае изменения колличества контента.

По твоим словам я понял что для чистого лучше юзать ноду, а вот для jq - data()?

Link to comment
Share on other sites

  • 0

Делал я счетчик обратного отсчета на чистом. И вот чтобы везде иметь доступ к его методам, я просто прицепил его к ноде, и тогда в любом месте кода, через саму ноду я мог его остановить, запустить, сбросить.

Вот подумал что и в jq тоже будет неплохо так писать плагины.

На чистом сделал правильно.

На jq нужно использовать только методы самого jq, и желательно стараться использовать только объект jq для хранения всех данных плагина, не в нодах.

Поясняю почему. В jq работа ведется только с методами самой библиотеки, DOM там лепится уже сбоку. Поэтому, если перенести все на DOM, то гораздо тяжелее будет доступ к данным, управление этими данными, больше всяких замыканий, утечек. Например, сработал селектор, но возвращает он не ноды, а массив объектов jq. Чтобы достучаться до настроек в ноде, нужны дополнительные телодвижения.

По твоим словам я понял что для чистого лучше юзать ноду, а вот для jq - data()?

Именно!

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy