Skip to content

Commit 659db70

Browse files
committed
Widget: Added ._bind() for easily binding events with correct context and disabled checking. Pretty much a direct copy from the previous bind branch.
1 parent 67b070f commit 659db70

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

tests/unit/widget/widget_core.js

+93
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,99 @@ test( ".widget() - overriden", function() {
404404
same( wrapper[0], $( "<div></div>" ).testWidget().testWidget( "widget" )[0] );
405405
});
406406

407+
test( "_bind to element (default)", function() {
408+
expect( 12 );
409+
var self;
410+
$.widget( "ui.testWidget", {
411+
_create: function() {
412+
self = this;
413+
this._bind({
414+
keyup: this.keyup,
415+
keydown: this.keydown
416+
});
417+
},
418+
keyup: function( event ) {
419+
equals( self, this );
420+
equals( self.element[0], event.currentTarget );
421+
equals( "keyup", event.type );
422+
},
423+
keydown: function( event ) {
424+
equals( self, this );
425+
equals( self.element[0], event.currentTarget );
426+
equals( "keydown", event.type );
427+
}
428+
});
429+
var widget = $( "<div></div>" )
430+
.testWidget()
431+
.trigger( "keyup" )
432+
.trigger( "keydown" );
433+
widget
434+
.testWidget( "disable" )
435+
.trigger( "keyup" )
436+
.trigger( "keydown" );
437+
widget
438+
.testWidget( "enable" )
439+
.trigger( "keyup" )
440+
.trigger( "keydown" );
441+
widget
442+
.testWidget( "destroy" )
443+
.trigger( "keyup" )
444+
.trigger( "keydown" );
445+
});
446+
447+
test( "_bind to descendent", function() {
448+
expect( 12 );
449+
var self;
450+
$.widget( "ui.testWidget", {
451+
_create: function() {
452+
self = this;
453+
this._bind( this.element.find( "strong" ), {
454+
keyup: this.keyup,
455+
keydown: this.keydown
456+
});
457+
},
458+
keyup: function( event ) {
459+
equals( self, this );
460+
equals( self.element.find( "strong" )[0], event.currentTarget );
461+
equals( "keyup", event.type );
462+
},
463+
keydown: function(event) {
464+
equals( self, this );
465+
equals( self.element.find( "strong" )[0], event.currentTarget );
466+
equals( "keydown", event.type );
467+
}
468+
});
469+
// trigger events on both widget and descendent to ensure that only descendent receives them
470+
var widget = $( "<div><p><strong>hello</strong> world</p></div>" )
471+
.testWidget()
472+
.trigger( "keyup" )
473+
.trigger( "keydown" );
474+
var descendent = widget.find( "strong" )
475+
.trigger( "keyup" )
476+
.trigger( "keydown" );
477+
widget
478+
.testWidget( "disable" )
479+
.trigger( "keyup" )
480+
.trigger( "keydown" );
481+
descendent
482+
.trigger( "keyup" )
483+
.trigger( "keydown" );
484+
widget
485+
.testWidget( "enable" )
486+
.trigger( "keyup" )
487+
.trigger( "keydown" );
488+
descendent
489+
.trigger( "keyup" )
490+
.trigger( "keydown" );
491+
widget
492+
.testWidget( "destroy" )
493+
.trigger( "keyup" )
494+
.trigger( "keydown" );
495+
descendent
496+
.trigger( "keyup" )
497+
.trigger( "keydown" );
498+
});
499+
407500
test( "._trigger() - no event, no ui", function() {
408501
expect( 7 );
409502
var handlers = [];

ui/jquery.ui.widget.js

+22
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ $.Widget.prototype = {
129129
this._getCreateOptions(),
130130
options );
131131

132+
this.bindings = $();
133+
132134
var self = this;
133135
this.element.bind( "remove." + this.widgetName, function() {
134136
self.destroy();
@@ -162,6 +164,7 @@ $.Widget.prototype = {
162164
.removeClass(
163165
this.widgetBaseClass + "-disabled " +
164166
"ui-state-disabled" );
167+
this.bindings.unbind( "." + this.widgetName );
165168
},
166169
_destroy: $.noop,
167170

@@ -216,6 +219,25 @@ $.Widget.prototype = {
216219
return this._setOption( "disabled", true );
217220
},
218221

222+
_bind: function( element, handlers ) {
223+
// no element argument, shuffle and use this.element
224+
if ( !handlers ) {
225+
handlers = element;
226+
element = this.element;
227+
} else {
228+
this.bindings = this.bindings.add( element );
229+
}
230+
var instance = this;
231+
$.each( handlers, function( event, handler ) {
232+
element.bind( event + "." + instance.widgetName, function() {
233+
if ( instance.options.disabled ) {
234+
return;
235+
}
236+
return handler.apply( instance, arguments );
237+
});
238+
});
239+
},
240+
219241
_trigger: function( type, event, data ) {
220242
var callback = this.options[ type ];
221243

0 commit comments

Comments
 (0)