jQuery.fn.extend({
data: function( key, value ) {
- var parts, part, attr, name, l,
+ var attrs, name,
elem = this[0],
i = 0,
data = null;
data = jQuery.data( elem );
if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
- attr = elem.attributes;
- for ( l = attr.length; i < l; i++ ) {
- name = attr[i].name;
+ attrs = elem.attributes;
+ for ( ; i < attrs.length; i++ ) {
+ name = attrs[i].name;
if ( !name.indexOf( "data-" ) ) {
name = jQuery.camelCase( name.substring(5) );
});
}
- parts = key.split( ".", 2 );
- parts[1] = parts[1] ? "." + parts[1] : "";
- part = parts[1] + "!";
-
return jQuery.access( this, function( value ) {
if ( value === undefined ) {
- data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
// Try to fetch any internally stored data first
- if ( data === undefined && elem ) {
- data = jQuery.data( elem, key );
- data = dataAttr( elem, key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
+ return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
}
- parts[1] = value;
this.each(function() {
- var self = jQuery( this );
-
- self.triggerHandler( "setData" + part, parts );
jQuery.data( this, key, value );
- self.triggerHandler( "changeData" + part, parts );
});
}, null, value, arguments.length > 1, null, false );
},
});
test(".data(String) and .data(String, Object)", function() {
- expect(29);
+ expect( 12 );
var parent = jQuery("<div><div></div></div>"),
div = parent.children();
- parent
- .bind("getData", function(){ ok( false, "getData bubbled." ); })
- .bind("setData", function(){ ok( false, "setData bubbled." ); })
- .bind("changeData", function(){ ok( false, "changeData bubbled." ); });
-
ok( div.data("test") === undefined, "Check for no data exists" );
div.data("test", "success");
ok( div.data("notexist") === undefined, "Check for no data exists" );
- div.data("test", "overwritten");
- var hits = {test:0}, gets = {test:0}, changes = {test:0, value:null};
-
-
- function logChangeData(e,key,value) {
- var dataKey = key;
- if ( e.namespace ) {
- dataKey = dataKey + "." + e.namespace;
- }
- changes[key] += value;
- changes.value = jQuery.data(e.target, dataKey);
- }
-
- div
- .bind("setData",function(e,key,value){ hits[key] += value; })
- .bind("setData.foo",function(e,key,value){ hits[key] += value; })
- .bind("changeData",logChangeData)
- .bind("changeData.foo",logChangeData)
- .bind("getData",function(e,key){ gets[key] += 1; })
- .bind("getData.foo",function(e,key){ gets[key] += 3; });
-
- div.data("test.foo", 2);
- equal( div.data("test"), "overwritten", "Check for original data" );
- equal( div.data("test.foo"), 2, "Check for namespaced data" );
- equal( div.data("test.bar"), "overwritten", "Check for unmatched namespace" );
- equal( hits.test, 2, "Check triggered setter functions" );
- equal( gets.test, 5, "Check triggered getter functions" );
- equal( changes.test, 2, "Check sets raise changeData");
- equal( changes.value, 2, "Check changeData after data has been set" );
-
- hits.test = 0;
- gets.test = 0;
- changes.test = 0;
- changes.value = null;
-
- div.data("test", 1);
- equal( div.data("test"), 1, "Check for original data" );
- equal( div.data("test.foo"), 2, "Check for namespaced data" );
- equal( div.data("test.bar"), 1, "Check for unmatched namespace" );
- equal( hits.test, 1, "Check triggered setter functions" );
- equal( gets.test, 5, "Check triggered getter functions" );
- equal( changes.test, 1, "Check sets raise changeData" );
- equal( changes.value, 1, "Check changeData after data has been set" );
-
- div
- .bind("getData",function(e,key){ return key + "root"; })
- .bind("getData.foo",function(e,key){ return key + "foo"; });
-
- equal( div.data("test"), "testroot", "Check for original data" );
- equal( div.data("test.foo"), "testfoo", "Check for namespaced data" );
- equal( div.data("test.bar"), "testroot", "Check for unmatched namespace" );
-
// #3748
var $elem = jQuery({exists:true});
equal( $elem.data("nothing"), undefined, "Non-existent data returns undefined");