module( "attributes", { teardown: moduleTeardown }); function bareObj( value ) { return value; } function functionReturningObj( value ) { return function() { return value; }; } /* ======== local reference ======= bareObj and functionReturningObj can be used to test passing functions to setters See testVal below for an example bareObj( value ); This function returns whatever value is passed in functionReturningObj( value ); Returns a function that returns the value */ test( "jQuery.propFix integrity test", function() { expect( 1 ); // This must be maintained and equal jQuery.attrFix when appropriate // Ensure that accidental or erroneous property // overwrites don't occur // This is simply for better code coverage and future proofing. var props = { "tabindex": "tabIndex", "readonly": "readOnly", "for": "htmlFor", "class": "className", "maxlength": "maxLength", "cellspacing": "cellSpacing", "cellpadding": "cellPadding", "rowspan": "rowSpan", "colspan": "colSpan", "usemap": "useMap", "frameborder": "frameBorder", "contenteditable": "contentEditable" }; deepEqual( props, jQuery.propFix, "jQuery.propFix passes integrity check" ); }); test( "attr(String)", function() { expect( 50 ); var extras, body, $body, select, optgroup, option, $img, styleElem, $button, $form, $a; equal( jQuery("#text1").attr("type"), "text", "Check for type attribute" ); equal( jQuery("#radio1").attr("type"), "radio", "Check for type attribute" ); equal( jQuery("#check1").attr("type"), "checkbox", "Check for type attribute" ); equal( jQuery("#simon1").attr("rel"), "bookmark", "Check for rel attribute" ); equal( jQuery("#google").attr("title"), "Google!", "Check for title attribute" ); equal( jQuery("#mark").attr("hreflang"), "en", "Check for hreflang attribute" ); equal( jQuery("#en").attr("lang"), "en", "Check for lang attribute" ); equal( jQuery("#simon").attr("class"), "blog link", "Check for class attribute" ); equal( jQuery("#name").attr("name"), "name", "Check for name attribute" ); equal( jQuery("#text1").attr("name"), "action", "Check for name attribute" ); ok( jQuery("#form").attr("action").indexOf("formaction") >= 0, "Check for action attribute" ); equal( jQuery("#text1").attr("value", "t").attr("value"), "t", "Check setting the value attribute" ); equal( jQuery("#text1").attr("value", "").attr("value"), "", "Check setting the value attribute to empty string" ); equal( jQuery("
").attr("value"), "t", "Check setting custom attr named 'value' on a div" ); equal( jQuery("#form").attr("blah", "blah").attr("blah"), "blah", "Set non-existent attribute on a form" ); equal( jQuery("#foo").attr("height"), undefined, "Non existent height attribute should return undefined" ); // [7472] & [3113] (form contains an input with name="action" or name="id") extras = jQuery("").appendTo("#testForm"); equal( jQuery("#form").attr("action","newformaction").attr("action"), "newformaction", "Check that action attribute was changed" ); equal( jQuery("#testForm").attr("target"), undefined, "Retrieving target does not equal the input with name=target" ); equal( jQuery("#testForm").attr("target", "newTarget").attr("target"), "newTarget", "Set target successfully on a form" ); equal( jQuery("#testForm").removeAttr("id").attr("id"), undefined, "Retrieving id does not equal the input with name=id after id is removed [#7472]" ); // Bug #3685 (form contains input with name="name") equal( jQuery("#testForm").attr("name"), undefined, "Retrieving name does not retrieve input with name=name" ); extras.remove(); equal( jQuery("#text1").attr("maxlength"), "30", "Check for maxlength attribute" ); equal( jQuery("#text1").attr("maxLength"), "30", "Check for maxLength attribute" ); equal( jQuery("#area1").attr("maxLength"), "30", "Check for maxLength attribute" ); // using innerHTML in IE causes href attribute to be serialized to the full path jQuery("").attr({ "id": "tAnchor5", "href": "#5" }).appendTo("#qunit-fixture"); equal( jQuery("#tAnchor5").attr("href"), "#5", "Check for non-absolute href (an anchor)" ); jQuery("").appendTo("#qunit-fixture"); equal( jQuery("#tAnchor5").prop("href"), jQuery("#tAnchor6").prop("href"), "Check for absolute href prop on an anchor" ); jQuery("").appendTo("#qunit-fixture"); equal( jQuery("#tAnchor5").prop("href"), jQuery("#scriptSrc").prop("src"), "Check for absolute src prop on a script" ); // list attribute is readonly by default in browsers that support it jQuery("#list-test").attr( "list", "datalist" ); equal( jQuery("#list-test").attr("list"), "datalist", "Check setting list attribute" ); // Related to [5574] and [5683] body = document.body; $body = jQuery( body ); strictEqual( $body.attr("foo"), undefined, "Make sure that a non existent attribute returns undefined" ); body.setAttribute( "foo", "baz" ); equal( $body.attr("foo"), "baz", "Make sure the dom attribute is retrieved when no expando is found" ); $body.attr( "foo","cool" ); equal( $body.attr("foo"), "cool", "Make sure that setting works well when both expando and dom attribute are available" ); body.removeAttribute("foo"); // Cleanup select = document.createElement("select"); optgroup = document.createElement("optgroup"); option = document.createElement("option"); optgroup.appendChild( option ); select.appendChild( optgroup ); equal( jQuery( option ).prop("selected"), true, "Make sure that a single option is selected, even when in an optgroup." ); $img = jQuery("").appendTo("body"); equal( $img.attr("width"), "215", "Retrieve width attribute an an element with display:none." ); equal( $img.attr("height"), "53", "Retrieve height attribute an an element with display:none." ); // Check for style support styleElem = jQuery("
").appendTo("#qunit-fixture").css({ background: "url(UPPERlower.gif)" }); ok( !!~styleElem.attr("style").indexOf("UPPERlower.gif"), "Check style attribute getter" ); ok( !!~styleElem.attr("style", "position:absolute;").attr("style").indexOf("absolute"), "Check style setter" ); // Check value on button element (#1954) $button = jQuery("").insertAfter("#button"); strictEqual( $button.attr("value"), undefined, "Absence of value attribute on a button" ); equal( $button.attr( "value", "foobar" ).attr("value"), "foobar", "Value attribute on a button does not return innerHTML" ); equal( $button.attr("value", "baz").html(), "text", "Setting the value attribute does not change innerHTML" ); // Attributes with a colon on a table element (#1591) equal( jQuery("#table").attr("test:attrib"), undefined, "Retrieving a non-existent attribute on a table with a colon does not throw an error." ); equal( jQuery("#table").attr( "test:attrib", "foobar" ).attr("test:attrib"), "foobar", "Setting an attribute on a table with a colon does not throw an error." ); $form = jQuery("
").appendTo("#qunit-fixture"); equal( $form.attr("class"), "something", "Retrieve the class attribute on a form." ); $a = jQuery("
Click").appendTo("#qunit-fixture"); equal( $a.attr("onclick"), "something()", "Retrieve ^on attribute without anonymous function wrapper." ); ok( jQuery("
").attr("doesntexist") === undefined, "Make sure undefined is returned when no attribute is found." ); ok( jQuery("
").attr("title") === undefined, "Make sure undefined is returned when no attribute is found." ); equal( jQuery("
").attr( "title", "something" ).attr("title"), "something", "Set the title attribute." ); ok( jQuery().attr("doesntexist") === undefined, "Make sure undefined is returned when no element is there." ); equal( jQuery("
").attr("value"), undefined, "An unset value on a div returns undefined." ); strictEqual( jQuery("").attr("value"), undefined, "An unset value on a select returns undefined." ); $form = jQuery("#form").attr( "enctype", "multipart/form-data" ); equal( $form.prop("enctype"), "multipart/form-data", "Set the enctype of a form (encoding in IE6/7 #6743)" ); }); test( "attr(String) on cloned elements, #9646", function() { expect( 4 ); var div, input = jQuery(""); input.attr("name"); strictEqual( input.clone( true ).attr( "name", "test" )[ 0 ].name, "test", "Name attribute should be changed on cloned element" ); div = jQuery("
"); div.attr("id"); strictEqual( div.clone( true ).attr( "id", "test" )[ 0 ].id, "test", "Id attribute should be changed on cloned element" ); input = jQuery(""); input.attr("value"); strictEqual( input.clone( true ).attr( "value", "test" )[ 0 ].value, "test", "Value attribute should be changed on cloned element" ); strictEqual( input.clone( true ).attr( "value", 42 )[ 0 ].value, "42", "Value attribute should be changed on cloned element" ); }); test( "attr(String) in XML Files", function() { expect( 3 ); var xml = createDashboardXML(); equal( jQuery( "locations", xml ).attr("class"), "foo", "Check class attribute in XML document" ); equal( jQuery( "location", xml ).attr("for"), "bar", "Check for attribute in XML document" ); equal( jQuery( "location", xml ).attr("checked"), "different", "Check that hooks are not attached in XML document" ); }); test( "attr(String, Function)", function() { expect( 2 ); equal( jQuery("#text1").attr( "value", function() { return this.id; }).attr("value"), "text1", "Set value from id" ); equal( jQuery("#text1").attr( "title", function(i) { return i; }).attr("title"), "0", "Set value with an index" ); }); test( "attr(Hash)", function() { expect( 3 ); var pass = true; jQuery("div").attr({ "foo": "baz", "zoo": "ping" }).each(function() { if ( this.getAttribute("foo") !== "baz" && this.getAttribute("zoo") !== "ping" ) { pass = false; } }); ok( pass, "Set Multiple Attributes" ); equal( jQuery("#text1").attr({ "value": function() { return this["id"]; }}).attr("value"), "text1", "Set attribute to computed value #1" ); equal( jQuery("#text1").attr({ "title": function(i) { return i; } }).attr("title"), "0", "Set attribute to computed value #2" ); }); test( "attr(String, Object)", function() { expect( 71 ); var $input, $text, $details, attributeNode, commentNode, textNode, obj, table, td, j, type, check, thrown, button, $radio, $radios, $svg, div = jQuery("div").attr("foo", "bar"), i = 0, fail = false; for ( ; i < div.length; i++ ) { if ( div[ i ].getAttribute("foo") !== "bar" ) { fail = i; break; } } equal( fail, false, "Set Attribute, the #" + fail + " element didn't get the attribute 'foo'" ); ok( jQuery("#foo").attr({ "width": null }), "Try to set an attribute to nothing" ); jQuery("#name").attr( "name", "something" ); equal( jQuery("#name").attr("name"), "something", "Set name attribute" ); jQuery("#name").attr( "name", null ); equal( jQuery("#name").attr("name"), undefined, "Remove name attribute" ); $input = jQuery( "", { name: "something", id: "specified" }); equal( $input.attr("name"), "something", "Check element creation gets/sets the name attribute." ); equal( $input.attr("id"), "specified", "Check element creation gets/sets the id attribute." ); // As of fixing #11115, we only guarantee boolean property update for checked and selected $input = jQuery("").attr( "checked", true ); equal( $input.prop("checked"), true, "Setting checked updates property (verified by .prop)" ); equal( $input[0].checked, true, "Setting checked updates property (verified by native property)" ); $input = jQuery(""); $select1.val( valueObj( 4 ) ); equal( $select1.val(), "4", "Should be possible to set the val() to a newly created option" ); // using contents will get comments regular, text, and comment nodes j = jQuery("#nonnodes").contents(); j.val( valueObj( "asdf" ) ); equal( j.val(), "asdf", "Check node,textnode,comment with val()" ); j.removeAttr("value"); $select.val( valueObj( [ "1", "2" ] ) ); deepEqual( $select.val(), [ "1", "2" ], "Should set array of values" ); }; test( "val(String/Number)", function() { testVal( bareObj ); }); test( "val(Function)", function() { testVal( functionReturningObj ); }); test( "val(Array of Numbers) (Bug #7123)", function() { expect( 4 ); jQuery("#form").append(""); var elements = jQuery("input[name=arrayTest]").val([ 1, 2 ]); ok( elements[ 0 ].checked, "First element was checked" ); ok( elements[ 1 ].checked, "Second element was checked" ); ok( !elements[ 2 ].checked, "Third element was unchecked" ); ok( !elements[ 3 ].checked, "Fourth element remained unchecked" ); elements.remove(); }); test( "val(Function) with incoming value", function() { expect( 10 ); var oldVal = jQuery("#text1").val(); jQuery("#text1").val(function( i, val ) { equal( val, oldVal, "Make sure the incoming value is correct." ); return "test"; }); equal( document.getElementById("text1").value, "test", "Check for modified (via val(String)) value of input element" ); oldVal = jQuery("#text1").val(); jQuery("#text1").val(function( i, val ) { equal( val, oldVal, "Make sure the incoming value is correct." ); return 67; }); equal( document.getElementById("text1").value, "67", "Check for modified (via val(Number)) value of input element" ); oldVal = jQuery("#select1").val(); jQuery("#select1").val(function( i, val ) { equal( val, oldVal, "Make sure the incoming value is correct." ); return "3"; }); equal( jQuery("#select1").val(), "3", "Check for modified (via val(String)) value of select element" ); oldVal = jQuery("#select1").val(); jQuery("#select1").val(function( i, val ) { equal( val, oldVal, "Make sure the incoming value is correct." ); return 2; }); equal( jQuery("#select1").val(), "2", "Check for modified (via val(Number)) value of select element" ); jQuery("#select1").append(""); oldVal = jQuery("#select1").val(); jQuery("#select1").val(function( i, val ) { equal( val, oldVal, "Make sure the incoming value is correct." ); return 4; }); equal( jQuery("#select1").val(), "4", "Should be possible to set the val() to a newly created option" ); }); // testing if a form.reset() breaks a subsequent call to a select element's .val() (in IE only) test( "val(select) after form.reset() (Bug #2551)", function() { expect( 3 ); jQuery("
").appendTo("#qunit-fixture"); jQuery("#kkk").val("gf"); document["kk"].reset(); equal( jQuery("#kkk")[ 0 ].value, "cf", "Check value of select after form reset." ); equal( jQuery("#kkk").val(), "cf", "Check value of select after form reset." ); // re-verify the multi-select is not broken (after form.reset) by our fix for single-select deepEqual( jQuery("#select3").val(), ["1", "2"], "Call val() on a multiple='multiple' select" ); jQuery("#kk").remove(); }); var testAddClass = function( valueObj ) { expect( 9 ); var pass, j, i, div = jQuery("#qunit-fixture div"); div.addClass( valueObj("test") ); pass = true; for ( i = 0; i < div.length; i++ ) { if ( !~div.get( i ).className.indexOf("test") ) { pass = false; } } ok( pass, "Add Class" ); // using contents will get regular, text, and comment nodes j = jQuery("#nonnodes").contents(); j.addClass( valueObj("asdf") ); ok( j.hasClass("asdf"), "Check node,textnode,comment for addClass" ); div = jQuery("
"); div.addClass( valueObj("test") ); equal( div.attr("class"), "test", "Make sure there's no extra whitespace." ); div.attr( "class", " foo" ); div.addClass( valueObj("test") ); equal( div.attr("class"), "foo test", "Make sure there's no extra whitespace." ); div.attr( "class", "foo" ); div.addClass( valueObj("bar baz") ); equal( div.attr("class"), "foo bar baz", "Make sure there isn't too much trimming." ); div.removeClass(); div.addClass( valueObj("foo") ).addClass( valueObj("foo") ); equal( div.attr("class"), "foo", "Do not add the same class twice in separate calls." ); div.addClass( valueObj("fo") ); equal( div.attr("class"), "foo fo", "Adding a similar class does not get interrupted." ); div.removeClass().addClass("wrap2"); ok( div.addClass("wrap").hasClass("wrap"), "Can add similarly named classes"); div.removeClass(); div.addClass( valueObj("bar bar") ); equal( div.attr("class"), "bar", "Do not add the same class twice in the same call." ); }; test( "addClass(String)", function() { testAddClass( bareObj ); }); test( "addClass(Function)", function() { testAddClass( functionReturningObj ); }); test( "addClass(Function) with incoming value", function() { expect( 52 ); var pass, i, div = jQuery("#qunit-fixture div"), old = div.map(function() { return jQuery(this).attr("class") || ""; }); div.addClass(function( i, val ) { if ( this.id !== "_firebugConsole" ) { equal( val, old[ i ], "Make sure the incoming value is correct." ); return "test"; } }); pass = true; for ( i = 0; i < div.length; i++ ) { if ( div.get(i).className.indexOf("test") === -1 ) { pass = false; } } ok( pass, "Add Class" ); }); var testRemoveClass = function(valueObj) { expect( 8 ); var $set = jQuery("#qunit-fixture div"), div = document.createElement("div"); $set.addClass("test").removeClass( valueObj("test") ); ok( !$set.is(".test"), "Remove Class" ); $set.addClass("test").addClass("foo").addClass("bar"); $set.removeClass( valueObj("test") ).removeClass( valueObj("bar") ).removeClass( valueObj("foo") ); ok( !$set.is(".test,.bar,.foo"), "Remove multiple classes" ); // Make sure that a null value doesn't cause problems $set.eq( 0 ).addClass("expected").removeClass( valueObj( null ) ); ok( $set.eq( 0 ).is(".expected"), "Null value passed to removeClass" ); $set.eq( 0 ).addClass("expected").removeClass( valueObj("") ); ok( $set.eq( 0 ).is(".expected"), "Empty string passed to removeClass" ); // using contents will get regular, text, and comment nodes $set = jQuery("#nonnodes").contents(); $set.removeClass( valueObj("asdf") ); ok( !$set.hasClass("asdf"), "Check node,textnode,comment for removeClass" ); jQuery( div ).removeClass( valueObj("foo") ); strictEqual( jQuery( div ).attr("class"), undefined, "removeClass doesn't create a class attribute" ); div.className = " test foo "; jQuery( div ).removeClass( valueObj("foo") ); equal( div.className, "test", "Make sure remaining className is trimmed." ); div.className = " test "; jQuery( div ).removeClass( valueObj("test") ); equal( div.className, "", "Make sure there is nothing left after everything is removed." ); }; test( "removeClass(String) - simple", function() { testRemoveClass( bareObj ); }); test( "removeClass(Function) - simple", function() { testRemoveClass( functionReturningObj ); }); test( "removeClass(Function) with incoming value", function() { expect( 52 ); var $divs = jQuery("#qunit-fixture div").addClass("test"), old = $divs.map(function() { return jQuery( this ).attr("class"); }); $divs.removeClass(function( i, val ) { if ( this.id !== "_firebugConsole" ) { equal( val, old[ i ], "Make sure the incoming value is correct." ); return "test"; } }); ok( !$divs.is(".test"), "Remove Class" ); }); test( "removeClass() removes duplicates", function() { expect( 1 ); var $div = jQuery( jQuery.parseHTML("
") ); $div.removeClass("x"); ok( !$div.hasClass("x"), "Element with multiple same classes does not escape the wrath of removeClass()" ); }); test("removeClass(undefined) is a no-op", function() { expect( 1 ); var $div = jQuery("
"); $div.removeClass( undefined ); ok( $div.hasClass("base") && $div.hasClass("second"), "Element still has classes after removeClass(undefined)" ); }); var testToggleClass = function(valueObj) { expect( 17 ); var e = jQuery("#firstp"); ok( !e.is(".test"), "Assert class not present" ); e.toggleClass( valueObj("test") ); ok( e.is(".test"), "Assert class present" ); e.toggleClass( valueObj("test") ); ok( !e.is(".test"), "Assert class not present" ); // class name with a boolean e.toggleClass( valueObj("test"), false ); ok( !e.is(".test"), "Assert class not present" ); e.toggleClass( valueObj("test"), true ); ok( e.is(".test"), "Assert class present" ); e.toggleClass( valueObj("test"), false ); ok( !e.is(".test"), "Assert class not present" ); // multiple class names e.addClass("testA testB"); ok( e.is(".testA.testB"), "Assert 2 different classes present" ); e.toggleClass( valueObj("testB testC") ); ok( (e.is(".testA.testC") && !e.is(".testB")), "Assert 1 class added, 1 class removed, and 1 class kept" ); e.toggleClass( valueObj("testA testC") ); ok( (!e.is(".testA") && !e.is(".testB") && !e.is(".testC")), "Assert no class present" ); // toggleClass storage e.toggleClass( true ); ok( e[ 0 ].className === "", "Assert class is empty (data was empty)" ); e.addClass("testD testE"); ok( e.is(".testD.testE"), "Assert class present" ); e.toggleClass(); ok( !e.is(".testD.testE"), "Assert class not present" ); ok( jQuery._data(e[ 0 ], "__className__") === "testD testE", "Assert data was stored" ); e.toggleClass(); ok( e.is(".testD.testE"), "Assert class present (restored from data)" ); e.toggleClass( false ); ok( !e.is(".testD.testE"), "Assert class not present" ); e.toggleClass( true ); ok( e.is(".testD.testE"), "Assert class present (restored from data)" ); e.toggleClass(); e.toggleClass( false ); e.toggleClass(); ok( e.is(".testD.testE"), "Assert class present (restored from data)" ); // Cleanup e.removeClass("testD"); QUnit.expectJqData( this, e[ 0 ], "__className__" ); }; test( "toggleClass(String|boolean|undefined[, boolean])", function() { testToggleClass( bareObj ); }); test( "toggleClass(Function[, boolean])", function() { testToggleClass( functionReturningObj ); }); test( "toggleClass(Function[, boolean]) with incoming value", function() { expect( 14 ); var e = jQuery("#firstp"), old = e.attr("class") || ""; ok( !e.is(".test"), "Assert class not present" ); e.toggleClass(function( i, val ) { equal( old, val, "Make sure the incoming value is correct." ); return "test"; }); ok( e.is(".test"), "Assert class present" ); old = e.attr("class"); e.toggleClass(function( i, val ) { equal( old, val, "Make sure the incoming value is correct." ); return "test"; }); ok( !e.is(".test"), "Assert class not present" ); old = e.attr("class") || ""; // class name with a boolean e.toggleClass(function( i, val, state ) { equal( old, val, "Make sure the incoming value is correct." ); equal( state, false, "Make sure that the state is passed in." ); return "test"; }, false ); ok( !e.is(".test"), "Assert class not present" ); old = e.attr("class") || ""; e.toggleClass(function( i, val, state ) { equal( old, val, "Make sure the incoming value is correct." ); equal( state, true, "Make sure that the state is passed in." ); return "test"; }, true ); ok( e.is(".test"), "Assert class present" ); old = e.attr("class"); e.toggleClass(function( i, val, state ) { equal( old, val, "Make sure the incoming value is correct." ); equal( state, false, "Make sure that the state is passed in." ); return "test"; }, false ); ok( !e.is(".test"), "Assert class not present" ); }); test( "addClass, removeClass, hasClass", function() { expect( 17 ); var jq = jQuery("

Hi

"), x = jq[ 0 ]; jq.addClass("hi"); equal( x.className, "hi", "Check single added class" ); jq.addClass("foo bar"); equal( x.className, "hi foo bar", "Check more added classes" ); jq.removeClass(); equal( x.className, "", "Remove all classes" ); jq.addClass("hi foo bar"); jq.removeClass("foo"); equal( x.className, "hi bar", "Check removal of one class" ); ok( jq.hasClass("hi"), "Check has1" ); ok( jq.hasClass("bar"), "Check has2" ); jq = jQuery("

"); ok( jq.hasClass("class1"), "Check hasClass with line feed" ); ok( jq.is(".class1"), "Check is with line feed" ); ok( jq.hasClass("class2"), "Check hasClass with tab" ); ok( jq.is(".class2"), "Check is with tab" ); ok( jq.hasClass("cla.ss3"), "Check hasClass with dot" ); ok( jq.hasClass("class4"), "Check hasClass with carriage return" ); ok( jq.is(".class4"), "Check is with carriage return" ); jq.removeClass("class2"); ok( jq.hasClass("class2") === false, "Check the class has been properly removed" ); jq.removeClass("cla"); ok( jq.hasClass("cla.ss3"), "Check the dotted class has not been removed" ); jq.removeClass("cla.ss3"); ok( jq.hasClass("cla.ss3") === false, "Check the dotted class has been removed" ); jq.removeClass("class4"); ok( jq.hasClass("class4") === false, "Check the class has been properly removed" ); }); test( "addClass, removeClass, hasClass on many elements", function() { expect( 19 ); var elem = jQuery( "

p0

p1

p2

" ); elem.addClass( "hi" ); equal( elem[ 0 ].className, "hi", "Check single added class" ); equal( elem[ 1 ].className, "hi", "Check single added class" ); equal( elem[ 2 ].className, "hi", "Check single added class" ); elem.addClass( "foo bar" ); equal( elem[ 0 ].className, "hi foo bar", "Check more added classes" ); equal( elem[ 1 ].className, "hi foo bar", "Check more added classes" ); equal( elem[ 2 ].className, "hi foo bar", "Check more added classes" ); elem.removeClass(); equal( elem[ 0 ].className, "", "Remove all classes" ); equal( elem[ 1 ].className, "", "Remove all classes" ); equal( elem[ 2 ].className, "", "Remove all classes" ); elem.addClass( "hi foo bar" ); elem.removeClass( "foo" ); equal( elem[ 0 ].className, "hi bar", "Check removal of one class" ); equal( elem[ 1 ].className, "hi bar", "Check removal of one class" ); equal( elem[ 2 ].className, "hi bar", "Check removal of one class" ); ok( elem.hasClass( "hi" ), "Check has1" ); ok( elem.hasClass( "bar" ), "Check has2" ); ok( jQuery( "

p0

p1

p2

" ).hasClass( "hi" ), "Did find a class in the first element" ); ok( jQuery( "

p0

p1

p2

" ).hasClass( "hi" ), "Did find a class in the second element" ); ok( jQuery( "

p0

p1

p2

" ).hasClass( "hi" ), "Did find a class in the last element" ); ok( jQuery( "

p0

p1

p2

" ).hasClass( "hi" ), "Did find a class when present in all elements" ); ok( !jQuery( "

p0

p1

p2

" ).hasClass( "hi" ), "Did not find a class when not present" ); }); test( "contents().hasClass() returns correct values", function() { expect( 2 ); var $div = jQuery("
text
"), $contents = $div.contents(); ok( $contents.hasClass("foo"), "Found 'foo' in $contents" ); ok( !$contents.hasClass("undefined"), "Did not find 'undefined' in $contents (correctly)" ); }); test( "hasClass correctly interprets non-space separators (#13835)", function() { expect( 4 ); var map = { tab: " ", "line-feed": " ", "form-feed": " ", "carriage-return": " " }, classes = jQuery.map( map, function( separator, label ) { return " " + separator + label + separator + " "; }), $div = jQuery( "
" ); jQuery.each( map, function( label ) { ok( $div.hasClass( label ), label.replace( "-", " " ) ); }); }); test( "coords returns correct values in IE6/IE7, see #10828", function() { expect( 1 ); var area, map = jQuery(""); area = map.html("a").find("area"); equal( area.attr("coords"), "0,0,0,0", "did not retrieve coords correctly" ); }); test( "should not throw at $(option).val() (#14686)", 1, function() { try { jQuery( "" ).val(); equal( val.length, 0, "Empty option should have no value" ); val = jQuery( "" ).val(); equal( val.length, 0, "insignificant white-space returned for value" ); val = jQuery( "" ).val(); equal( val.length, 4, "insignificant white-space returned for value" ); }); test( "SVG class manipulation (gh-2199)", function() { // Support: IE8 var svgSupport = !!document.createElementNS && !!document.createElementNS( "http://www.w3.org/2000/svg", "svg" ).createSVGRect; if ( !svgSupport ) { expect( 1 ); ok( true, "Environment doesn't support SVG" ); return; } expect( 12 ); function createSVGElement( nodeName ) { return document.createElementNS( "http://www.w3.org/2000/svg", nodeName ); } jQuery.each([ "svg", "rect", "g" ], function() { var elem = jQuery( createSVGElement( this ) ); elem.addClass( "awesome" ); ok( elem.hasClass( "awesome" ), "SVG element (" + this + ") has added class" ); elem.removeClass( "awesome" ); ok( !elem.hasClass( "awesome" ), "SVG element (" + this + ") removes the class" ); elem.toggleClass( "awesome" ); ok( elem.hasClass( "awesome" ), "SVG element (" + this + ") toggles the class on" ); elem.toggleClass( "awesome" ); ok( !elem.hasClass( "awesome" ), "SVG element (" + this + ") toggles the class off" ); }); });