diff options
Diffstat (limited to 'src/jquery')
-rw-r--r-- | src/jquery/coreTest.js | 83 | ||||
-rw-r--r-- | src/jquery/jquery.js | 34 |
2 files changed, 79 insertions, 38 deletions
diff --git a/src/jquery/coreTest.js b/src/jquery/coreTest.js index cda5908e0..289a41610 100644 --- a/src/jquery/coreTest.js +++ b/src/jquery/coreTest.js @@ -116,6 +116,18 @@ test("isFunction", function() { }); }); +test("$('html')", function() { + expect(2); + + reset(); + ok( $("<script>var foo='test';</script>")[0], "Creating a script" ); + + reset(); + ok( $("<link rel='stylesheet'/>")[0], "Creating a link" ); + + reset(); +}); + test("length", function() { expect(1); ok( $("p").length == 6, "Get Number of Elements Found" ); @@ -194,17 +206,15 @@ test("attr(String)", function() { ok( $('#tAnchor5').attr('href') == "#5", 'Check for non-absolute href (an anchor)' ); }); -if ( location.protocol != "file:" ) { - test("attr(String) in XML Files", function() { - expect(2); - stop(); - $.get("data/dashboard.xml", function(xml) { - ok( $("locations", xml).attr("class") == "foo", "Check class attribute in XML document" ); - ok( $("location", xml).attr("for") == "bar", "Check for attribute in XML document" ); - start(); - }); +test("attr(String) in XML Files", function() { + expect(2); + stop(); + $.get("data/dashboard.xml", function(xml) { + ok( $("locations", xml).attr("class") == "foo", "Check class attribute in XML document" ); + ok( $("location", xml).attr("for") == "bar", "Check for attribute in XML document" ); + start(); }); -} +}); test("attr(String, Function)", function() { expect(2); @@ -247,21 +257,19 @@ test("attr(String, Object)", function() { ok( document.getElementById('name').maxLength == '5', 'Set maxlength attribute' ); }); -if ( location.protocol != "file:" ) { - test("attr(String, Object)x", function() { - expect(2); - stop(); - $.get('data/dashboard.xml', function(xml) { - var titles = []; - $('tab', xml).each(function() { - titles.push($(this).attr('title')); - }); - ok( titles[0] == 'Location', 'attr() in XML context: Check first title' ); - ok( titles[1] == 'Users', 'attr() in XML context: Check second title' ); - start(); - }); +test("attr(String, Object) - Loaded via XML document", function() { + expect(2); + stop(); + $.get('data/dashboard.xml', function(xml) { + var titles = []; + $('tab', xml).each(function() { + titles.push($(this).attr('title')); + }); + ok( titles[0] == 'Location', 'attr() in XML context: Check first title' ); + ok( titles[1] == 'Users', 'attr() in XML context: Check second title' ); + start(); }); -} +}); test("css(String|Hash)", function() { expect(19); @@ -652,27 +660,40 @@ test("is(String)", function() { }); test("$.extend(Object, Object)", function() { - expect(2); + expect(10); + var settings = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, options = { xnumber2: 1, xstring2: "x", xxx: "newstring" }, optionsCopy = { xnumber2: 1, xstring2: "x", xxx: "newstring" }, - merged = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "x", xxx: "newstring" }; + merged = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "x", xxx: "newstring" }, + deep1 = { foo: { bar: true } }, + deep1copy = { foo: { bar: true } }, + deep2 = { foo: { baz: true } }, + deep2copy = { foo: { baz: true } }, + deepmerged = { foo: { bar: true, baz: true } }; + jQuery.extend(settings, options); isObj( settings, merged, "Check if extended: settings must be extended" ); isObj( options, optionsCopy, "Check if not modified: options must not be modified" ); -}); -test("$.extend(Object, Object, Object, Object)", function() { - expect(4); + jQuery.extend(settings, null, options); + isObj( settings, merged, "Check if extended: settings must be extended" ); + isObj( options, optionsCopy, "Check if not modified: options must not be modified" ); + + jQuery.extend(deep1, deep2); + isObj( deep1.foo, deepmerged.foo, "Check if foo: settings must be extended" ); + isObj( deep2.foo, deep2copy.foo, "Check if not deep2: options must not be modified" ); + var defaults = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, defaultsCopy = { xnumber1: 5, xnumber2: 7, xstring1: "peter", xstring2: "pan" }, options1 = { xnumber2: 1, xstring2: "x" }, options1Copy = { xnumber2: 1, xstring2: "x" }, options2 = { xstring2: "xx", xxx: "newstringx" }, options2Copy = { xstring2: "xx", xxx: "newstringx" }, - merged = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "xx", xxx: "newstringx" }; + merged2 = { xnumber1: 5, xnumber2: 1, xstring1: "peter", xstring2: "xx", xxx: "newstringx" }; + var settings = jQuery.extend({}, defaults, options1, options2); - isObj( settings, merged, "Check if extended: settings must be extended" ); + isObj( settings, merged2, "Check if extended: settings must be extended" ); isObj( defaults, defaultsCopy, "Check if not modified: options1 must not be modified" ); isObj( options1, options1Copy, "Check if not modified: options1 must not be modified" ); isObj( options2, options2Copy, "Check if not modified: options2 must not be modified" ); diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 98cbf372e..b7091e26f 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -1252,17 +1252,33 @@ jQuery.fn = jQuery.prototype = { */ jQuery.extend = jQuery.fn.extend = function() { // copy reference to target object - var target = arguments[0], a = 1; + var target = arguments[0] || {}, a = 1, al = arguments.length; // extend jQuery itself if only one argument is passed - if ( arguments.length == 1 ) { + if ( al == 1 ) { target = this; a = 0; } + var prop; - while ( (prop = arguments[a++]) != null ) - // Extend the base object - for ( var i in prop ) target[i] = prop[i]; + + for ( ; a < al; a++ ) + // Only deal with non-null/undefined values + if ( (prop = arguments[a]) != null ) + // Extend the base object + for ( var i in prop ) { + // Prevent never-ending loop + if ( target == prop[i] ) + continue; + + // Recurse if we're merging object values + if ( typeof prop[i] == 'object' && target[i] ) + jQuery.extend( target[i], prop[i] ); + + // Don't bring in undefined values + else if ( prop[i] != undefined ) + target[i] = prop[i]; + } // Return the modified object return target; @@ -1577,7 +1593,11 @@ jQuery.extend({ [3, "<table><tbody><tr>", "</tr></tbody></table>"] || !s.indexOf("<col") && - [2, "<table><colgroup>", "</colgroup></table>"] || + [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] || + + // IE can't serialize <link> and <script> tags normally + jQuery.browser.msie && + [1, "div<div>", "</div>"] || [0,"",""]; @@ -1586,7 +1606,7 @@ jQuery.extend({ // Move to the right depth while ( wrap[0]-- ) - div = div.firstChild; + div = div.lastChild; // Remove IE's autoinserted <tbody> from table fragments if ( jQuery.browser.msie ) { |