jquery data: Closes #3539. Exposed jQuery.queue. Moved all the data and queue functio...
authorAriel Flesler <aflesler@gmail.com>
Tue, 30 Dec 2008 02:31:26 +0000 (02:31 +0000)
committerAriel Flesler <aflesler@gmail.com>
Tue, 30 Dec 2008 02:31:26 +0000 (02:31 +0000)
Makefile
src/core.js
src/fx.js
test/index.html
test/unit/core.js
test/unit/data.js [new file with mode: 0644]
test/unit/fx.js

index c3a16b9..36bd11c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -9,6 +9,7 @@ SPEED_DIR = ${PREFIX}/speed
 PLUG_DIR = ../plugins
 
 BASE_FILES = ${SRC_DIR}/core.js\
+       ${SRC_DIR}/data.js\
        ${SRC_DIR}/support.js\
        ${SRC_DIR}/selector.js\
        ${SRC_DIR}/event.js\
index 09e6895..b5de145 100644 (file)
@@ -483,31 +483,6 @@ jQuery.fn = jQuery.prototype = {
                return this.add( this.prevObject );
        },
 
-       data: function( key, value ){
-               var parts = key.split(".");
-               parts[1] = parts[1] ? "." + parts[1] : "";
-
-               if ( value === undefined ) {
-                       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[0], value]).each(function(){
-                               jQuery.data( this, key, value );
-                       });
-       },
-
-       removeData: function( key ){
-               return this.each(function(){
-                       jQuery.removeData( this, key );
-               });
-       },
-
        domManip: function( args, table, callback ) {
                if ( this[0] ) {
                        var fragment = this[0].ownerDocument.createDocumentFragment(),
@@ -606,9 +581,8 @@ jQuery.extend = jQuery.fn.extend = function() {
        return target;
 };
 
-var expando = "jQuery" + now(), uuid = 0, windowData = {},
-       // exclude the following css properties to add px
-       exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
+// exclude the following css properties to add px
+var    exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
        // cache defaultView
        defaultView = document.defaultView || {},
        toString = Object.prototype.toString;
@@ -667,74 +641,6 @@ jQuery.extend({
                return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
        },
 
-       cache: {},
-
-       data: function( elem, name, data ) {
-               elem = elem == window ?
-                       windowData :
-                       elem;
-
-               var id = elem[ expando ];
-
-               // Compute a unique ID for the element
-               if ( !id )
-                       id = elem[ expando ] = ++uuid;
-
-               // Only generate the data cache if we're
-               // trying to access or manipulate it
-               if ( name && !jQuery.cache[ id ] )
-                       jQuery.cache[ id ] = {};
-
-               // Prevent overriding the named cache with undefined values
-               if ( data !== undefined )
-                       jQuery.cache[ id ][ name ] = data;
-
-               // Return the named cache data, or the ID for the element
-               return name ?
-                       jQuery.cache[ id ][ name ] || null :
-                       id;
-       },
-
-       removeData: function( elem, name ) {
-               elem = elem == window ?
-                       windowData :
-                       elem;
-
-               var id = elem[ expando ];
-
-               // If we want to remove a specific section of the element's data
-               if ( name ) {
-                       if ( jQuery.cache[ id ] ) {
-                               // Remove the section of cache data
-                               delete jQuery.cache[ id ][ name ];
-
-                               // If we've removed all the data, remove the element's cache
-                               name = "";
-
-                               for ( name in jQuery.cache[ id ] )
-                                       break;
-
-                               if ( !name )
-                                       jQuery.removeData( elem );
-                       }
-
-               // Otherwise, we want to remove all of the element's data
-               } else {
-                       // Clean up the element expando
-                       try {
-                               delete elem[ expando ];
-                       } catch(e){
-                               // IE has trouble directly removing the expando
-                               // but it's ok with using removeAttribute
-                               if ( elem.removeAttribute )
-                                       elem.removeAttribute( expando );
-                       }
-
-                       // Completely remove the data cache
-                       delete jQuery.cache[ id ];
-               }
-       },
-
        // args is for internal usage only
        each: function( object, callback, args ) {
                var name, i = 0, length = object.length;
index 794b96f..ae472ef 100644 (file)
--- a/src/fx.js
+++ b/src/fx.js
@@ -137,27 +137,6 @@ jQuery.fn.extend({
                });
        },
 
-       queue: function(type, fn){
-               if ( jQuery.isFunction(type) || jQuery.isArray(type) ) {
-                       fn = type;
-                       type = "fx";
-               }
-
-               if ( !type || (typeof type === "string" && !fn) )
-                       return queue( this[0], type );
-
-               return this.each(function(){
-                       if ( jQuery.isArray(fn) )
-                               queue(this, type, fn);
-                       else {
-                               queue(this, type).push( fn );
-
-                               if ( queue(this, type).length == 1 )
-                                       fn.call(this);
-                       }
-               });
-       },
-
        stop: function(clearQueue, gotoEnd){
                var timers = jQuery.timers;
 
@@ -197,33 +176,6 @@ jQuery.each({
        };
 });
 
-var queue = function( elem, type, array ) {
-       if ( elem ){
-
-               type = type || "fx";
-
-               var q = jQuery.data( elem, type + "queue" );
-
-               if ( !q || array )
-                       q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
-
-       }
-       return q;
-};
-
-jQuery.fn.dequeue = function(type){
-       type = type || "fx";
-
-       return this.each(function(){
-               var q = queue(this, type);
-
-               q.shift();
-
-               if ( q.length )
-                       q[0].call( this );
-       });
-};
-
 jQuery.extend({
 
        speed: function(speed, easing, fn) {
index 6409ee1..9a0eccb 100644 (file)
@@ -15,6 +15,7 @@
        <script type="text/javascript" src="qunit/testrunner.js"></script>
        <script type="text/javascript" src="data/testrunner.js"></script>
        <script type="text/javascript" src="unit/core.js"></script>
+       <script type="text/javascript" src="unit/data.js"></script>
        <script type="text/javascript" src="unit/dimensions.js"></script>
        <script type="text/javascript" src="unit/selector.js"></script>
        <script type="text/javascript" src="unit/event.js"></script>
index 5d2f5f4..1f0850c 100644 (file)
@@ -1578,100 +1578,6 @@ test("jQuery.className", function() {
        ok( c.has(x, "bar"), "Check has2" );
 });
 
-test("jQuery.data", function() {
-       expect(5);
-       var div = jQuery("#foo")[0];
-       equals( jQuery.data(div, "test"), undefined, "Check for no data exists" );
-       jQuery.data(div, "test", "success");
-       equals( jQuery.data(div, "test"), "success", "Check for added data" );
-       jQuery.data(div, "test", "overwritten");
-       equals( jQuery.data(div, "test"), "overwritten", "Check for overwritten data" );
-       jQuery.data(div, "test", undefined);
-       equals( jQuery.data(div, "test"), "overwritten", "Check that data wasn't removed");
-       jQuery.data(div, "test", null);
-       ok( jQuery.data(div, "test") === null, "Check for null data");
-});
-
-test(".data()", function() {
-       expect(18);
-       var div = jQuery("#foo");
-       equals( div.data("test"), undefined, "Check for no data exists" );
-       div.data("test", "success");
-       equals( div.data("test"), "success", "Check for added data" );
-       div.data("test", "overwritten");
-       equals( div.data("test"), "overwritten", "Check for overwritten data" );
-       div.data("test", undefined);
-       equals( div.data("test"), "overwritten", "Check that data wasn't removed");
-       div.data("test", null);
-       ok( div.data("test") === null, "Check for null data");
-
-       div.data("test", "overwritten");
-       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);
-       equals( div.data("test"), "overwritten", "Check for original data" );
-       equals( div.data("test.foo"), 2, "Check for namespaced data" );
-       equals( div.data("test.bar"), "overwritten", "Check for unmatched namespace" );
-       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);
-       equals( div.data("test"), 1, "Check for original data" );
-       equals( div.data("test.foo"), 2, "Check for namespaced data" );
-       equals( div.data("test.bar"), 1, "Check for unmatched namespace" );
-       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"; });
-
-       equals( div.data("test"), "testroot", "Check for original data" );
-       equals( div.data("test.foo"), "testfoo", "Check for namespaced data" );
-       equals( div.data("test.bar"), "testroot", "Check for unmatched namespace" );
-});
-
-test("jQuery.removeData", function() {
-       expect(1);
-       var div = jQuery("#foo")[0];
-       jQuery.data(div, "test", "testing");
-       jQuery.removeData(div, "test");
-       equals( jQuery.data(div, "test"), undefined, "Check removal of data" );
-});
-
-test(".removeData()", function() {
-       expect(6);
-       var div = jQuery("#foo");
-       div.data("test", "testing");
-       div.removeData("test");
-       equals( div.data("test"), undefined, "Check removal of data" );
-
-       div.data("test", "testing");
-       div.data("test.foo", "testing2");
-       div.removeData("test.bar");
-       equals( div.data("test.foo"), "testing2", "Make sure data is intact" );
-       equals( div.data("test"), "testing", "Make sure data is intact" );
-
-       div.removeData("test");
-       equals( div.data("test.foo"), "testing2", "Make sure data is intact" );
-       equals( div.data("test"), undefined, "Make sure data is intact" );
-
-       div.removeData("test.foo");
-       equals( div.data("test.foo"), undefined, "Make sure data is intact" );
-});
-
 test("remove()", function() {
        expect(6);
        jQuery("#ap").children().remove();
diff --git a/test/unit/data.js b/test/unit/data.js
new file mode 100644 (file)
index 0000000..fa56891
--- /dev/null
@@ -0,0 +1,160 @@
+module("data");\r
+\r
+test("jQuery.data", function() {\r
+       expect(5);\r
+       var div = jQuery("#foo")[0];\r
+       equals( jQuery.data(div, "test"), undefined, "Check for no data exists" );\r
+       jQuery.data(div, "test", "success");\r
+       equals( jQuery.data(div, "test"), "success", "Check for added data" );\r
+       jQuery.data(div, "test", "overwritten");\r
+       equals( jQuery.data(div, "test"), "overwritten", "Check for overwritten data" );\r
+       jQuery.data(div, "test", undefined);\r
+       equals( jQuery.data(div, "test"), "overwritten", "Check that data wasn't removed");\r
+       jQuery.data(div, "test", null);\r
+       ok( jQuery.data(div, "test") === null, "Check for null data");\r
+});\r
+\r
+test(".data()", function() {\r
+       expect(22);\r
+       var div = jQuery("#foo");\r
+       equals( div.data("test"), undefined, "Check for no data exists" );\r
+       div.data("test", "success");\r
+       equals( div.data("test"), "success", "Check for added data" );\r
+       div.data("test", "overwritten");\r
+       equals( div.data("test"), "overwritten", "Check for overwritten data" );\r
+       div.data("test", undefined);\r
+       equals( div.data("test"), "overwritten", "Check that data wasn't removed");\r
+       div.data("test", null);\r
+       ok( div.data("test") === null, "Check for null data");\r
+\r
+       div.data("test", "overwritten");\r
+       var hits = {test:0}, gets = {test:0};\r
+\r
+       div\r
+               .bind("setData",function(e,key,value){ hits[key] += value; })\r
+               .bind("setData.foo",function(e,key,value){ hits[key] += value; })\r
+               .bind("getData",function(e,key){ gets[key] += 1; })\r
+               .bind("getData.foo",function(e,key){ gets[key] += 3; });\r
+\r
+       div.data("test.foo", 2);\r
+       equals( div.data("test"), "overwritten", "Check for original data" );\r
+       equals( div.data("test.foo"), 2, "Check for namespaced data" );\r
+       equals( div.data("test.bar"), "overwritten", "Check for unmatched namespace" );\r
+       equals( hits.test, 2, "Check triggered setter functions" );\r
+       equals( gets.test, 5, "Check triggered getter functions" );\r
+\r
+       hits.test = 0;\r
+       gets.test = 0;\r
+\r
+       div.data("test", 1);\r
+       equals( div.data("test"), 1, "Check for original data" );\r
+       equals( div.data("test.foo"), 2, "Check for namespaced data" );\r
+       equals( div.data("test.bar"), 1, "Check for unmatched namespace" );\r
+       equals( hits.test, 1, "Check triggered setter functions" );\r
+       equals( gets.test, 5, "Check triggered getter functions" );\r
+\r
+       hits.test = 0;\r
+       gets.test = 0;\r
+\r
+       div\r
+               .bind("getData",function(e,key){ return key + "root"; })\r
+               .bind("getData.foo",function(e,key){ return key + "foo"; });\r
+\r
+       equals( div.data("test"), "testroot", "Check for original data" );\r
+       equals( div.data("test.foo"), "testfoo", "Check for namespaced data" );\r
+       equals( div.data("test.bar"), "testroot", "Check for unmatched namespace" );\r
+       \r
+       // #3748\r
+       var $elem = jQuery({});\r
+       equals( $elem.data('nothing'), undefined, "Non-existent data returns undefined");\r
+       equals( $elem.data('null',null).data('null'), null, "null's are preserved");\r
+       equals( $elem.data('emptyString','').data('emptyString'), '', "Empty strings are preserved");\r
+       equals( $elem.data('false',false).data('false'), false, "false's are preserved");\r
+       \r
+       // Clean up\r
+       $elem.removeData();\r
+});\r
+\r
+test("jQuery.removeData", function() {\r
+       expect(1);\r
+       var div = jQuery("#foo")[0];\r
+       jQuery.data(div, "test", "testing");\r
+       jQuery.removeData(div, "test");\r
+       equals( jQuery.data(div, "test"), undefined, "Check removal of data" );\r
+});\r
+\r
+test(".removeData()", function() {\r
+       expect(6);\r
+       var div = jQuery("#foo");\r
+       div.data("test", "testing");\r
+       div.removeData("test");\r
+       equals( div.data("test"), undefined, "Check removal of data" );\r
+\r
+       div.data("test", "testing");\r
+       div.data("test.foo", "testing2");\r
+       div.removeData("test.bar");\r
+       equals( div.data("test.foo"), "testing2", "Make sure data is intact" );\r
+       equals( div.data("test"), "testing", "Make sure data is intact" );\r
+\r
+       div.removeData("test");\r
+       equals( div.data("test.foo"), "testing2", "Make sure data is intact" );\r
+       equals( div.data("test"), undefined, "Make sure data is intact" );\r
+\r
+       div.removeData("test.foo");\r
+       equals( div.data("test.foo"), undefined, "Make sure data is intact" );\r
+});\r
+\r
+test("queue() defaults to 'fx' type", function () {\r
+       expect(2);\r
+       stop();\r
+\r
+       var $foo = jQuery("#foo");\r
+       $foo.queue("fx", [ "sample", "array" ]);\r
+       var arr = $foo.queue();\r
+       isSet(arr, [ "sample", "array" ], "queue() got an array set with type 'fx'");\r
+       $foo.queue([ "another", "one" ]);\r
+       var arr = $foo.queue("fx");\r
+       isSet(arr, [ "another", "one" ], "queue('fx') got an array set with no type");\r
+       // clean up after test\r
+       $foo.queue([]);\r
+\r
+       start();\r
+});\r
+\r
+test("queue() with other types",function() {\r
+       expect(9);\r
+       var counter = 0;\r
+       \r
+       var $div = jQuery({});\r
+       \r
+       $div\r
+               .queue('foo',function(){\r
+                       equals( ++counter, 1, "Dequeuing" );\r
+                       jQuery.dequeue(this,'foo');\r
+               })\r
+               .queue('foo',function(){\r
+                       equals( ++counter, 2, "Dequeuing" );\r
+                       jQuery(this).dequeue('foo');\r
+               })\r
+               .queue('foo',function(){\r
+                       equals( ++counter, 3, "Dequeuing" );\r
+               })\r
+               .queue('foo',function(){\r
+                       equals( ++counter, 4, "Dequeuing" );\r
+               });\r
+               \r
+       equals( $div.queue('foo').length, 4, "Testing queue length" );\r
+       \r
+       $div.dequeue('foo');\r
+       \r
+       equals( counter, 3, "Testing previous call to dequeue" );\r
+       equals( $div.queue('foo').length, 1, "Testing queue length" );\r
+       \r
+       $div.dequeue('foo');\r
+       \r
+       equals( counter, 4, "Testing previous call to dequeue" );\r
+       equals( $div.queue('foo').length, 0, "Testing queue length" );\r
+       \r
+       // Clean up\r
+       $div.removeData();\r
+})\r
index 8af9297..2ee3d30 100644 (file)
@@ -34,23 +34,6 @@ test("animate option (queue === false)", function () {
        });
 });
 
-test("queue() defaults to 'fx' type", function () {
-       expect(2);
-       stop();
-
-       var $foo = jQuery("#foo");
-       $foo.queue("fx", [ "sample", "array" ]);
-       var arr = $foo.queue();
-       isSet(arr, [ "sample", "array" ], "queue() got an array set with type 'fx'");
-       $foo.queue([ "another", "one" ]);
-       var arr = $foo.queue("fx");
-       isSet(arr, [ "another", "one" ], "queue('fx') got an array set with no type");
-       // clean up after test
-       $foo.queue([]);
-
-       start();
-});
-
 test("stop()", function() {
        expect(3);
        stop();