Bug Tracker

Ticket #2249 (closed enhancement: fixed)

Opened 1 year ago

Last modified 8 months ago

Addition of "once" event handler

Reported by: bfattori Assigned to: anonymous
Type: enhancement Priority: minor
Milestone: 1.2.4 Component: event
Version: 1.2.2 Keywords: once,one,bind,events
Cc: Needs: Review

Description

The following code will assign an event, and then unbind that event immediately after assignment. Similar in effect to "one", however "one" will unbind all events bound to the type. "once" will only unbind the event passed.

/**
 * Similar in effect to using one() to bind an event to fire once and be
 * removed, however this will only remove the handler you assign.  Any
 * handlers already assigned to the event will not be removed as one() does.
 */
once: function(type, data, fn) {
	return this.each(function(){
		jQuery.event.add( this, type, function(event) {
			jQuery(this).unbind(event, arguments.callee);
			return (fn || data).apply( this, arguments);
		}, data);
	});
}

Attachments

one.diff (454 bytes) - added by flesler 1 year ago.
bfattori's proposal
one+proxy.diff (1.6 kB) - added by flesler 1 year ago.
Should fix the proxy issue, and adds a generic function for jQuery to reuse. Implemented it in jQuery.event.add.
one+diff+toggle.diff (2.8 kB) - added by flesler 1 year ago.
$.proxy moved to $.event.proxy, merged with the 'toggle-with-n-functions' feature. proxy is implemented in toggle as well.

Change History

  Changed 1 year ago by bfattori

Crap... I hate that I cannot edit my ticket! It doesn't unbind after assignment, but after execution

Sheesh... =)

  Changed 1 year ago by flesler

I think this is actually a bug of jQuery, IMO one should only unbind the recently bound function.

Changed 1 year ago by flesler

bfattori's proposal

  Changed 1 year ago by telega

I have one more suggestion about "one" function: currently it isn't possible to unbind function bound using one(), i.e. unbind in the following code doesn't work:

  function test() {
    alert("test");
  }
  $(document).one("click", test);
  $(document).unbind("click", test);

I guess it would be good to have the ability to unbind "one" event handlers.

  Changed 1 year ago by flesler

It might also be used for jQuery.fn._toggle, mapping both (or more) functions, to the bound click handler.

Changed 1 year ago by flesler

Should fix the proxy issue, and adds a generic function for jQuery to reuse. Implemented it in jQuery.event.add.

Changed 1 year ago by flesler

$.proxy moved to $.event.proxy, merged with the 'toggle-with-n-functions' feature. proxy is implemented in toggle as well.

  Changed 1 year ago by flesler

Fixed and implemented $.event.proxy at [5352]

  Changed 1 year ago by joern

  • status changed from new to closed
  • resolution set to fixed

Fixed in [5352].

  Changed 1 year ago by flesler

  • milestone changed from 1.2.3 to 1.2.4

follow-up: ↓ 9   Changed 1 year ago by aheimlich

It seems that the fix for this didn't actually make it into v1.2.4, so I'd suggest changing the milestone to avoid confusing others like myself (who actually that this was fixed in v1.2.4).

in reply to: ↑ 8   Changed 1 year ago by aheimlich

Replying to aheimlich:

(who actually that this was fixed in v1.2.4).

duurrrr....

That should have been: (who actually thought that this was fixed in v1.2.4).

Note: See TracTickets for help on using tickets.