Opened 13 years ago
Closed 13 years ago
#5834 closed bug (fixed)
event.special namespacing bug
Reported by: | cowboy | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 1.4.1 |
Component: | event | Version: | 1.4 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
Perhaps I'm missing something, but an jQuery.event.special add
method returns a function, namespacing no longer works.
This image represents what "should" work, but notice that namespacing seems to have no effect when triggering or unbinding: http://benalman.com/grab/150c27.png
If add
doesn't return a function, namespacing seems to work.. but of course the event object is no longer being augmented:
http://benalman.com/grab/ac7431.png
Here is the code I used to test all this:
console.log( $.fn.jquery ); var i = 0; jQuery.event.special.myevent = { setup: function(){ console.log( 'setup', this.tagName, [].slice.call( arguments ) ); }, teardown: function(){ console.log( 'teardown', this.tagName, [].slice.call( arguments ) ); }, add: function( handler, data, namespaces ){ console.log( 'add', this.tagName, [].slice.call( arguments ) ); return; // NAMESPACING ONLY WORKS IF I RETURN HERE return function(e){ e.data = data; e.xyz = ++i; handler.apply( this, arguments ); } }, remove: function(){ console.log( 'remove', this.tagName, [].slice.call( arguments ) ); } }; function a(e){ console.log( 'a', e.xyz, e.data ); } function b(e){ console.log( 'b', e.xyz, e.data ); } function bc(e){ console.log( 'bc', e.xyz, e.data ); } var elem = $('body'); elem.bind( 'myevent.a', {x:1}, a); elem.trigger( 'myevent' ); elem.trigger( 'myevent.a' ); elem.bind( 'myevent.b', {y:2}, b); elem.trigger( 'myevent' ); elem.trigger( 'myevent.b' ); elem.bind( 'myevent.b.c', {z:3}, bc); elem.trigger( 'myevent' ); elem.trigger( 'myevent.b' ); elem.trigger( 'myevent.b.c' ); elem.unbind( 'myevent.a' ); elem.trigger( 'myevent' ); elem.unbind( 'myevent', b ); elem.trigger( 'myevent' ); elem.unbind( 'myevent.b.c' ); elem.trigger( 'myevent' );
On a separate but related note, when the add
"function return" is used to augment the event object, is there any way to automatically propagate event.data? It feels like an unnecessary "extra" step to me.
Change History (2)
comment:1 Changed 13 years ago by
comment:2 Changed 13 years ago by
Component: | unfilled → event |
---|---|
Resolution: | → fixed |
Status: | new → closed |
Both points fixed - you no longer have to copy over data anymore. http://github.com/jquery/jquery/commit/390186b902c4c1ac13e23754d33ed4d8b3d5fa38
And in case this is reviewed by someone who isn't super familiar with jQuery.event.special, I've been working on an article explaining a bit about how Special Events work. This screenshot may help explain what the expected behavior of the setup, teardown, add and remove methods should be:
http://benalman.com/grab/7d7089.png
(*please* correct me if I've made any mistakes!)