Skip to content

Commit 3c01d5c

Browse files
author
lthibodeaux
committed
Merge branch 'bind' of git@github.com:lthibodeaux/jquery-ui
2 parents b74d305 + 18038f1 commit 3c01d5c

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

tests/unit/widget/widget_core.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,18 @@ test('merge multiple option arguments', function() {
146146
});
147147
});
148148

149+
function teardownWidget(name) {
150+
delete $.fn[name];
151+
delete $.ui[name];
152+
}
153+
149154
test(".widget() - base", function() {
150155
$.widget("ui.testWidget", {
151156
_create: function() {}
152157
});
153158
var div = $("<div></div>").testWidget()
154159
same(div[0], div.testWidget("widget")[0]);
160+
teardownWidget("testWidget");
155161
});
156162

157163
test(".widget() - overriden", function() {
@@ -163,6 +169,72 @@ test(".widget() - overriden", function() {
163169
}
164170
});
165171
same(wrapper[0], $("<div></div>").testWidget().testWidget("widget")[0]);
172+
teardownWidget("testWidget");
173+
});
174+
175+
test("_bind to element (default)", function() {
176+
expect(12);
177+
var self;
178+
$.widget("ui.testWidget", {
179+
_create: function() {
180+
self = this;
181+
this._bind({
182+
keyup: this.keyup,
183+
keydown: this.keydown
184+
});
185+
},
186+
keyup: function(event) {
187+
equals( self, this );
188+
equals( self.element[0], event.currentTarget );
189+
equals( "keyup", event.type );
190+
},
191+
keydown: function(event) {
192+
equals( self, this );
193+
equals( self.element[0], event.currentTarget );
194+
equals( "keydown", event.type );
195+
}
196+
});
197+
var widget = $("<div></div>").testWidget().trigger("keyup").trigger("keydown");
198+
widget.testWidget("disable").trigger("keyup").trigger("keydown");
199+
widget.testWidget("enable").trigger("keyup").trigger("keydown");
200+
widget.testWidget("destroy").trigger("keyup").trigger("keydown");
201+
teardownWidget("testWidget");
166202
});
167203

204+
test("_bind to descendent", function() {
205+
expect(12);
206+
var self;
207+
$.widget("ui.testWidget", {
208+
_create: function() {
209+
self = this;
210+
this._bind(this.element.find("strong"), {
211+
keyup: this.keyup,
212+
keydown: this.keydown
213+
});
214+
},
215+
keyup: function(event) {
216+
equals( self, this );
217+
equals( self.element.find("strong")[0], event.currentTarget );
218+
equals( "keyup", event.type );
219+
},
220+
keydown: function(event) {
221+
equals( self, this );
222+
equals( self.element.find("strong")[0], event.currentTarget );
223+
equals( "keydown", event.type );
224+
}
225+
});
226+
// trigger events on both widget and descendent to ensure that only descendent receives them
227+
var widget = $("<div><p><strong>hello</strong> world</p></div>").testWidget().trigger("keyup").trigger("keydown");
228+
var descendent = widget.find("strong").trigger("keyup").trigger("keydown");
229+
widget.testWidget("disable").trigger("keyup").trigger("keydown");
230+
descendent.trigger("keyup").trigger("keydown");
231+
widget.testWidget("enable").trigger("keyup").trigger("keydown");
232+
descendent.trigger("keyup").trigger("keydown");
233+
widget.testWidget("destroy").trigger("keyup").trigger("keydown");
234+
descendent.trigger("keyup").trigger("keydown");
235+
teardownWidget("testWidget");
236+
});
237+
238+
// test destroy and disabled
239+
168240
})(jQuery);

ui/jquery.ui.widget.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ $.Widget.prototype = {
140140
this.element.bind( "remove." + this.widgetName, function() {
141141
self.destroy();
142142
});
143+
144+
// used by _bind
145+
this.bindings = $();
143146

144147
this._create();
145148
this._init();
@@ -157,6 +160,8 @@ $.Widget.prototype = {
157160
.removeClass(
158161
this.widgetBaseClass + "-disabled " +
159162
"ui-state-disabled" );
163+
this.bindings
164+
.unbind( "." + this.widgetName );
160165
},
161166

162167
widget: function() {
@@ -206,6 +211,27 @@ $.Widget.prototype = {
206211
disable: function() {
207212
return this._setOption( "disabled", true );
208213
},
214+
215+
_bind: function( element, handlers ) {
216+
// no element argument, shuffle and use this.element
217+
if ( handlers == undefined ) {
218+
handlers = element;
219+
element = this.element;
220+
// if binding to something else then this.element, store for unbinding on destroy
221+
} else {
222+
this.bindings = this.bindings.add( element );
223+
}
224+
var instance = this;
225+
$.each( handlers, function(event, handler) {
226+
element.bind( event + "." + instance.widgetName, function() {
227+
if ( instance.options.disabled ) {
228+
return;
229+
}
230+
return handler.apply( instance, arguments );
231+
});
232+
233+
});
234+
},
209235

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

0 commit comments

Comments
 (0)