Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery.data no longer works with window?

I recently upgraded our project's jQuery file from 1.4.2 to 1.4.4 and it appears that as of 1.4.3 the way we have been using jQuery.data has stopped working.

We have this code:

var events = $(window).data('events');

if (events.scroll)
if (!events.scroll.include(handler))
  $(window).scroll(handler);

the purpose is to prevent this particular handler from being bound multiple times.

In 1.4.2, this works fine. In 1.4.4, events is undefined.

function handler() {
  //do something
}

$(document).ready(function(){
  $(window).scroll(handler);
  $('div#test').scroll(handler);

  $(window).data('events') -> undefined
  $('div#test').data('events') -> Object
});

What changed with this API? How should I list events for window?


I have changed the first line to this:

var events = $(window).data('__events__').events;

a bit messy-looking, but the ability to wire events to plain objects is compelling.

like image 394
Adam Lassek Avatar asked Dec 02 '10 02:12

Adam Lassek


People also ask

What is data() in jQuery?

The data() is an inbuilt method in jQuery which is used to attach data or get data for the selected elements. Syntax: $(selector). data(para1); Parameter : It accepts an optional parameter “para1” which specifies the name of the data to retrieve for the selected element.

What does Window do in jQuery?

Definition of jQuery window. jQuery window object represents an open window in the browser. The window object is automatically created by the browser. Suppose our documents contain multiple frames, then the browser creates one window object for the HTML document and creates additional window objects for each frame.

How pass data attribute value in jQuery?

$('selector expression'). attr('name','value'); First of all, specify a selector to get the reference of an element and call attr() method with attribute name parameter. To set the value of an attribute, pass value parameter along with name parameter.

How add data attribute in jQuery?

Alternatively, you can also use the jQuery data() method (jQuery version >= 1.4. 3), to get the data-attribute of an element using the syntax like $(element). data(key) . That means in the above example to get the data-id using data() method you can use the statement like $(this).


2 Answers

There was a change in jQuery 1.4.3+ for event types, to avoid object name collisions, for window (or any other plain object) use the key "__events__" instead, like this:

var events = $(window).data('__events__');

The same __events__ key is used for any objects that don't have a .nodeType property (which window doesn't, so it's treated like a plain object here).


To be clear that this was a conscious, intentional change, it's included in the jQuery 1.4.3 release notes:

JavaScript Objects
A number of changes were made to when .data() is used on JavaScript objects (or, more accurately, anything that isn’t a DOM node). To start whenever you set data on a JavaScript object the data is set directly on the object – instead of going into the internal data object store. Additionally events that are attached to objects are put in a new __events__ property that is actually a function. This was done to allow events to be attached directly to an object, be garbage collected when the object is collected, and not be serialized by a JSON serializer. These changes should make jQuery’s data and event systems much more useful on JavaScript objects.

like image 109
Nick Craver Avatar answered Sep 23 '22 03:09

Nick Craver


The basic API still seems to work.

However, it doesn't seem to work on the window.

So, the API for accessing jQuery-assigned events hasn't really changed; it just no longer applies to the window. That doesn't exactly sound like an intentional decision, and the 1.4.3 -> 1.4.4 changelog makes no mention of it.

Sounds like a bug, and it might have to do with the recent changes to data now being able to access HTML5 data- attributes. Consider filing a ticket for it :/

like image 25
Matchu Avatar answered Sep 23 '22 03:09

Matchu