Расширение базового функционала jquery-ui-виджетов
Захотелось сделать более правильную работу с триггерением/навешиванием обработчиков на события, чем это реализовано в jquery-ui.
При этом сам функционал надоело копировать из виджета в виджет.
В общем, вот простой добавить методы к своим виджетам:
(function( $ )
{
"use strict";
/**
* расширение базового функционала jquery-ui
*/
$.widget( "my.my_extension", {
_triggerSmart: function( EventName, Data )
{
var me = this;
var $me = $( me.element );
$me.trigger( EventName + '.' + me.widgetName, Data );
return me;
},
_bindSmart: function( EventName, Handler )
{
var me = this;
var $me = $( me.element );
// боремся с повторным навешиванием обработчика
var events = $.data( $me.get( 0 ), 'events' );
var filteredEvents = [];
if ( EventName in events )
{
filteredEvents = $.grep( events[EventName], function( Event ) {
return Event.type == EventName && Event.namespace == me.widgetName;
} );
}
if ( ! filteredEvents.length ) {
$me.bind( EventName + '.' + me.widgetName, Handler );
}
return me;
}
} );
}( jQuery ));
Потом для каждого виджета нужно будет указать опциональный второй параметр
$.widget( "my.fast_search", $.my.my_extension,
{
options:
{
...
Внимание нужно обратить на второй параметр $.my.my_extension, который в принципе предназначен для расширения функционала работающего виджета, но отлично работает и для того, чтобы унаследовать некие базовые методы в виджеты.
Сначала начал делать через
$.extend( $.widget.prototype, {
...
} );
но понял, что выигрыш в производительности будет слишком условным (из-за того, что при способе с прототипом методы копируются в память один раз, а не для каждого виджета), а простота реализованного способа — сильный профит.
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.