From b0c7df65d0f92b77752e8f9b33898d0e3b2c05e8 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sun, 3 Feb 2008 18:43:04 +0000 Subject: [PATCH] You can now overwrite values returned from .data() with .bind("getData") - returning a value will override any bound value on that element. --- src/core.js | 17 ++++++++++------- test/unit/core.js | 24 ++++++++++++++++++++---- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/core.js b/src/core.js index 6997f8907..efc654fb4 100644 --- a/src/core.js +++ b/src/core.js @@ -480,16 +480,19 @@ jQuery.fn = jQuery.prototype = { data: function( key, value ){ var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; if ( value == null ) { - if ( this.length ) { - var data = jQuery.data( this[0], key ); - return data == null ? - jQuery.data( this[0], parts[0] ) : - data; - } + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + if ( data == undefined && this.length ) + data = jQuery.data( this[0], key ); + + return data == null && parts[1] ? + this.data( parts[0] ) : + data; } else - return this.trigger("setData" + (parts[1] ? "." + parts[1] : "") + "!", [parts[0], value]).each(function(){ + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ jQuery.data( this, key, value ); }); }, diff --git a/test/unit/core.js b/test/unit/core.js index 3ca1e9510..3cb90aa78 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -1398,7 +1398,7 @@ test("$.data", function() { }); test(".data()", function() { - expect(11); + expect(16); var div = $("#foo"); ok( div.data("test") == undefined, "Check for no data exists" ); div.data("test", "success"); @@ -1406,25 +1406,41 @@ test(".data()", function() { div.data("test", "overwritten"); ok( div.data("test") == "overwritten", "Check for overwritten data" ); - var hits = {test:0}; + var hits = {test:0}, gets = {test:0}; div .bind("setData",function(e,key,value){ hits[key] += value; }) .bind("setData.foo",function(e,key,value){ hits[key] += value; }) + .bind("getData",function(e,key){ gets[key] += 1; }) + .bind("getData.foo",function(e,key){ gets[key] += 3; }); div.data("test.foo", 2); ok( div.data("test") == "overwritten", "Check for original data" ); ok( div.data("test.foo") == 2, "Check for namespaced data" ); ok( div.data("test.bar") == "overwritten", "Check for unmatched namespace" ); - ok( hits.test == 2, "Check triggered functions" ); + equals( hits.test, 2, "Check triggered setter functions" ); + equals( gets.test, 5, "Check triggered getter functions" ); hits.test = 0; + gets.test = 0; div.data("test", 1); ok( div.data("test") == 1, "Check for original data" ); ok( div.data("test.foo") == 2, "Check for namespaced data" ); ok( div.data("test.bar") == 1, "Check for unmatched namespace" ); - ok( hits.test == 1, "Check triggered functions" ); + equals( hits.test, 1, "Check triggered setter functions" ); + equals( gets.test, 5, "Check triggered getter functions" ); + + hits.test = 0; + gets.test = 0; + + div + .bind("getData",function(e,key){ return key + "root"; }) + .bind("getData.foo",function(e,key){ return key + "foo"; }); + + ok( div.data("test") == "testroot", "Check for original data" ); + ok( div.data("test.foo") == "testfoo", "Check for namespaced data" ); + ok( div.data("test.bar") == "testroot", "Check for unmatched namespace" ); }); test("$.removeData", function() { -- 2.39.5