Skip to content

Commit 1f2f0f8

Browse files
committed
Unit tests and implementation for $.Widget.prototype._bind, handling instance-scope for handlers, options.disabled and unbinding on destroy
1 parent 4226fae commit 1f2f0f8

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

tests/unit/widget/widget_core.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,4 +529,65 @@ test( "auto-destroy - .detach()", function() {
529529
$( "#widget" ).testWidget().detach();
530530
});
531531

532+
test("_bind to element (default)", function() {
533+
expect(12);
534+
var self;
535+
$.widget("ui.testWidget", {
536+
_create: function() {
537+
self = this;
538+
this._bind({
539+
keyup: this.keyup,
540+
keydown: this.keydown
541+
});
542+
},
543+
keyup: function(event) {
544+
equals( self, this );
545+
equals( self.element[0], event.currentTarget );
546+
equals( "keyup", event.type );
547+
},
548+
keydown: function(event) {
549+
equals( self, this );
550+
equals( self.element[0], event.currentTarget );
551+
equals( "keydown", event.type );
552+
}
553+
});
554+
var widget = $("<div></div>").testWidget().trigger("keyup").trigger("keydown");
555+
widget.testWidget("disable").trigger("keyup").trigger("keydown");
556+
widget.testWidget("enable").trigger("keyup").trigger("keydown");
557+
widget.testWidget("destroy").trigger("keyup").trigger("keydown");
558+
});
559+
560+
test("_bind to descendent", function() {
561+
expect(12);
562+
var self;
563+
$.widget("ui.testWidget", {
564+
_create: function() {
565+
self = this;
566+
this._bind(this.element.find("strong"), {
567+
keyup: this.keyup,
568+
keydown: this.keydown
569+
});
570+
},
571+
keyup: function(event) {
572+
equals( self, this );
573+
equals( self.element.find("strong")[0], event.currentTarget );
574+
equals( "keyup", event.type );
575+
},
576+
keydown: function(event) {
577+
equals( self, this );
578+
equals( self.element.find("strong")[0], event.currentTarget );
579+
equals( "keydown", event.type );
580+
}
581+
});
582+
// trigger events on both widget and descendent to ensure that only descendent receives them
583+
var widget = $("<div><p><strong>hello</strong> world</p></div>").testWidget().trigger("keyup").trigger("keydown");
584+
var descendent = widget.find("strong").trigger("keyup").trigger("keydown");
585+
widget.testWidget("disable").trigger("keyup").trigger("keydown");
586+
descendent.trigger("keyup").trigger("keydown");
587+
widget.testWidget("enable").trigger("keyup").trigger("keydown");
588+
descendent.trigger("keyup").trigger("keydown");
589+
widget.testWidget("destroy").trigger("keyup").trigger("keydown");
590+
descendent.trigger("keyup").trigger("keydown");
591+
});
592+
532593
})( jQuery );

ui/jquery.ui.widget.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ $.Widget.prototype = {
156156
this.element.bind( "remove." + this.widgetName, function() {
157157
self.destroy();
158158
});
159+
160+
// used by _bind
161+
this.bindings = $();
159162

160163
this._create();
161164
this._trigger( "create" );
@@ -177,6 +180,8 @@ $.Widget.prototype = {
177180
.removeClass(
178181
this.widgetBaseClass + "-disabled " +
179182
"ui-state-disabled" );
183+
this.bindings
184+
.unbind( "." + this.widgetName );
180185
},
181186

182187
widget: function() {
@@ -231,6 +236,27 @@ $.Widget.prototype = {
231236
disable: function() {
232237
return this._setOption( "disabled", true );
233238
},
239+
240+
_bind: function( element, handlers ) {
241+
// no element argument, shuffle and use this.element
242+
if ( handlers == undefined ) {
243+
handlers = element;
244+
element = this.element;
245+
// if binding to something else then this.element, store for unbinding on destroy
246+
} else {
247+
this.bindings = this.bindings.add( element );
248+
}
249+
var instance = this;
250+
$.each( handlers, function(event, handler) {
251+
element.bind( event + "." + instance.widgetName, function() {
252+
if ( instance.options.disabled ) {
253+
return;
254+
}
255+
return handler.apply( instance, arguments );
256+
});
257+
258+
});
259+
},
234260

235261
_trigger: function( type, event, data ) {
236262
var callback = this.options[ type ];

0 commit comments

Comments
 (0)