Bug Tracker

Opened 12 years ago

Closed 12 years ago

#8791 closed bug (invalid)

Event data being overwritten

Reported by: davestein Owned by:
Priority: undecided Milestone: 1.next
Component: event Version: 1.5.1
Keywords: Cc:
Blocked by: Blocking:


If I have two binds of the same type to the same element, with different object data, future callbacks have data from the wrong bind.

jsfiddle doesn't have 1.5.2 yet so I tested officially on 1.5.1 and I don't see a fix for this in changelog in 1.5.2.


Change History (10)

comment:1 Changed 12 years ago by scottgonzalez

I'm not sure this can be considered a bug, but I'm interested to see what happens with this for two reasons. It's related to my request for a single event object to be used all the time (which was determined not to be feasible) and it's delaying use of an event (which isn't fully supported - #7278).

comment:2 Changed 12 years ago by Rick Waldron

Component: unfiledevent
Resolution: worksforme
Status: newclosed

comment:3 Changed 12 years ago by Rick Waldron

@scott.gonzalez What about this: https://github.com/jquery/jquery/pull/301 ?

comment:4 Changed 12 years ago by anonymous

Just loaded 1.5.2 on my site and am still experiencing. I'll keep checking for Fiddle to update the versions to go there too.

The settimeout in my fiddle is simulating that I have local functions inside the one that grabs e. I don't need to reference e again until another click later on.

comment:5 Changed 12 years ago by DaveStein

I don't understand why it's closed and working for you. The example in your fiddle is very different than mine. I can write another more complicated fiddle, without using setTimeout, that will show the error.

( Didn't mean to post as anon last time. Can't remember my login and forgot password isn't ending up in my mail. )

comment:6 Changed 12 years ago by DaveStein

http://jsfiddle.net/davestein/q9Rjq/10/ Here is my fiddle that doesn't use setTimeout yet there is still an issue.

And as Scott points out the event is NOT being lost, just the property of data : http://jsfiddle.net/q9Rjq/9/

It's weird that everything stays but that becomes undefined.

comment:7 Changed 12 years ago by scottgonzalez

Think about it this way: Events are just objects. If you pass the same object to several functions, any of those functions can modify properties on that object. If one of those functions happens to hold on to a reference to that object, that won't prevent other functions from modifying its properties. That's exactly what's happening here. There's nothing special about the data property. jQuery can potentially change it on every handler invocation. If you care about the data being "protected" you should put it in a closure and bind your event handler in the same closure.

comment:8 Changed 12 years ago by DaveStein

Okay after digging through how everything is done in the jQuery source, I see how it's not a bug and impossible to do what I was suggesting.

Sorry for the trouble.

comment:9 Changed 12 years ago by dmethvin

Resolution: worksforme
Status: closedreopened

comment:10 Changed 12 years ago by dmethvin

Resolution: invalid
Status: reopenedclosed

For accounting purposes I'm going to close this as invalid. It's not okay to use the Event object past an event handler's lifetime for reason #7278 among others.

Note: See TracTickets for help on using tickets.