2015-08-16 03:45:28 +00:00
QUnit . module ( "attributes" , {
2019-02-18 18:02:38 +00:00
afterEach : moduleTeardown
2015-08-16 06:59:58 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
2013-04-09 15:45:09 +00:00
function bareObj ( value ) {
2012-10-16 16:29:21 +00:00
return value ;
2013-04-09 15:45:09 +00:00
}
2009-04-20 17:05:18 +00:00
2013-04-09 15:45:09 +00:00
function functionReturningObj ( value ) {
return function ( ) {
2012-10-16 16:29:21 +00:00
return value ;
2013-04-09 15:45:09 +00:00
} ;
}
2009-12-10 04:57:19 +00:00
2018-01-02 21:45:10 +00:00
function arrayFromString ( value ) {
return value ? value . split ( " " ) : [ ] ;
}
2012-05-29 16:40:13 +00:00
/ *
=== === == 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
* /
2011-03-14 01:27:45 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "jQuery.propFix integrity test" , function ( assert ) {
assert . expect ( 1 ) ;
2011-08-05 14:02:33 +00:00
2011-03-25 05:46:29 +00:00
// 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.
2011-05-04 04:31:01 +00:00
var props = {
2012-07-05 19:52:13 +00:00
"tabindex" : "tabIndex" ,
"readonly" : "readOnly" ,
2011-10-22 20:03:57 +00:00
"for" : "htmlFor" ,
"class" : "className" ,
2012-07-05 19:52:13 +00:00
"maxlength" : "maxLength" ,
"cellspacing" : "cellSpacing" ,
"cellpadding" : "cellPadding" ,
"rowspan" : "rowSpan" ,
"colspan" : "colSpan" ,
"usemap" : "useMap" ,
"frameborder" : "frameBorder" ,
"contenteditable" : "contentEditable"
2011-10-22 20:03:57 +00:00
} ;
2015-08-16 03:45:28 +00:00
assert . deepEqual ( props , jQuery . propFix , "jQuery.propFix passes integrity check" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-11-09 21:31:52 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr(String)" , function ( assert ) {
assert . expect ( 50 ) ;
2010-12-30 06:34:48 +00:00
2013-04-09 15:45:09 +00:00
var extras , body , $body ,
select , optgroup , option , $img , styleElem ,
$button , $form , $a ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#text1" ) . attr ( "type" ) , "text" , "Check for type attribute" ) ;
assert . equal ( jQuery ( "#radio1" ) . attr ( "type" ) , "radio" , "Check for type attribute" ) ;
assert . equal ( jQuery ( "#check1" ) . attr ( "type" ) , "checkbox" , "Check for type attribute" ) ;
2024-08-12 18:01:19 +00:00
assert . equal ( jQuery ( "#john1" ) . attr ( "rel" ) , "bookmark" , "Check for rel attribute" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#google" ) . attr ( "title" ) , "Google!" , "Check for title attribute" ) ;
2024-08-12 18:01:19 +00:00
assert . equal ( jQuery ( "#mozilla" ) . attr ( "hreflang" ) , "en" , "Check for hreflang attribute" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#en" ) . attr ( "lang" ) , "en" , "Check for lang attribute" ) ;
2024-08-12 18:01:19 +00:00
assert . equal ( jQuery ( "#timmy" ) . attr ( "class" ) , "blog link" , "Check for class attribute" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#name" ) . attr ( "name" ) , "name" , "Check for name attribute" ) ;
assert . equal ( jQuery ( "#text1" ) . attr ( "name" ) , "action" , "Check for name attribute" ) ;
assert . ok ( jQuery ( "#form" ) . attr ( "action" ) . indexOf ( "formaction" ) >= 0 , "Check for action attribute" ) ;
assert . equal ( jQuery ( "#text1" ) . attr ( "value" , "t" ) . attr ( "value" ) , "t" , "Check setting the value attribute" ) ;
assert . equal ( jQuery ( "#text1" ) . attr ( "value" , "" ) . attr ( "value" ) , "" , "Check setting the value attribute to empty string" ) ;
assert . equal ( jQuery ( "<div value='t'></div>" ) . attr ( "value" ) , "t" , "Check setting custom attr named 'value' on a div" ) ;
assert . equal ( jQuery ( "#form" ) . attr ( "blah" , "blah" ) . attr ( "blah" ) , "blah" , "Set non-existent attribute on a form" ) ;
assert . equal ( jQuery ( "#foo" ) . attr ( "height" ) , undefined , "Non existent height attribute should return undefined" ) ;
2011-08-05 14:02:33 +00:00
2011-03-25 04:35:50 +00:00
// [7472] & [3113] (form contains an input with name="action" or name="id")
2015-08-16 06:59:58 +00:00
extras = jQuery ( "<input id='id' name='id' /><input id='name' name='name' /><input id='target' name='target' />" ) . appendTo ( "#testForm" ) ;
assert . equal ( jQuery ( "#form" ) . attr ( "action" , "newformaction" ) . attr ( "action" ) , "newformaction" , "Check that action attribute was changed" ) ;
assert . equal ( jQuery ( "#testForm" ) . attr ( "target" ) , undefined , "Retrieving target does not equal the input with name=target" ) ;
assert . equal ( jQuery ( "#testForm" ) . attr ( "target" , "newTarget" ) . attr ( "target" ) , "newTarget" , "Set target successfully on a form" ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( jQuery ( "#testForm" ) . removeAttr ( "id" ) . attr ( "id" ) , undefined , "Retrieving id does not equal the input with name=id after id is removed [trac-7472]" ) ;
2015-08-16 06:59:58 +00:00
2022-01-04 15:27:18 +00:00
// Bug trac-3685 (form contains input with name="name")
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#testForm" ) . attr ( "name" ) , undefined , "Retrieving name does not retrieve input with name=name" ) ;
2011-03-25 06:07:15 +00:00
extras . remove ( ) ;
2011-08-05 14:02:33 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#text1" ) . attr ( "maxlength" ) , "30" , "Check for maxlength attribute" ) ;
assert . equal ( jQuery ( "#text1" ) . attr ( "maxLength" ) , "30" , "Check for maxLength attribute" ) ;
assert . equal ( jQuery ( "#area1" ) . attr ( "maxLength" ) , "30" , "Check for maxLength attribute" ) ;
2009-03-18 21:15:38 +00:00
2010-08-26 16:36:50 +00:00
// using innerHTML in IE causes href attribute to be serialized to the full path
2020-03-16 20:49:29 +00:00
jQuery ( "<a></a>" ) . attr ( {
2012-10-16 16:29:21 +00:00
"id" : "tAnchor5" ,
"href" : "#5"
2015-08-16 06:59:58 +00:00
} ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( jQuery ( "#tAnchor5" ) . attr ( "href" ) , "#5" , "Check for non-absolute href (an anchor)" ) ;
2020-03-16 20:49:29 +00:00
jQuery ( "<a id='tAnchor6' href='#5'></a>" ) . appendTo ( "#qunit-fixture" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#tAnchor5" ) . prop ( "href" ) , jQuery ( "#tAnchor6" ) . prop ( "href" ) , "Check for absolute href prop on an anchor" ) ;
2012-11-28 02:32:59 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "<script type='jquery/test' src='#5' id='scriptSrc'></script>" ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( jQuery ( "#tAnchor5" ) . prop ( "href" ) , jQuery ( "#scriptSrc" ) . prop ( "src" ) , "Check for absolute src prop on a script" ) ;
2009-03-18 21:15:38 +00:00
2011-04-02 01:38:54 +00:00
// list attribute is readonly by default in browsers that support it
2015-08-16 06:59:58 +00:00
jQuery ( "#list-test" ) . attr ( "list" , "datalist" ) ;
assert . equal ( jQuery ( "#list-test" ) . attr ( "list" ) , "datalist" , "Check setting list attribute" ) ;
2011-04-02 01:38:54 +00:00
2009-03-18 21:15:38 +00:00
// Related to [5574] and [5683]
2013-04-09 15:45:09 +00:00
body = document . body ;
$body = jQuery ( body ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 06:59:58 +00:00
assert . strictEqual ( $body . attr ( "foo" ) , undefined , "Make sure that a non existent attribute returns undefined" ) ;
2009-05-02 21:14:38 +00:00
2012-10-16 16:29:21 +00:00
body . setAttribute ( "foo" , "baz" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $body . attr ( "foo" ) , "baz" , "Make sure the dom attribute is retrieved when no expando is found" ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
$body . attr ( "foo" , "cool" ) ;
assert . equal ( $body . attr ( "foo" ) , "cool" , "Make sure that setting works well when both expando and dom attribute are available" ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
body . removeAttribute ( "foo" ) ; // Cleanup
2009-12-22 20:02:52 +00:00
2015-08-16 06:59:58 +00:00
select = document . createElement ( "select" ) ;
optgroup = document . createElement ( "optgroup" ) ;
option = document . createElement ( "option" ) ;
2012-10-16 16:29:21 +00:00
2011-05-12 23:42:53 +00:00
optgroup . appendChild ( option ) ;
select . appendChild ( optgroup ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( option ) . prop ( "selected" ) , true , "Make sure that a single option is selected, even when in an optgroup." ) ;
2011-05-12 23:42:53 +00:00
2017-08-01 16:52:45 +00:00
$img = jQuery ( "<img style='display:none' width='215' height='53' src='" + baseURL + "1x1.jpg'/>" ) . appendTo ( "body" ) ;
2016-02-17 15:34:24 +00:00
assert . equal ( $img . attr ( "width" ) , "215" , "Retrieve width attribute on an element with display:none." ) ;
assert . equal ( $img . attr ( "height" ) , "53" , "Retrieve height attribute on an element with display:none." ) ;
2011-04-02 01:13:01 +00:00
2011-03-30 01:49:37 +00:00
// Check for style support
2020-03-16 20:49:29 +00:00
styleElem = jQuery ( "<div></div>" ) . appendTo ( "#qunit-fixture" ) . css ( {
2012-12-31 17:30:02 +00:00
background : "url(UPPERlower.gif)"
2015-08-16 06:59:58 +00:00
} ) ;
assert . ok ( ! ! ~ styleElem . attr ( "style" ) . indexOf ( "UPPERlower.gif" ) , "Check style attribute getter" ) ;
assert . ok ( ! ! ~ styleElem . attr ( "style" , "position:absolute;" ) . attr ( "style" ) . indexOf ( "absolute" ) , "Check style setter" ) ;
2011-04-02 01:13:01 +00:00
2022-01-04 15:27:18 +00:00
// Check value on button element (trac-1954)
2015-08-16 06:59:58 +00:00
$button = jQuery ( "<button>text</button>" ) . insertAfter ( "#button" ) ;
assert . strictEqual ( $button . attr ( "value" ) , undefined , "Absence of value attribute on a button" ) ;
assert . equal ( $button . attr ( "value" , "foobar" ) . attr ( "value" ) , "foobar" , "Value attribute on a button does not return innerHTML" ) ;
assert . equal ( $button . attr ( "value" , "baz" ) . html ( ) , "text" , "Setting the value attribute does not change innerHTML" ) ;
2011-04-17 22:15:20 +00:00
2022-01-04 15:27:18 +00:00
// Attributes with a colon on a table element (trac-1591)
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#table" ) . attr ( "test:attrib" ) , undefined , "Retrieving a non-existent attribute on a table with a colon does not throw an error." ) ;
assert . 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." ) ;
2011-05-01 21:09:50 +00:00
2015-08-16 06:59:58 +00:00
$form = jQuery ( "<form class='something'></form>" ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( $form . attr ( "class" ) , "something" , "Retrieve the class attribute on a form." ) ;
2011-05-16 14:17:50 +00:00
2015-08-16 06:59:58 +00:00
$a = jQuery ( "<a href='#' onclick='something()'>Click</a>" ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( $a . attr ( "onclick" ) , "something()" , "Retrieve ^on attribute without anonymous function wrapper." ) ;
2011-05-18 15:05:20 +00:00
2020-03-16 20:49:29 +00:00
assert . ok ( jQuery ( "<div></div>" ) . attr ( "doesntexist" ) === undefined , "Make sure undefined is returned when no attribute is found." ) ;
assert . ok ( jQuery ( "<div></div>" ) . attr ( "title" ) === undefined , "Make sure undefined is returned when no attribute is found." ) ;
assert . equal ( jQuery ( "<div></div>" ) . attr ( "title" , "something" ) . attr ( "title" ) , "something" , "Set the title attribute." ) ;
2015-08-16 06:59:58 +00:00
assert . ok ( jQuery ( ) . attr ( "doesntexist" ) === undefined , "Make sure undefined is returned when no element is there." ) ;
2020-03-16 20:49:29 +00:00
assert . equal ( jQuery ( "<div></div>" ) . attr ( "value" ) , undefined , "An unset value on a div returns undefined." ) ;
2015-08-16 06:59:58 +00:00
assert . strictEqual ( jQuery ( "<select><option value='property'></option></select>" ) . attr ( "value" ) , undefined , "An unset value on a select returns undefined." ) ;
2011-10-22 20:03:57 +00:00
2015-08-16 06:59:58 +00:00
$form = jQuery ( "#form" ) . attr ( "enctype" , "multipart/form-data" ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( $form . prop ( "enctype" ) , "multipart/form-data" , "Set the enctype of a form (encoding in IE6/7 trac-6743)" ) ;
2012-10-01 23:36:54 +00:00
2015-08-16 06:59:58 +00:00
} ) ;
2012-10-01 23:36:54 +00:00
2022-01-04 15:27:18 +00:00
QUnit . test ( "attr(String) on cloned elements, trac-9646" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 4 ) ;
2012-10-01 23:36:54 +00:00
var div ,
2015-08-16 06:59:58 +00:00
input = jQuery ( "<input name='tester' />" ) ;
2012-10-01 23:36:54 +00:00
2015-08-16 06:59:58 +00:00
input . attr ( "name" ) ;
2012-10-01 23:36:54 +00:00
2015-08-16 03:45:28 +00:00
assert . strictEqual ( input . clone ( true ) . attr ( "name" , "test" ) [ 0 ] . name , "test" , "Name attribute should be changed on cloned element" ) ;
2012-10-01 23:36:54 +00:00
2020-03-16 20:49:29 +00:00
div = jQuery ( "<div id='tester'></div>" ) ;
2015-08-16 06:59:58 +00:00
div . attr ( "id" ) ;
2012-10-01 23:36:54 +00:00
2015-08-16 03:45:28 +00:00
assert . strictEqual ( div . clone ( true ) . attr ( "id" , "test" ) [ 0 ] . id , "test" , "Id attribute should be changed on cloned element" ) ;
2012-10-01 23:36:54 +00:00
2015-08-16 06:59:58 +00:00
input = jQuery ( "<input value='tester' />" ) ;
input . attr ( "value" ) ;
2012-10-01 23:36:54 +00:00
2015-08-16 03:45:28 +00:00
assert . strictEqual ( input . clone ( true ) . attr ( "value" , "test" ) [ 0 ] . value , "test" , "Value attribute should be changed on cloned element" ) ;
2012-10-01 23:36:54 +00:00
2015-08-16 03:45:28 +00:00
assert . strictEqual ( input . clone ( true ) . attr ( "value" , 42 ) [ 0 ] . value , "42" , "Value attribute should be changed on cloned element" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr(String) in XML Files" , function ( assert ) {
assert . expect ( 3 ) ;
2012-04-15 21:41:54 +00:00
var xml = createDashboardXML ( ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "locations" , xml ) . attr ( "class" ) , "foo" , "Check class attribute in XML document" ) ;
assert . equal ( jQuery ( "location" , xml ) . attr ( "for" ) , "bar" , "Check for attribute in XML document" ) ;
assert . equal ( jQuery ( "location" , xml ) . attr ( "checked" ) , "different" , "Check that hooks are not attached in XML document" ) ;
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr(String, Function)" , function ( assert ) {
assert . expect ( 2 ) ;
2012-10-16 16:29:21 +00:00
2015-08-16 03:45:28 +00:00
assert . equal (
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . attr ( "value" , function ( ) {
2012-10-16 16:29:21 +00:00
return this . id ;
2015-08-16 06:59:58 +00:00
} ) . attr ( "value" ) ,
2012-10-16 16:29:21 +00:00
"text1" ,
"Set value from id"
) ;
2015-08-16 03:45:28 +00:00
assert . equal (
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . attr ( "title" , function ( i ) {
2012-10-16 16:29:21 +00:00
return i ;
2015-08-16 06:59:58 +00:00
} ) . attr ( "title" ) ,
2012-10-16 16:29:21 +00:00
"0" ,
"Set value with an index"
) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr(Hash)" , function ( assert ) {
assert . expect ( 3 ) ;
2009-03-18 21:15:38 +00:00
var pass = true ;
2016-02-14 21:18:21 +00:00
jQuery ( "#qunit-fixture div" ) . attr ( {
2012-10-16 16:29:21 +00:00
"foo" : "baz" ,
"zoo" : "ping"
2015-08-16 06:59:58 +00:00
} ) . each ( function ( ) {
if ( this . getAttribute ( "foo" ) !== "baz" && this . getAttribute ( "zoo" ) !== "ping" ) {
2012-06-21 19:30:24 +00:00
pass = false ;
}
2015-08-16 06:59:58 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
2015-08-16 03:45:28 +00:00
assert . ok ( pass , "Set Multiple Attributes" ) ;
2012-10-16 16:29:21 +00:00
2015-08-16 03:45:28 +00:00
assert . equal (
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . attr ( {
2012-10-16 16:29:21 +00:00
"value" : function ( ) {
2023-09-18 16:39:00 +00:00
return this . id ;
2015-08-16 06:59:58 +00:00
} } ) . attr ( "value" ) ,
2012-10-16 16:29:21 +00:00
"text1" ,
"Set attribute to computed value #1"
) ;
2015-08-16 03:45:28 +00:00
assert . equal (
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . attr ( {
"title" : function ( i ) {
2012-10-16 16:29:21 +00:00
return i ;
}
2015-08-16 06:59:58 +00:00
} ) . attr ( "title" ) ,
2012-10-16 16:29:21 +00:00
"0" ,
"Set attribute to computed value #2"
) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr(String, Object)" , function ( assert ) {
assert . expect ( 71 ) ;
2010-09-28 15:12:13 +00:00
2013-04-09 15:45:09 +00:00
var $input , $text , $details ,
attributeNode , commentNode , textNode , obj ,
2024-06-06 13:56:44 +00:00
table , td , j ,
2013-04-09 15:45:09 +00:00
check , thrown , button , $radio , $radios , $svg ,
2016-02-14 21:18:21 +00:00
div = jQuery ( "#qunit-fixture div" ) . attr ( "foo" , "bar" ) ,
2012-12-09 05:26:24 +00:00
i = 0 ,
2009-03-18 21:15:38 +00:00
fail = false ;
2010-09-28 15:12:13 +00:00
2012-12-09 05:26:24 +00:00
for ( ; i < div . length ; i ++ ) {
2015-08-16 06:59:58 +00:00
if ( div [ i ] . getAttribute ( "foo" ) !== "bar" ) {
2009-03-18 21:15:38 +00:00
fail = i ;
break ;
}
}
2010-09-28 15:12:13 +00:00
2015-08-16 03:45:28 +00:00
assert . equal ( fail , false , "Set Attribute, the #" + fail + " element didn't get the attribute 'foo'" ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
assert . ok (
2015-08-16 06:59:58 +00:00
jQuery ( "#foo" ) . attr ( {
2012-10-16 16:29:21 +00:00
"width" : null
2015-08-16 06:59:58 +00:00
} ) ,
2012-10-16 16:29:21 +00:00
"Try to set an attribute to nothing"
) ;
2009-03-18 21:15:38 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#name" ) . attr ( "name" , "something" ) ;
assert . equal ( jQuery ( "#name" ) . attr ( "name" ) , "something" , "Set name attribute" ) ;
jQuery ( "#name" ) . attr ( "name" , null ) ;
assert . equal ( jQuery ( "#name" ) . attr ( "name" ) , undefined , "Remove name attribute" ) ;
2012-12-09 05:26:24 +00:00
2013-04-09 15:45:09 +00:00
$input = jQuery ( "<input>" , {
2012-10-16 16:29:21 +00:00
name : "something" ,
id : "specified"
2015-08-16 06:59:58 +00:00
} ) ;
assert . equal ( $input . attr ( "name" ) , "something" , "Check element creation gets/sets the name attribute." ) ;
assert . equal ( $input . attr ( "id" ) , "specified" , "Check element creation gets/sets the id attribute." ) ;
2011-05-04 19:53:00 +00:00
2022-01-04 15:27:18 +00:00
// As of fixing trac-11115, we only guarantee boolean property update for checked and selected
2015-08-16 06:59:58 +00:00
$input = jQuery ( "<input type='checkbox'/>" ) . attr ( "checked" , true ) ;
assert . equal ( $input . prop ( "checked" ) , true , "Setting checked updates property (verified by .prop)" ) ;
assert . equal ( $input [ 0 ] . checked , true , "Setting checked updates property (verified by native property)" ) ;
2020-03-16 20:49:29 +00:00
$input = jQuery ( "<option></option>" ) . attr ( "selected" , true ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input . prop ( "selected" ) , true , "Setting selected updates property (verified by .prop)" ) ;
assert . equal ( $input [ 0 ] . selected , true , "Setting selected updates property (verified by native property)" ) ;
$input = jQuery ( "#check2" ) ;
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
$input . prop ( "checked" , true ) . prop ( "checked" , false ) . attr ( "checked" , "checked" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input . attr ( "checked" ) , "checked" , "Set checked (verified by .attr)" ) ;
2012-12-09 05:26:24 +00:00
$input . prop ( "checked" , false ) . prop ( "checked" , true ) . attr ( "checked" , false ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input . attr ( "checked" ) , undefined , "Remove checked (verified by .attr)" ) ;
2012-12-09 05:26:24 +00:00
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
$input = jQuery ( "#text1" ) . prop ( "readOnly" , true ) . prop ( "readOnly" , false ) . attr ( "readonly" , "readonly" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input . attr ( "readonly" ) , "readonly" , "Set readonly (verified by .attr)" ) ;
2012-12-09 05:26:24 +00:00
$input . prop ( "readOnly" , false ) . prop ( "readOnly" , true ) . attr ( "readonly" , false ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input . attr ( "readonly" ) , undefined , "Remove readonly (verified by .attr)" ) ;
2012-12-09 05:26:24 +00:00
2015-08-16 06:59:58 +00:00
$input = jQuery ( "#check2" ) . attr ( "checked" , true ) . attr ( "checked" , false ) . prop ( "checked" , true ) ;
assert . equal ( $input [ 0 ] . checked , true , "Set checked property (verified by native property)" ) ;
assert . equal ( $input . prop ( "checked" ) , true , "Set checked property (verified by .prop)" ) ;
assert . equal ( $input . attr ( "checked" ) , undefined , "Setting checked property doesn't affect checked attribute" ) ;
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
$input . attr ( "checked" , false ) . attr ( "checked" , "checked" ) . prop ( "checked" , false ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input [ 0 ] . checked , false , "Clear checked property (verified by native property)" ) ;
assert . equal ( $input . prop ( "checked" ) , false , "Clear checked property (verified by .prop)" ) ;
assert . equal ( $input . attr ( "checked" ) , "checked" , "Clearing checked property doesn't affect checked attribute" ) ;
2012-12-09 05:26:24 +00:00
2015-08-16 06:59:58 +00:00
$input = jQuery ( "#check2" ) . attr ( "checked" , false ) . attr ( "checked" , "checked" ) ;
assert . equal ( $input . attr ( "checked" ) , "checked" , "Set checked to 'checked' (verified by .attr)" ) ;
2011-09-14 18:25:14 +00:00
2015-08-16 06:59:58 +00:00
$radios = jQuery ( "#checkedtest" ) . find ( "input[type='radio']" ) ;
$radios . eq ( 1 ) . trigger ( "click" ) ;
assert . equal ( $radios . eq ( 1 ) . prop ( "checked" ) , true , "Second radio was checked when clicked" ) ;
assert . equal ( $radios . eq ( 0 ) . attr ( "checked" ) , "checked" , "First radio is still [checked]" ) ;
2012-12-09 05:26:24 +00:00
2015-08-16 06:59:58 +00:00
$input = jQuery ( "#text1" ) . attr ( "readonly" , false ) . prop ( "readOnly" , true ) ;
assert . equal ( $input [ 0 ] . readOnly , true , "Set readonly property (verified by native property)" ) ;
assert . equal ( $input . prop ( "readOnly" ) , true , "Set readonly property (verified by .prop)" ) ;
2012-12-09 05:26:24 +00:00
$input . attr ( "readonly" , true ) . prop ( "readOnly" , false ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input [ 0 ] . readOnly , false , "Clear readonly property (verified by native property)" ) ;
assert . equal ( $input . prop ( "readOnly" ) , false , "Clear readonly property (verified by .prop)" ) ;
2012-12-09 05:26:24 +00:00
2015-08-16 06:59:58 +00:00
$input = jQuery ( "#name" ) . attr ( "maxlength" , "5" ) ;
assert . equal ( $input [ 0 ] . maxLength , 5 , "Set maxlength (verified by native property)" ) ;
2012-12-09 05:26:24 +00:00
$input . attr ( "maxLength" , "10" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $input [ 0 ] . maxLength , 10 , "Set maxlength (verified by native property)" ) ;
2011-04-23 21:07:31 +00:00
2011-07-09 18:41:58 +00:00
// HTML5 boolean attributes
2015-08-16 06:59:58 +00:00
$text = jQuery ( "#text1" ) . attr ( {
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
"autofocus" : "autofocus" ,
"required" : "required"
2015-08-16 06:59:58 +00:00
} ) ;
assert . equal ( $text . attr ( "autofocus" ) , "autofocus" , "Reading autofocus attribute yields 'autofocus'" ) ;
assert . equal ( $text . attr ( "autofocus" , false ) . attr ( "autofocus" ) , undefined , "Setting autofocus to false removes it" ) ;
assert . equal ( $text . attr ( "required" ) , "required" , "Reading required attribute yields 'required'" ) ;
assert . equal ( $text . attr ( "required" , false ) . attr ( "required" ) , undefined , "Setting required attribute to false removes it" ) ;
2011-07-09 18:41:58 +00:00
2015-08-16 06:59:58 +00:00
$details = jQuery ( "<details open></details>" ) . appendTo ( "#qunit-fixture" ) ;
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
assert . equal ( $details . attr ( "open" ) , "" , "open attribute presence indicates true" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $details . attr ( "open" , false ) . attr ( "open" ) , undefined , "Setting open attribute to false removes it" ) ;
2011-07-09 18:41:58 +00:00
2012-10-16 16:29:21 +00:00
$text . attr ( "data-something" , true ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $text . attr ( "data-something" ) , "true" , "Set data attributes" ) ;
assert . equal ( $text . data ( "something" ) , true , "Setting data attributes are not affected by boolean settings" ) ;
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
$text . attr ( "data-another" , "false" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $text . attr ( "data-another" ) , "false" , "Set data attributes" ) ;
assert . equal ( $text . data ( "another" ) , false , "Setting data attributes are not affected by boolean settings" ) ;
assert . equal ( $text . attr ( "aria-disabled" , false ) . attr ( "aria-disabled" ) , "false" , "Setting aria attributes are not affected by boolean settings" ) ;
$text . removeData ( "something" ) . removeData ( "another" ) . removeAttr ( "aria-disabled" ) ;
2011-04-23 21:07:31 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#foo" ) . attr ( "contenteditable" , true ) ;
assert . equal ( jQuery ( "#foo" ) . attr ( "contenteditable" ) , "true" , "Enumerated attributes are set properly" ) ;
2011-05-05 16:52:04 +00:00
2015-08-16 06:59:58 +00:00
attributeNode = document . createAttribute ( "irrelevant" ) ;
commentNode = document . createComment ( "some comment" ) ;
textNode = document . createTextNode ( "some text" ) ;
2013-04-09 15:45:09 +00:00
obj = { } ;
2011-08-05 14:02:33 +00:00
2012-10-16 16:29:21 +00:00
jQuery . each ( [ commentNode , textNode , attributeNode ] , function ( i , elem ) {
2011-05-10 04:27:52 +00:00
var $elem = jQuery ( elem ) ;
$elem . attr ( "nonexisting" , "foo" ) ;
2022-01-04 15:27:18 +00:00
assert . strictEqual ( $elem . attr ( "nonexisting" ) , undefined , "attr(name, value) works correctly on comment and text nodes (bug trac-7500)." ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2011-05-10 04:27:52 +00:00
2012-10-16 16:29:21 +00:00
jQuery . each ( [ window , document , obj , "#firstp" ] , function ( i , elem ) {
2012-12-09 05:26:24 +00:00
var oldVal = elem . nonexisting ,
2012-11-03 04:06:50 +00:00
$elem = jQuery ( elem ) ;
2022-01-04 15:27:18 +00:00
assert . strictEqual ( $elem . attr ( "nonexisting" ) , undefined , "attr works correctly for non existing attributes (bug trac-7500)." ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $elem . attr ( "nonexisting" , "foo" ) . attr ( "nonexisting" ) , "foo" , "attr falls back to prop on unsupported arguments" ) ;
2012-12-09 05:26:24 +00:00
elem . nonexisting = oldVal ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-11-13 13:39:28 +00:00
2014-02-18 17:46:00 +00:00
// Register the property on the window for the previous assertion so it will be clean up
Globals . register ( "nonexisting" ) ;
2015-08-16 06:59:58 +00:00
table = jQuery ( "#table" ) . append ( "<tr><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr><tr><td>cell</td><td>cell</td></tr>" ) ;
td = table . find ( "td" ) . eq ( 0 ) ;
2012-10-16 16:29:21 +00:00
td . attr ( "rowspan" , "2" ) ;
2023-09-18 16:39:00 +00:00
assert . equal ( td [ 0 ] . rowSpan , 2 , "Check rowspan is correctly set" ) ;
2012-10-16 16:29:21 +00:00
td . attr ( "colspan" , "2" ) ;
2023-09-18 16:39:00 +00:00
assert . equal ( td [ 0 ] . colSpan , 2 , "Check colspan is correctly set" ) ;
2015-08-16 06:59:58 +00:00
table . attr ( "cellspacing" , "2" ) ;
2023-09-18 16:39:00 +00:00
assert . equal ( table [ 0 ] . cellSpacing , "2" , "Check cellspacing is correctly set" ) ;
2009-05-16 15:10:24 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#area1" ) . attr ( "value" ) , undefined , "Value attribute is distinct from value property." ) ;
2011-05-08 02:01:10 +00:00
2022-01-04 15:27:18 +00:00
// for trac-1070
2015-08-16 06:59:58 +00:00
jQuery ( "#name" ) . attr ( "someAttr" , "0" ) ;
assert . equal ( jQuery ( "#name" ) . attr ( "someAttr" ) , "0" , "Set attribute to a string of '0'" ) ;
jQuery ( "#name" ) . attr ( "someAttr" , 0 ) ;
assert . equal ( jQuery ( "#name" ) . attr ( "someAttr" ) , "0" , "Set attribute to the number 0" ) ;
jQuery ( "#name" ) . attr ( "someAttr" , 1 ) ;
assert . equal ( jQuery ( "#name" ) . attr ( "someAttr" ) , "1" , "Set attribute to the number 1" ) ;
2009-03-18 21:15:38 +00:00
// using contents will get comments regular, text, and comment nodes
2015-08-16 06:59:58 +00:00
j = jQuery ( "#nonnodes" ) . contents ( ) ;
2009-03-18 21:15:38 +00:00
2012-10-16 16:29:21 +00:00
j . attr ( "name" , "attrvalue" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( j . attr ( "name" ) , "attrvalue" , "Check node,textnode,comment for attr" ) ;
j . removeAttr ( "name" ) ;
2009-03-18 21:15:38 +00:00
2011-03-25 14:40:46 +00:00
// Type
2009-03-18 21:15:38 +00:00
try {
2015-08-16 06:59:58 +00:00
jQuery ( "#check2" ) . attr ( "type" , "hidden" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( true , "No exception thrown on input type change" ) ;
2015-08-16 06:59:58 +00:00
} catch ( e ) {
2015-08-16 03:45:28 +00:00
assert . ok ( true , "Exception thrown on input type change: " + e ) ;
2009-03-18 21:15:38 +00:00
}
2015-08-16 06:59:58 +00:00
check = document . createElement ( "input" ) ;
2013-04-09 15:45:09 +00:00
thrown = true ;
2009-03-18 21:15:38 +00:00
try {
2012-10-16 16:29:21 +00:00
jQuery ( check ) . attr ( "type" , "checkbox" ) ;
2015-08-16 06:59:58 +00:00
} catch ( e ) {
2009-03-18 21:15:38 +00:00
thrown = false ;
}
2015-08-16 03:45:28 +00:00
assert . ok ( thrown , "Exception thrown when trying to change type property" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( "checkbox" , jQuery ( check ) . attr ( "type" ) , "Verify that you can change the type of an input element that isn't in the DOM" ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
check = jQuery ( "<input />" ) ;
2011-09-14 18:25:14 +00:00
thrown = true ;
2009-03-18 21:15:38 +00:00
try {
2012-10-16 16:29:21 +00:00
check . attr ( "type" , "checkbox" ) ;
2015-08-16 06:59:58 +00:00
} catch ( e ) {
2009-03-18 21:15:38 +00:00
thrown = false ;
}
2015-08-16 03:45:28 +00:00
assert . ok ( thrown , "Exception thrown when trying to change type property" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( "checkbox" , check . attr ( "type" ) , "Verify that you can change the type of an input element that isn't in the DOM" ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
button = jQuery ( "#button" ) ;
2009-03-18 21:15:38 +00:00
try {
2012-10-16 16:29:21 +00:00
button . attr ( "type" , "submit" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( true , "No exception thrown on button type change" ) ;
2015-08-16 06:59:58 +00:00
} catch ( e ) {
2015-08-16 03:45:28 +00:00
assert . ok ( true , "Exception thrown on button type change: " + e ) ;
2009-03-18 21:15:38 +00:00
}
2011-04-22 01:33:09 +00:00
2013-04-09 15:45:09 +00:00
$radio = jQuery ( "<input>" , {
2012-10-16 16:29:21 +00:00
"value" : "sup" ,
2023-09-18 16:39:00 +00:00
2015-11-30 16:30:31 +00:00
// Use uppercase here to ensure the type
// attrHook is still used
"TYPE" : "radio"
2015-08-16 06:59:58 +00:00
} ) . appendTo ( "#testForm" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( $radio . val ( ) , "sup" , "Value is not reset when type is set after value on a radio" ) ;
2011-04-22 01:33:09 +00:00
2022-01-04 15:27:18 +00:00
// Setting attributes on svg elements (bug trac-3116)
2013-04-09 15:45:09 +00:00
$svg = jQuery (
2013-03-13 01:06:25 +00:00
"<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' baseProfile='full' width='200' height='200'>" +
2012-06-21 19:30:24 +00:00
"<circle cx='200' cy='200' r='150' />" +
"</svg>"
2015-08-16 06:59:58 +00:00
) . appendTo ( "body" ) ;
assert . equal ( $svg . attr ( "cx" , 100 ) . attr ( "cx" ) , "100" , "Set attribute on svg element" ) ;
2011-03-25 14:40:46 +00:00
$svg . remove ( ) ;
2011-12-06 20:25:38 +00:00
// undefined values are chainable
2015-08-16 06:59:58 +00:00
jQuery ( "#name" ) . attr ( "maxlength" , "5" ) . removeAttr ( "nonexisting" ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( typeof jQuery ( "#name" ) . attr ( "maxlength" , undefined ) , "object" , ".attr('attribute', undefined) is chainable (trac-5571)" ) ;
assert . equal ( jQuery ( "#name" ) . attr ( "maxlength" , undefined ) . attr ( "maxlength" ) , "5" , ".attr('attribute', undefined) does not change value (trac-5571)" ) ;
assert . equal ( jQuery ( "#name" ) . attr ( "nonexisting" , undefined ) . attr ( "nonexisting" ) , undefined , ".attr('attribute', undefined) does not create attribute (trac-5571)" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-11-30 16:30:31 +00:00
QUnit . test ( "attr(non-ASCII)" , function ( assert ) {
assert . expect ( 2 ) ;
var $div = jQuery ( "<div Ω='omega' aØc='alpha'></div>" ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( $div . attr ( "Ω" ) , "omega" , ".attr() exclusively lowercases characters in the range A-Z (gh-2730)" ) ;
assert . equal ( $div . attr ( "AØC" ) , "alpha" , ".attr() exclusively lowercases characters in the range A-Z (gh-2730)" ) ;
} ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr(String, Object) - Loaded via XML document" , function ( assert ) {
assert . expect ( 2 ) ;
2013-04-09 15:45:09 +00:00
var xml = createDashboardXML ( ) ,
titles = [ ] ;
2015-08-16 06:59:58 +00:00
jQuery ( "tab" , xml ) . each ( function ( ) {
titles . push ( jQuery ( this ) . attr ( "title" ) ) ;
} ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( titles [ 0 ] , "Location" , "attr() in XML context: Check first title" ) ;
assert . equal ( titles [ 1 ] , "Users" , "attr() in XML context: Check second title" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr(String, Object) - Loaded via XML fragment" , function ( assert ) {
assert . expect ( 2 ) ;
2012-10-15 18:20:36 +00:00
var frag = createXMLFragment ( ) ,
$frag = jQuery ( frag ) ;
$frag . attr ( "test" , "some value" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $frag . attr ( "test" ) , "some value" , "set attribute" ) ;
2012-10-15 18:20:36 +00:00
$frag . attr ( "test" , null ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $frag . attr ( "test" ) , undefined , "remove attribute" ) ;
} ) ;
2012-10-15 18:20:36 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr('tabindex')" , function ( assert ) {
assert . expect ( 8 ) ;
2009-03-18 21:15:38 +00:00
// elements not natively tabbable
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#listWithTabIndex" ) . attr ( "tabindex" ) , "5" , "not natively tabbable, with tabindex set to 0" ) ;
assert . equal ( jQuery ( "#divWithNoTabIndex" ) . attr ( "tabindex" ) , undefined , "not natively tabbable, no tabindex set" ) ;
2009-05-02 21:14:38 +00:00
2009-03-18 21:15:38 +00:00
// anchor with href
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#linkWithNoTabIndex" ) . attr ( "tabindex" ) , undefined , "anchor with href, no tabindex set" ) ;
assert . equal ( jQuery ( "#linkWithTabIndex" ) . attr ( "tabindex" ) , "2" , "anchor with href, tabindex set to 2" ) ;
assert . equal ( jQuery ( "#linkWithNegativeTabIndex" ) . attr ( "tabindex" ) , "-1" , "anchor with href, tabindex set to -1" ) ;
2009-03-18 21:15:38 +00:00
// anchor without href
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#linkWithNoHrefWithNoTabIndex" ) . attr ( "tabindex" ) , undefined , "anchor without href, no tabindex set" ) ;
assert . equal ( jQuery ( "#linkWithNoHrefWithTabIndex" ) . attr ( "tabindex" ) , "1" , "anchor without href, tabindex set to 2" ) ;
assert . equal ( jQuery ( "#linkWithNoHrefWithNegativeTabIndex" ) . attr ( "tabindex" ) , "-1" , "anchor without href, no tabindex set" ) ;
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "attr('tabindex', value)" , function ( assert ) {
assert . expect ( 9 ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 06:59:58 +00:00
var element = jQuery ( "#divWithNoTabIndex" ) ;
assert . equal ( element . attr ( "tabindex" ) , undefined , "start with no tabindex" ) ;
2009-03-18 21:15:38 +00:00
// set a positive string
2012-10-16 16:29:21 +00:00
element . attr ( "tabindex" , "1" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . attr ( "tabindex" ) , "1" , "set tabindex to 1 (string)" ) ;
2009-03-18 21:15:38 +00:00
// set a zero string
2012-10-16 16:29:21 +00:00
element . attr ( "tabindex" , "0" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . attr ( "tabindex" ) , "0" , "set tabindex to 0 (string)" ) ;
2009-03-18 21:15:38 +00:00
// set a negative string
2012-10-16 16:29:21 +00:00
element . attr ( "tabindex" , "-1" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . attr ( "tabindex" ) , "-1" , "set tabindex to -1 (string)" ) ;
2009-05-02 21:14:38 +00:00
2009-03-18 21:15:38 +00:00
// set a positive number
2012-10-16 16:29:21 +00:00
element . attr ( "tabindex" , 1 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . attr ( "tabindex" ) , "1" , "set tabindex to 1 (number)" ) ;
2009-03-18 21:15:38 +00:00
// set a zero number
2012-10-16 16:29:21 +00:00
element . attr ( "tabindex" , 0 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . attr ( "tabindex" ) , "0" , "set tabindex to 0 (number)" ) ;
2009-03-18 21:15:38 +00:00
// set a negative number
2012-10-16 16:29:21 +00:00
element . attr ( "tabindex" , - 1 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . attr ( "tabindex" ) , "-1" , "set tabindex to -1 (number)" ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
element = jQuery ( "#linkWithTabIndex" ) ;
assert . equal ( element . attr ( "tabindex" ) , "2" , "start with tabindex 2" ) ;
2009-03-18 21:15:38 +00:00
2012-10-16 16:29:21 +00:00
element . attr ( "tabindex" , - 1 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . attr ( "tabindex" ) , "-1" , "set negative tabindex" ) ;
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeAttr(String)" , function ( assert ) {
2015-10-26 15:38:04 +00:00
assert . expect ( 12 ) ;
2011-10-17 20:45:27 +00:00
var $first ;
2020-03-16 20:49:29 +00:00
assert . equal ( jQuery ( "<div class='hello'></div>" ) . removeAttr ( "class" ) . attr ( "class" ) , undefined , "remove class" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#form" ) . removeAttr ( "id" ) . attr ( "id" ) , undefined , "Remove id" ) ;
assert . equal ( jQuery ( "#foo" ) . attr ( "style" , "position:absolute;" ) . removeAttr ( "style" ) . attr ( "style" ) , undefined , "Check removing style attribute" ) ;
assert . equal ( jQuery ( "#form" ) . attr ( "style" , "position:absolute;" ) . removeAttr ( "style" ) . attr ( "style" ) , undefined , "Check removing style attribute on a form" ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( jQuery ( "<div style='position: absolute'></div>" ) . appendTo ( "#foo" ) . removeAttr ( "style" ) . prop ( "style" ) . cssText , "" , "Check removing style attribute (trac-9699 Webkit)" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#fx-test-group" ) . attr ( "height" , "3px" ) . removeAttr ( "height" ) . get ( 0 ) . style . height , "1px" , "Removing height attribute has no effect on height set with style attribute" ) ;
2011-08-05 14:02:33 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#check1" ) . removeAttr ( "checked" ) . prop ( "checked" , true ) . removeAttr ( "checked" ) ;
2015-10-18 21:21:41 +00:00
assert . equal ( document . getElementById ( "check1" ) . checked , true , "removeAttr should not set checked to false, since the checked attribute does NOT mirror the checked property" ) ;
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . prop ( "readOnly" , true ) . removeAttr ( "readonly" ) ;
assert . equal ( document . getElementById ( "text1" ) . readOnly , false , "removeAttr sets boolean properties to false" ) ;
2011-10-06 21:17:51 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#option2c" ) . removeAttr ( "selected" ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( jQuery ( "#option2d" ) . attr ( "selected" ) , "selected" , "Removing `selected` from an option that is not selected does not remove selected from the currently selected option (trac-10870)" ) ;
2012-03-05 17:54:44 +00:00
2011-10-06 21:17:51 +00:00
try {
2015-08-16 06:59:58 +00:00
$first = jQuery ( "#first" ) . attr ( "contenteditable" , "true" ) . removeAttr ( "contenteditable" ) ;
assert . equal ( $first . attr ( "contenteditable" ) , undefined , "Remove the contenteditable attribute" ) ;
} catch ( e ) {
2022-01-04 15:27:18 +00:00
assert . ok ( false , "Removing contenteditable threw an error (trac-10429)" ) ;
2011-10-06 21:17:51 +00:00
}
2012-10-16 14:17:14 +00:00
2015-08-16 06:59:58 +00:00
$first = jQuery ( "<div Case='mixed'></div>" ) ;
assert . equal ( $first . attr ( "Case" ) , "mixed" , "case of attribute doesn't matter" ) ;
$first . removeAttr ( "Case" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( $first . attr ( "Case" ) , undefined , "mixed-case attribute was removed" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2012-07-12 02:46:34 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeAttr(String) in XML" , function ( assert ) {
assert . expect ( 7 ) ;
2012-07-12 02:46:34 +00:00
var xml = createDashboardXML ( ) ,
iwt = jQuery ( "infowindowtab" , xml ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( iwt . attr ( "normal" ) , "ab" , "Check initial value" ) ;
iwt . removeAttr ( "Normal" ) ;
assert . equal ( iwt . attr ( "normal" ) , "ab" , "Should still be there" ) ;
iwt . removeAttr ( "normal" ) ;
assert . equal ( iwt . attr ( "normal" ) , undefined , "Removed" ) ;
2012-07-12 02:46:34 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( iwt . attr ( "mixedCase" ) , "yes" , "Check initial value" ) ;
assert . equal ( iwt . attr ( "mixedcase" ) , undefined , "toLowerCase not work good" ) ;
iwt . removeAttr ( "mixedcase" ) ;
assert . equal ( iwt . attr ( "mixedCase" ) , "yes" , "Should still be there" ) ;
iwt . removeAttr ( "mixedCase" ) ;
assert . equal ( iwt . attr ( "mixedCase" ) , undefined , "Removed" ) ;
} ) ;
2011-03-08 17:07:05 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeAttr(Multi String, variable space width)" , function ( assert ) {
assert . expect ( 8 ) ;
2011-11-13 08:10:21 +00:00
2015-08-16 06:59:58 +00:00
var div = jQuery ( "<div id='a' alt='b' title='c' rel='d'></div>" ) ,
2011-11-13 08:10:21 +00:00
tests = {
id : "a" ,
alt : "b" ,
title : "c" ,
rel : "d"
} ;
jQuery . each ( tests , function ( key , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( div . attr ( key ) , val , "Attribute `" + key + "` exists, and has a value of `" + val + "`" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2011-11-13 08:10:21 +00:00
2011-11-14 17:24:58 +00:00
div . removeAttr ( "id alt title rel " ) ;
2011-11-13 08:10:21 +00:00
2013-04-09 15:45:09 +00:00
jQuery . each ( tests , function ( key ) {
2015-08-16 03:45:28 +00:00
assert . equal ( div . attr ( key ) , undefined , "Attribute `" + key + "` was removed" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
} ) ;
2011-11-13 08:10:21 +00:00
2016-09-12 16:32:02 +00:00
QUnit . test ( "removeAttr(Multi String, non-HTML whitespace is valid in attribute names (gh-3003)" , function ( assert ) {
assert . expect ( 8 ) ;
var div = jQuery ( "<div id='a' data-\xA0='b' title='c' rel='d'></div>" ) ;
var tests = {
id : "a" ,
"data-\xA0" : "b" ,
title : "c" ,
rel : "d"
} ;
jQuery . each ( tests , function ( key , val ) {
assert . equal ( div . attr ( key ) , val , "Attribute \"" + key + "\" exists, and has a value of \"" + val + "\"" ) ;
} ) ;
div . removeAttr ( "id data-\xA0 title rel " ) ;
jQuery . each ( tests , function ( key ) {
assert . equal ( div . attr ( key ) , undefined , "Attribute \"" + key + "\" was removed" ) ;
} ) ;
} ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "prop(String, Object)" , function ( assert ) {
2013-12-11 16:34:05 +00:00
2015-08-16 03:45:28 +00:00
assert . expect ( 17 ) ;
2011-05-04 04:31:01 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#text1" ) . prop ( "value" ) , "Test" , "Check for value attribute" ) ;
assert . equal ( jQuery ( "#text1" ) . prop ( "value" , "Test2" ) . prop ( "defaultValue" ) , "Test" , "Check for defaultValue attribute" ) ;
assert . equal ( jQuery ( "#select2" ) . prop ( "selectedIndex" ) , 3 , "Check for selectedIndex attribute" ) ;
assert . equal ( jQuery ( "#foo" ) . prop ( "nodeName" ) . toUpperCase ( ) , "DIV" , "Check for nodeName attribute" ) ;
assert . equal ( jQuery ( "#foo" ) . prop ( "tagName" ) . toUpperCase ( ) , "DIV" , "Check for tagName attribute" ) ;
2020-03-16 20:49:29 +00:00
assert . equal ( jQuery ( "<option></option>" ) . prop ( "selected" ) , false , "Check selected attribute on disconnected element." ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#listWithTabIndex" ) . prop ( "tabindex" ) , 5 , "Check retrieving tabindex" ) ;
jQuery ( "#text1" ) . prop ( "readonly" , true ) ;
assert . equal ( document . getElementById ( "text1" ) . readOnly , true , "Check setting readOnly property with 'readonly'" ) ;
assert . equal ( jQuery ( "#label-for" ) . prop ( "for" ) , "action" , "Check retrieving htmlFor" ) ;
jQuery ( "#text1" ) . prop ( "class" , "test" ) ;
assert . equal ( document . getElementById ( "text1" ) . className , "test" , "Check setting className with 'class'" ) ;
assert . equal ( jQuery ( "#text1" ) . prop ( "maxlength" ) , 30 , "Check retrieving maxLength" ) ;
jQuery ( "#table" ) . prop ( "cellspacing" , 1 ) ;
assert . equal ( jQuery ( "#table" ) . prop ( "cellSpacing" ) , "1" , "Check setting and retrieving cellSpacing" ) ;
jQuery ( "#table" ) . prop ( "cellpadding" , 1 ) ;
assert . equal ( jQuery ( "#table" ) . prop ( "cellPadding" ) , "1" , "Check setting and retrieving cellPadding" ) ;
jQuery ( "#table" ) . prop ( "rowspan" , 1 ) ;
assert . equal ( jQuery ( "#table" ) . prop ( "rowSpan" ) , 1 , "Check setting and retrieving rowSpan" ) ;
jQuery ( "#table" ) . prop ( "colspan" , 1 ) ;
assert . equal ( jQuery ( "#table" ) . prop ( "colSpan" ) , 1 , "Check setting and retrieving colSpan" ) ;
jQuery ( "#table" ) . prop ( "usemap" , 1 ) ;
assert . equal ( jQuery ( "#table" ) . prop ( "useMap" ) , 1 , "Check setting and retrieving useMap" ) ;
jQuery ( "#table" ) . prop ( "frameborder" , 1 ) ;
assert . equal ( jQuery ( "#table" ) . prop ( "frameBorder" ) , 1 , "Check setting and retrieving frameBorder" ) ;
} ) ;
2013-12-11 16:34:05 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "prop(String, Object) on null/undefined" , function ( assert ) {
2013-12-11 16:34:05 +00:00
2015-08-16 03:45:28 +00:00
assert . expect ( 14 ) ;
2011-05-04 04:31:01 +00:00
2013-04-09 15:45:09 +00:00
var select , optgroup , option , attributeNode , commentNode , textNode , obj , $form ,
body = document . body ,
2011-10-22 20:03:57 +00:00
$body = jQuery ( body ) ;
2015-08-16 06:59:58 +00:00
assert . ok ( $body . prop ( "nextSibling" ) === null , "Make sure a null expando returns null" ) ;
2023-09-18 16:39:00 +00:00
body . foo = "bar" ;
2015-08-16 06:59:58 +00:00
assert . equal ( $body . prop ( "foo" ) , "bar" , "Make sure the expando is preferred over the dom attribute" ) ;
2023-09-18 16:39:00 +00:00
body . foo = undefined ;
2015-08-16 06:59:58 +00:00
assert . ok ( $body . prop ( "foo" ) === undefined , "Make sure the expando is preferred over the dom attribute, even if undefined" ) ;
2011-05-04 04:31:01 +00:00
2015-08-16 06:59:58 +00:00
select = document . createElement ( "select" ) ;
optgroup = document . createElement ( "optgroup" ) ;
option = document . createElement ( "option" ) ;
2012-10-16 16:29:21 +00:00
2011-05-04 04:31:01 +00:00
optgroup . appendChild ( option ) ;
select . appendChild ( optgroup ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( option ) . prop ( "selected" ) , true , "Make sure that a single option is selected, even when in an optgroup." ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( jQuery ( document ) . prop ( "nodeName" ) , "#document" , "prop works correctly on document nodes (bug trac-7451)." ) ;
2011-05-04 04:31:01 +00:00
2015-08-16 06:59:58 +00:00
attributeNode = document . createAttribute ( "irrelevant" ) ;
commentNode = document . createComment ( "some comment" ) ;
textNode = document . createTextNode ( "some text" ) ;
2013-04-09 15:45:09 +00:00
obj = { } ;
2012-10-16 16:29:21 +00:00
jQuery . each ( [ document , attributeNode , commentNode , textNode , obj , "#firstp" ] , function ( i , ele ) {
2022-01-04 15:27:18 +00:00
assert . strictEqual ( jQuery ( ele ) . prop ( "nonexisting" ) , undefined , "prop works correctly for non existing attributes (bug trac-7500)." ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2011-05-04 04:31:01 +00:00
2011-10-22 20:03:57 +00:00
obj = { } ;
2012-10-16 16:29:21 +00:00
jQuery . each ( [ document , obj ] , function ( i , ele ) {
2011-05-04 04:31:01 +00:00
var $ele = jQuery ( ele ) ;
$ele . prop ( "nonexisting" , "foo" ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( $ele . prop ( "nonexisting" ) , "foo" , "prop(name, value) works correctly for non existing attributes (bug trac-7500)." ) ;
2015-08-16 06:59:58 +00:00
} ) ;
jQuery ( document ) . removeProp ( "nonexisting" ) ;
2011-10-22 20:03:57 +00:00
2015-08-16 06:59:58 +00:00
$form = jQuery ( "#form" ) . prop ( "enctype" , "multipart/form-data" ) ;
2022-01-04 15:27:18 +00:00
assert . equal ( $form . prop ( "enctype" ) , "multipart/form-data" , "Set the enctype of a form (encoding in IE6/7 trac-6743)" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2011-05-04 04:31:01 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "prop('tabindex')" , function ( assert ) {
assert . expect ( 11 ) ;
2013-04-09 01:33:17 +00:00
// inputs without tabIndex attribute
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#inputWithoutTabIndex" ) . prop ( "tabindex" ) , 0 , "input without tabindex" ) ;
assert . equal ( jQuery ( "#buttonWithoutTabIndex" ) . prop ( "tabindex" ) , 0 , "button without tabindex" ) ;
assert . equal ( jQuery ( "#textareaWithoutTabIndex" ) . prop ( "tabindex" ) , 0 , "textarea without tabindex" ) ;
2011-08-04 19:47:53 +00:00
// elements not natively tabbable
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#listWithTabIndex" ) . prop ( "tabindex" ) , 5 , "not natively tabbable, with tabindex set to 0" ) ;
assert . equal ( jQuery ( "#divWithNoTabIndex" ) . prop ( "tabindex" ) , - 1 , "not natively tabbable, no tabindex set" ) ;
2011-08-04 19:47:53 +00:00
// anchor with href
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#linkWithNoTabIndex" ) . prop ( "tabindex" ) , 0 , "anchor with href, no tabindex set" ) ;
assert . equal ( jQuery ( "#linkWithTabIndex" ) . prop ( "tabindex" ) , 2 , "anchor with href, tabindex set to 2" ) ;
assert . equal ( jQuery ( "#linkWithNegativeTabIndex" ) . prop ( "tabindex" ) , - 1 , "anchor with href, tabindex set to -1" ) ;
2011-08-04 19:47:53 +00:00
// anchor without href
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#linkWithNoHrefWithNoTabIndex" ) . prop ( "tabindex" ) , - 1 , "anchor without href, no tabindex set" ) ;
assert . equal ( jQuery ( "#linkWithNoHrefWithTabIndex" ) . prop ( "tabindex" ) , 1 , "anchor without href, tabindex set to 2" ) ;
assert . equal ( jQuery ( "#linkWithNoHrefWithNegativeTabIndex" ) . prop ( "tabindex" ) , - 1 , "anchor without href, no tabindex set" ) ;
} ) ;
2011-08-04 19:47:53 +00:00
2015-10-18 20:20:25 +00:00
QUnit . test ( "image.prop( 'tabIndex' )" , function ( assert ) {
assert . expect ( 1 ) ;
2017-08-01 16:52:45 +00:00
var image = jQuery ( "<img src='" + baseURL + "1x1.jpg' />" )
2016-05-10 09:12:28 +00:00
. appendTo ( "#qunit-fixture" ) ;
assert . equal ( image . prop ( "tabIndex" ) , - 1 , "tabIndex on image" ) ;
2015-10-18 20:20:25 +00:00
} ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "prop('tabindex', value)" , function ( assert ) {
assert . expect ( 10 ) ;
2012-09-29 04:23:55 +00:00
2012-10-16 16:29:21 +00:00
var clone ,
2015-08-16 06:59:58 +00:00
element = jQuery ( "#divWithNoTabIndex" ) ;
2011-08-04 19:47:53 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , - 1 , "start with no tabindex" ) ;
2011-08-04 19:47:53 +00:00
// set a positive string
2012-09-29 04:23:55 +00:00
element . prop ( "tabindex" , "1" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , 1 , "set tabindex to 1 (string)" ) ;
2011-08-04 19:47:53 +00:00
// set a zero string
2012-09-29 04:23:55 +00:00
element . prop ( "tabindex" , "0" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , 0 , "set tabindex to 0 (string)" ) ;
2011-08-04 19:47:53 +00:00
// set a negative string
2012-09-29 04:23:55 +00:00
element . prop ( "tabindex" , "-1" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , - 1 , "set tabindex to -1 (string)" ) ;
2011-08-04 19:47:53 +00:00
// set a positive number
2012-09-29 04:23:55 +00:00
element . prop ( "tabindex" , 1 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , 1 , "set tabindex to 1 (number)" ) ;
2011-08-04 19:47:53 +00:00
// set a zero number
2012-09-29 04:23:55 +00:00
element . prop ( "tabindex" , 0 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , 0 , "set tabindex to 0 (number)" ) ;
2011-08-04 19:47:53 +00:00
// set a negative number
2012-09-29 04:23:55 +00:00
element . prop ( "tabindex" , - 1 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , - 1 , "set tabindex to -1 (number)" ) ;
2011-08-04 19:47:53 +00:00
2015-08-16 06:59:58 +00:00
element = jQuery ( "#linkWithTabIndex" ) ;
assert . equal ( element . prop ( "tabindex" ) , 2 , "start with tabindex 2" ) ;
2012-09-29 04:23:55 +00:00
element . prop ( "tabindex" , - 1 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( element . prop ( "tabindex" ) , - 1 , "set negative tabindex" ) ;
2011-08-04 19:47:53 +00:00
2012-09-29 04:23:55 +00:00
clone = element . clone ( ) ;
clone . prop ( "tabindex" , 1 ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( clone [ 0 ] . getAttribute ( "tabindex" ) , "1" , "set tabindex on cloned element" ) ;
} ) ;
2011-08-04 19:47:53 +00:00
2016-01-15 21:48:52 +00:00
QUnit . test ( "option.prop('selected', true) affects select.selectedIndex (gh-2732)" , function ( assert ) {
assert . expect ( 2 ) ;
function addOptions ( $elem ) {
return $elem . append (
2020-03-16 20:49:29 +00:00
jQuery ( "<option></option>" ) . val ( "a" ) . text ( "One" ) ,
jQuery ( "<option></option>" ) . val ( "b" ) . text ( "Two" ) ,
jQuery ( "<option></option>" ) . val ( "c" ) . text ( "Three" )
2016-01-15 21:48:52 +00:00
)
. find ( "[value=a]" ) . prop ( "selected" , true ) . end ( )
. find ( "[value=c]" ) . prop ( "selected" , true ) . end ( ) ;
}
var $optgroup ,
2020-03-16 20:49:29 +00:00
$select = jQuery ( "<select></select>" ) ;
2016-01-15 21:48:52 +00:00
// Check select with options
addOptions ( $select ) . appendTo ( "#qunit-fixture" ) ;
$select . find ( "[value=b]" ) . prop ( "selected" , true ) ;
assert . equal ( $select [ 0 ] . selectedIndex , 1 , "Setting option selected affects selectedIndex" ) ;
$select . empty ( ) ;
// Check select with optgroup
2020-03-16 20:49:29 +00:00
$optgroup = jQuery ( "<optgroup></optgroup>" ) ;
2016-01-15 21:48:52 +00:00
addOptions ( $optgroup ) . appendTo ( $select ) ;
$select . find ( "[value=b]" ) . prop ( "selected" , true ) ;
assert . equal ( $select [ 0 ] . selectedIndex , 1 , "Setting option in optgroup selected affects selectedIndex" ) ;
} ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeProp(String)" , function ( assert ) {
assert . expect ( 6 ) ;
2015-08-16 06:59:58 +00:00
var attributeNode = document . createAttribute ( "irrelevant" ) ,
commentNode = document . createComment ( "some comment" ) ,
textNode = document . createTextNode ( "some text" ) ,
2010-11-13 13:39:28 +00:00
obj = { } ;
2011-03-08 17:07:05 +00:00
2015-08-16 03:45:28 +00:00
assert . strictEqual (
2023-09-18 16:39:00 +00:00
jQuery ( "#firstp" ) . prop ( "nonexisting" , "foo" ) . removeProp ( "nonexisting" ) [ 0 ] . nonexisting ,
2012-10-16 16:29:21 +00:00
undefined ,
"removeprop works correctly on DOM element nodes"
) ;
2010-11-13 13:39:28 +00:00
2012-10-16 16:29:21 +00:00
jQuery . each ( [ document , obj ] , function ( i , ele ) {
2010-11-13 13:39:28 +00:00
var $ele = jQuery ( ele ) ;
2015-08-16 06:59:58 +00:00
$ele . prop ( "nonexisting" , "foo" ) . removeProp ( "nonexisting" ) ;
2023-09-18 16:39:00 +00:00
assert . strictEqual ( ele . nonexisting , undefined , "removeProp works correctly on non DOM element nodes (bug trac-7500)." ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
jQuery . each ( [ commentNode , textNode , attributeNode ] , function ( i , ele ) {
2011-05-07 18:49:04 +00:00
var $ele = jQuery ( ele ) ;
2015-08-16 06:59:58 +00:00
$ele . prop ( "nonexisting" , "foo" ) . removeProp ( "nonexisting" ) ;
2023-09-18 16:39:00 +00:00
assert . strictEqual ( ele . nonexisting , undefined , "removeProp works correctly on non DOM element nodes (bug trac-7500)." ) ;
2015-08-16 06:59:58 +00:00
} ) ;
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "val() after modification" , function ( assert ) {
2010-01-07 14:55:15 +00:00
2015-08-16 03:45:28 +00:00
assert . expect ( 1 ) ;
2013-04-09 15:45:09 +00:00
2015-08-16 06:59:58 +00:00
document . getElementById ( "text1" ) . value = "bla" ;
assert . equal ( jQuery ( "#text1" ) . val ( ) , "bla" , "Check for modified value of input element" ) ;
} ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "val()" , function ( assert ) {
2013-12-11 16:34:05 +00:00
2015-08-16 03:45:28 +00:00
assert . expect ( 20 + ( jQuery . fn . serialize ? 6 : 0 ) ) ;
2010-01-07 14:55:15 +00:00
2013-12-11 16:34:05 +00:00
var checks , $button ;
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#text1" ) . val ( ) , "Test" , "Check for value of input element" ) ;
2022-01-04 15:27:18 +00:00
// ticket trac-1714 this caused a JS error in IE
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#first" ) . val ( ) , "" , "Check a paragraph element to see if it has a value" ) ;
assert . ok ( jQuery ( [ ] ) . val ( ) === undefined , "Check an empty jQuery object will return undefined from val" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#select2" ) . val ( ) , "3" , "Call val() on a single='single' select" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
assert . deepEqual ( jQuery ( "#select3" ) . val ( ) , [ "1" , "2" ] , "Call val() on a multiple='multiple' select" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#option3c" ) . val ( ) , "2" , "Call val() on a option element with value" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#option3a" ) . val ( ) , "" , "Call val() on a option element with empty value" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#option3e" ) . val ( ) , "no value" , "Call val() on a option element with no value attribute" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#option3a" ) . val ( ) , "" , "Call val() on a option element with no value attribute" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select3" ) . val ( "" ) ;
assert . deepEqual ( jQuery ( "#select3" ) . val ( ) , [ "" ] , "Call val() on a multiple='multiple' select" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
assert . deepEqual ( jQuery ( "#select4" ) . val ( ) , [ ] , "Call val() on multiple='multiple' select with all disabled options" ) ;
2010-09-24 21:26:22 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select4 optgroup" ) . add ( "#select4 > [disabled]" ) . attr ( "disabled" , false ) ;
assert . deepEqual ( jQuery ( "#select4" ) . val ( ) , [ "2" , "3" ] , "Call val() on multiple='multiple' select with some disabled options" ) ;
2010-09-24 21:26:22 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select4" ) . attr ( "disabled" , true ) ;
assert . deepEqual ( jQuery ( "#select4" ) . val ( ) , [ "2" , "3" ] , "Call val() on disabled multiple='multiple' select" ) ;
2010-09-24 21:26:22 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#select5" ) . val ( ) , "3" , "Check value on ambiguous select." ) ;
2010-09-28 15:36:28 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select5" ) . val ( 1 ) ;
assert . equal ( jQuery ( "#select5" ) . val ( ) , "1" , "Check value on ambiguous select." ) ;
2010-09-28 15:36:28 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select5" ) . val ( 3 ) ;
assert . equal ( jQuery ( "#select5" ) . val ( ) , "3" , "Check value on ambiguous select." ) ;
2010-09-28 15:36:28 +00:00
2015-08-16 03:45:28 +00:00
assert . strictEqual (
2015-08-16 06:59:58 +00:00
jQuery ( "<select name='select12584' id='select12584'><option value='1' disabled='disabled'>1</option></select>" ) . val ( ) ,
2012-09-21 15:53:03 +00:00
null ,
2022-01-04 15:27:18 +00:00
"Select-one with only option disabled (trac-12584)"
2012-09-21 15:53:03 +00:00
) ;
2022-06-28 10:39:01 +00:00
if ( includesModule ( "serialize" ) ) {
2015-08-16 06:59:58 +00:00
checks = jQuery ( "<input type='checkbox' name='test' value='1'/><input type='checkbox' name='test' value='2'/><input type='checkbox' name='test' value=''/><input type='checkbox' name='test'/>" ) . appendTo ( "#form" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 03:45:28 +00:00
assert . deepEqual ( checks . serialize ( ) , "" , "Get unchecked values." ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 03:45:28 +00:00
assert . equal ( checks . eq ( 3 ) . val ( ) , "on" , "Make sure a value of 'on' is provided if none is specified." ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
checks . val ( [ "2" ] ) ;
2015-08-16 03:45:28 +00:00
assert . deepEqual ( checks . serialize ( ) , "test=2" , "Get a single checked value." ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
checks . val ( [ "1" , "" ] ) ;
2015-08-16 03:45:28 +00:00
assert . deepEqual ( checks . serialize ( ) , "test=1&test=" , "Get multiple checked values." ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
checks . val ( [ "" , "2" ] ) ;
2015-08-16 03:45:28 +00:00
assert . deepEqual ( checks . serialize ( ) , "test=2&test=" , "Get multiple checked values." ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
checks . val ( [ "1" , "on" ] ) ;
2015-08-16 03:45:28 +00:00
assert . deepEqual ( checks . serialize ( ) , "test=1&test=on" , "Get multiple checked values." ) ;
2010-01-07 14:55:15 +00:00
2012-06-11 11:59:34 +00:00
checks . remove ( ) ;
}
2011-04-17 22:15:20 +00:00
2015-08-16 06:59:58 +00:00
$button = jQuery ( "<button value='foobar'>text</button>" ) . insertAfter ( "#button" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( $button . val ( ) , "foobar" , "Value retrieval on a button does not return innerHTML" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( $button . val ( "baz" ) . html ( ) , "text" , "Setting the value does not change innerHTML" ) ;
2011-08-05 14:02:33 +00:00
2020-03-16 20:49:29 +00:00
assert . equal ( jQuery ( "<option></option>" ) . val ( "test" ) . attr ( "value" ) , "test" , "Setting value sets the value attribute" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
QUnit . test ( "val() with non-matching values on dropdown list" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 3 ) ;
2013-03-13 23:23:36 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select5" ) . val ( "" ) ;
assert . equal ( jQuery ( "#select5" ) . val ( ) , null , "Non-matching set on select-one" ) ;
2013-03-13 23:23:36 +00:00
2015-08-16 06:59:58 +00:00
var select6 = jQuery ( "<select multiple id=\"select6\"><option value=\"1\">A</option><option value=\"2\">B</option></select>" ) . appendTo ( "#form" ) ;
jQuery ( select6 ) . val ( "nothing" ) ;
2015-11-04 23:34:14 +00:00
assert . deepEqual ( jQuery ( select6 ) . val ( ) , [ ] , "Non-matching set (single value) on select-multiple" ) ;
2013-03-13 23:23:36 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( select6 ) . val ( [ "nothing1" , "nothing2" ] ) ;
2015-11-04 23:34:14 +00:00
assert . deepEqual ( jQuery ( select6 ) . val ( ) , [ ] , "Non-matching set (array of values) on select-multiple" ) ;
2013-03-13 23:23:36 +00:00
2013-03-03 15:51:04 +00:00
select6 . remove ( ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2013-03-03 15:51:04 +00:00
2022-01-04 15:27:18 +00:00
QUnit . test ( "val() respects numbers without exception (Bug trac-9319) - progress" ,
2019-05-13 19:39:56 +00:00
function ( assert ) {
2011-05-20 15:03:33 +00:00
2019-05-13 19:39:56 +00:00
assert . expect ( 2 ) ;
2011-05-20 15:03:33 +00:00
2019-05-13 19:39:56 +00:00
var $progress = jQuery ( "<progress max='10' value='1.5'></progress>" ) ;
2011-05-20 15:03:33 +00:00
2019-05-13 19:39:56 +00:00
try {
assert . equal ( typeof $progress . val ( ) , "number" , "progress, returns a number and does not throw exception" ) ;
assert . equal ( $progress . val ( ) , $progress [ 0 ] . value , "progress, api matches host and does not throw exception" ) ;
2011-05-20 15:03:33 +00:00
2019-05-13 19:39:56 +00:00
} catch ( e ) { }
2011-05-20 15:03:33 +00:00
2019-05-13 19:39:56 +00:00
$progress . remove ( ) ;
} ) ;
2011-05-20 15:03:33 +00:00
2019-05-13 19:39:56 +00:00
// IE doesn't support <meter>
2022-01-04 15:27:18 +00:00
QUnit . testUnlessIE ( "val() respects numbers without exception (Bug trac-9319) - meter" ,
2019-05-13 19:39:56 +00:00
function ( assert ) {
2011-05-20 15:03:33 +00:00
2019-05-13 19:39:56 +00:00
assert . expect ( 2 ) ;
var $meter = jQuery ( "<meter min='0' max='10' value='5.6'></meter>" ) ;
try {
assert . equal ( typeof $meter . val ( ) , "number" , "meter, returns a number and does not throw exception" ) ;
assert . equal ( $meter . val ( ) , $meter [ 0 ] . value , "meter, api matches host and does not throw exception" ) ;
} catch ( e ) { }
$meter . remove ( ) ;
} ) ;
2011-05-20 15:03:33 +00:00
2015-08-16 03:45:28 +00:00
var testVal = function ( valueObj , assert ) {
assert . expect ( 9 ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . val ( valueObj ( "test" ) ) ;
assert . equal ( document . getElementById ( "text1" ) . value , "test" , "Check for modified (via val(String)) value of input element" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . val ( valueObj ( undefined ) ) ;
assert . equal ( document . getElementById ( "text1" ) . value , "" , "Check for modified (via val(undefined)) value of input element" ) ;
2010-08-21 02:32:34 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . val ( valueObj ( 67 ) ) ;
assert . equal ( document . getElementById ( "text1" ) . value , "67" , "Check for modified (via val(Number)) value of input element" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . val ( valueObj ( null ) ) ;
assert . equal ( document . getElementById ( "text1" ) . value , "" , "Check for modified (via val(null)) value of input element" ) ;
2010-08-21 02:32:34 +00:00
2013-04-09 15:45:09 +00:00
var j ,
2020-03-16 20:49:29 +00:00
$select = jQuery ( "<select multiple><option value='1'></option><option value='2'></option></select>" ) ,
2015-08-16 06:59:58 +00:00
$select1 = jQuery ( "#select1" ) ;
2014-01-16 02:58:54 +00:00
2015-08-16 06:59:58 +00:00
$select1 . val ( valueObj ( "3" ) ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( $select1 . val ( ) , "3" , "Check for modified (via val(String)) value of select element" ) ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
$select1 . val ( valueObj ( 2 ) ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( $select1 . val ( ) , "2" , "Check for modified (via val(Number)) value of select element" ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 06:59:58 +00:00
$select1 . append ( "<option value='4'>four</option>" ) ;
2012-10-16 16:29:21 +00:00
$select1 . val ( valueObj ( 4 ) ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( $select1 . val ( ) , "4" , "Should be possible to set the val() to a newly created option" ) ;
2010-01-07 14:55:15 +00:00
// using contents will get comments regular, text, and comment nodes
2015-08-16 06:59:58 +00:00
j = jQuery ( "#nonnodes" ) . contents ( ) ;
2012-10-16 16:29:21 +00:00
j . val ( valueObj ( "asdf" ) ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( j . val ( ) , "asdf" , "Check node,textnode,comment with val()" ) ;
2015-08-16 06:59:58 +00:00
j . removeAttr ( "value" ) ;
2014-01-16 02:58:54 +00:00
2014-01-16 03:04:14 +00:00
$select . val ( valueObj ( [ "1" , "2" ] ) ) ;
2015-08-16 03:45:28 +00:00
assert . deepEqual ( $select . val ( ) , [ "1" , "2" ] , "Should set array of values" ) ;
2012-06-21 19:30:24 +00:00
} ;
2010-01-07 14:55:15 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "val(String/Number)" , function ( assert ) {
testVal ( bareObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "val(Function)" , function ( assert ) {
testVal ( functionReturningObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-10-09 03:48:06 +00:00
2022-01-04 15:27:18 +00:00
QUnit . test ( "val(Array of Numbers) (Bug trac-7123)" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 4 ) ;
2015-08-16 06:59:58 +00:00
jQuery ( "#form" ) . append ( "<input type='checkbox' name='arrayTest' value='1' /><input type='checkbox' name='arrayTest' value='2' /><input type='checkbox' name='arrayTest' value='3' checked='checked' /><input type='checkbox' name='arrayTest' value='4' />" ) ;
2016-02-14 21:18:21 +00:00
var elements = jQuery ( "#form input[name=arrayTest]" ) . val ( [ 1 , 2 ] ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( elements [ 0 ] . checked , "First element was checked" ) ;
assert . ok ( elements [ 1 ] . checked , "Second element was checked" ) ;
assert . ok ( ! elements [ 2 ] . checked , "Third element was unchecked" ) ;
assert . ok ( ! elements [ 3 ] . checked , "Fourth element remained unchecked" ) ;
2010-12-30 06:34:48 +00:00
2010-10-09 03:48:06 +00:00
elements . remove ( ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 14:55:15 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "val(Function) with incoming value" , function ( assert ) {
assert . expect ( 10 ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
var oldVal = jQuery ( "#text1" ) . val ( ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . val ( function ( i , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( document . getElementById ( "text1" ) . value , "test" , "Check for modified (via val(String)) value of input element" ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
oldVal = jQuery ( "#text1" ) . val ( ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#text1" ) . val ( function ( i , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return 67 ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( document . getElementById ( "text1" ) . value , "67" , "Check for modified (via val(Number)) value of input element" ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
oldVal = jQuery ( "#select1" ) . val ( ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select1" ) . val ( function ( i , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "3" ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#select1" ) . val ( ) , "3" , "Check for modified (via val(String)) value of select element" ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
oldVal = jQuery ( "#select1" ) . val ( ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select1" ) . val ( function ( i , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return 2 ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#select1" ) . val ( ) , "2" , "Check for modified (via val(Number)) value of select element" ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select1" ) . append ( "<option value='4'>four</option>" ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
oldVal = jQuery ( "#select1" ) . val ( ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#select1" ) . val ( function ( i , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return 4 ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#select1" ) . val ( ) , "4" , "Should be possible to set the val() to a newly created option" ) ;
} ) ;
2010-01-07 16:15:40 +00:00
2011-02-10 22:50:02 +00:00
// testing if a form.reset() breaks a subsequent call to a select element's .val() (in IE only)
2022-01-04 15:27:18 +00:00
QUnit . test ( "val(select) after form.reset() (Bug trac-2551)" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 3 ) ;
2011-02-10 22:50:02 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "<form id='kk' name='kk'><select id='kkk'><option value='cf'>cf</option><option value='gf'>gf</option></select></form>" ) . appendTo ( "#qunit-fixture" ) ;
2011-02-10 22:50:02 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#kkk" ) . val ( "gf" ) ;
2011-02-10 22:50:02 +00:00
2023-09-18 16:39:00 +00:00
document . kk . reset ( ) ;
2011-02-10 22:50:02 +00:00
2015-08-16 06:59:58 +00:00
assert . equal ( jQuery ( "#kkk" ) [ 0 ] . value , "cf" , "Check value of select after form reset." ) ;
assert . equal ( jQuery ( "#kkk" ) . val ( ) , "cf" , "Check value of select after form reset." ) ;
2011-02-10 22:50:02 +00:00
// re-verify the multi-select is not broken (after form.reset) by our fix for single-select
2015-08-16 06:59:58 +00:00
assert . deepEqual ( jQuery ( "#select3" ) . val ( ) , [ "1" , "2" ] , "Call val() on a multiple='multiple' select" ) ;
2011-02-10 22:50:02 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( "#kk" ) . remove ( ) ;
} ) ;
2011-02-10 22:50:02 +00:00
2016-03-15 22:15:02 +00:00
QUnit . test ( "select.val(space characters) (gh-2978)" , function ( assert ) {
2016-09-12 16:32:02 +00:00
assert . expect ( 37 ) ;
2016-03-15 22:15:02 +00:00
2020-03-16 20:49:29 +00:00
var $select = jQuery ( "<select></select>" ) . appendTo ( "#qunit-fixture" ) ,
2016-03-15 22:15:02 +00:00
spaces = {
"\\t" : {
html : "	" ,
val : "\t"
} ,
"\\n" : {
html : " " ,
val : "\n"
} ,
"\\r" : {
html : " " ,
val : "\r"
} ,
"\\f" : "\f" ,
"space" : " " ,
"\\u00a0" : "\u00a0" ,
"\\u1680" : "\u1680"
} ,
html = "" ;
jQuery . each ( spaces , function ( key , obj ) {
var value = obj . html || obj ;
html += "<option value='attr" + value + "'></option>" ;
html += "<option value='at" + value + "tr'></option>" ;
html += "<option value='" + value + "attr'></option>" ;
} ) ;
$select . html ( html ) ;
jQuery . each ( spaces , function ( key , obj ) {
var val = obj . val || obj ;
$select . val ( "attr" + val ) ;
assert . equal ( $select . val ( ) , "attr" + val , "Value ending with space character (" + key + ") selected (attr)" ) ;
$select . val ( "at" + val + "tr" ) ;
assert . equal ( $select . val ( ) , "at" + val + "tr" , "Value with space character (" + key + ") in the middle selected (attr)" ) ;
$select . val ( val + "attr" ) ;
assert . equal ( $select . val ( ) , val + "attr" , "Value starting with space character (" + key + ") selected (attr)" ) ;
} ) ;
jQuery . each ( spaces , function ( key , obj ) {
var value = obj . html || obj ,
val = obj . val || obj ;
html = "" ;
html += "<option>text" + value + "</option>" ;
html += "<option>te" + value + "xt</option>" ;
html += "<option>" + value + "text</option>" ;
$select . html ( html ) ;
if ( /^\\u/ . test ( key ) ) {
2016-09-12 16:32:02 +00:00
$select . val ( val + "text" ) ;
assert . equal ( $select . val ( ) , val + "text" , "Value with non-HTML space character at beginning is not stripped (" + key + ") selected (" + key + "text)" ) ;
2016-03-15 22:15:02 +00:00
$select . val ( "te" + val + "xt" ) ;
assert . equal ( $select . val ( ) , "te" + val + "xt" , "Value with non-space whitespace character (" + key + ") in the middle selected (text)" ) ;
2016-09-12 16:32:02 +00:00
$select . val ( "text" + val ) ;
assert . equal ( $select . val ( ) , "text" + val , "Value with non-HTML space character at end is not stripped (" + key + ") selected (text" + key + ")" ) ;
2016-03-15 22:15:02 +00:00
} else {
2016-09-12 16:32:02 +00:00
$select . val ( "text" ) ;
assert . equal ( $select . val ( ) , "text" , "Value with HTML space character at beginning or end is stripped (" + key + ") selected (text)" ) ;
2016-03-15 22:15:02 +00:00
$select . val ( "te xt" ) ;
assert . equal ( $select . val ( ) , "te xt" , "Value with space character (" + key + ") in the middle selected (text)" ) ;
}
} ) ;
} ) ;
2020-01-13 18:25:01 +00:00
QUnit . test ( "radio.val(space characters)" , function ( assert ) {
assert . expect ( 42 ) ;
var radio = jQuery ( "<input type='radio'/>" ) . appendTo ( "#qunit-fixture" ) ,
spaces = {
"\\t" : {
html : "	" ,
val : "\t"
} ,
"\\n" : {
html : " " ,
val : "\n"
} ,
"\\r" : {
html : " " ,
val : "\r"
} ,
"\\f" : "\f" ,
"space" : " " ,
"\\u00a0" : "\u00a0" ,
"\\u1680" : "\u1680"
} ;
jQuery . each ( spaces , function ( key , obj ) {
var val = obj . val || obj ;
radio . val ( "attr" + val ) ;
assert . equal ( radio . val ( ) , "attr" + val , "Value ending with space character (" + key + ") returned (set via val())" ) ;
radio . val ( "at" + val + "tr" ) ;
assert . equal ( radio . val ( ) , "at" + val + "tr" , "Value with space character (" + key + ") in the middle returned (set via val())" ) ;
radio . val ( val + "attr" ) ;
assert . equal ( radio . val ( ) , val + "attr" , "Value starting with space character (" + key + ") returned (set via val())" ) ;
} ) ;
jQuery . each ( spaces , function ( key , obj ) {
var val = obj . val || obj ,
htmlVal = obj . html || obj ;
radio = jQuery ( "<input type='radio' value='attr" + htmlVal + "'/>" ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( radio . val ( ) , "attr" + val , "Value ending with space character (" + key + ") returned (set via HTML)" ) ;
radio = jQuery ( "<input type='radio' value='at" + htmlVal + "tr'/>" ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( radio . val ( ) , "at" + val + "tr" , "Value with space character (" + key + ") in the middle returned (set via HTML)" ) ;
radio = jQuery ( "<input type='radio' value='" + htmlVal + "attr'/>" ) . appendTo ( "#qunit-fixture" ) ;
assert . equal ( radio . val ( ) , val + "attr" , "Value starting with space character (" + key + ") returned (set via HTML)" ) ;
} ) ;
} ) ;
2015-08-16 03:45:28 +00:00
var testAddClass = function ( valueObj , assert ) {
assert . expect ( 9 ) ;
2011-06-19 22:58:47 +00:00
2013-04-09 15:45:09 +00:00
var pass , j , i ,
2015-08-16 06:59:58 +00:00
div = jQuery ( "#qunit-fixture div" ) ;
div . addClass ( valueObj ( "test" ) ) ;
2013-04-09 15:45:09 +00:00
pass = true ;
for ( i = 0 ; i < div . length ; i ++ ) {
2015-08-16 06:59:58 +00:00
if ( ! ~ div . get ( i ) . className . indexOf ( "test" ) ) {
2011-06-08 00:54:11 +00:00
pass = false ;
}
2009-03-18 21:15:38 +00:00
}
2015-08-16 03:45:28 +00:00
assert . ok ( pass , "Add Class" ) ;
2009-03-18 21:15:38 +00:00
// using contents will get regular, text, and comment nodes
2015-08-16 06:59:58 +00:00
j = jQuery ( "#nonnodes" ) . contents ( ) ;
j . addClass ( valueObj ( "asdf" ) ) ;
assert . ok ( j . hasClass ( "asdf" ) , "Check node,textnode,comment for addClass" ) ;
2010-02-13 07:18:38 +00:00
2020-03-16 20:49:29 +00:00
div = jQuery ( "<div></div>" ) ;
2010-02-13 07:18:38 +00:00
2015-08-16 06:59:58 +00:00
div . addClass ( valueObj ( "test" ) ) ;
assert . equal ( div . attr ( "class" ) , "test" , "Make sure there's no extra whitespace." ) ;
2010-02-13 07:18:38 +00:00
2012-10-16 16:29:21 +00:00
div . attr ( "class" , " foo" ) ;
2015-08-16 06:59:58 +00:00
div . addClass ( valueObj ( "test" ) ) ;
assert . equal ( div . attr ( "class" ) , "foo test" , "Make sure there's no extra whitespace." ) ;
2010-02-13 19:30:27 +00:00
2012-10-16 16:29:21 +00:00
div . attr ( "class" , "foo" ) ;
2015-08-16 06:59:58 +00:00
div . addClass ( valueObj ( "bar baz" ) ) ;
assert . equal ( div . attr ( "class" ) , "foo bar baz" , "Make sure there isn't too much trimming." ) ;
2011-08-05 14:02:33 +00:00
2011-06-19 22:58:47 +00:00
div . removeClass ( ) ;
2015-08-16 06:59:58 +00:00
div . addClass ( valueObj ( "foo" ) ) . addClass ( valueObj ( "foo" ) ) ;
assert . equal ( div . attr ( "class" ) , "foo" , "Do not add the same class twice in separate calls." ) ;
2011-06-19 22:58:47 +00:00
2015-08-16 06:59:58 +00:00
div . addClass ( valueObj ( "fo" ) ) ;
assert . equal ( div . attr ( "class" ) , "foo fo" , "Adding a similar class does not get interrupted." ) ;
div . removeClass ( ) . addClass ( "wrap2" ) ;
assert . ok ( div . addClass ( "wrap" ) . hasClass ( "wrap" ) , "Can add similarly named classes" ) ;
2011-06-19 22:58:47 +00:00
div . removeClass ( ) ;
2015-08-16 06:59:58 +00:00
div . addClass ( valueObj ( "bar bar" ) ) ;
assert . equal ( div . attr ( "class" ) , "bar" , "Do not add the same class twice in the same call." ) ;
2009-12-14 15:56:01 +00:00
} ;
2009-12-10 04:57:19 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "addClass(String)" , function ( assert ) {
testAddClass ( bareObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "addClass(Function)" , function ( assert ) {
testAddClass ( functionReturningObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-12-10 04:57:19 +00:00
2018-01-02 21:45:10 +00:00
QUnit . test ( "addClass(Array)" , function ( assert ) {
testAddClass ( arrayFromString , assert ) ;
} ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "addClass(Function) with incoming value" , function ( assert ) {
2019-11-18 21:10:55 +00:00
assert . expect ( 59 ) ;
2013-04-09 15:45:09 +00:00
var pass , i ,
2015-08-16 06:59:58 +00:00
div = jQuery ( "#qunit-fixture div" ) ,
old = div . map ( function ( ) {
return jQuery ( this ) . attr ( "class" ) || "" ;
} ) ;
2011-08-05 14:02:33 +00:00
2015-08-16 06:59:58 +00:00
div . addClass ( function ( i , val ) {
2019-06-26 19:39:10 +00:00
assert . equal ( val , old [ i ] , "Make sure the incoming value is correct." ) ;
return "test" ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2013-04-09 15:45:09 +00:00
pass = true ;
for ( i = 0 ; i < div . length ; i ++ ) {
2015-08-16 06:59:58 +00:00
if ( div . get ( i ) . className . indexOf ( "test" ) === - 1 ) {
2012-06-21 19:30:24 +00:00
pass = false ;
}
2010-01-07 16:15:40 +00:00
}
2015-08-16 03:45:28 +00:00
assert . ok ( pass , "Add Class" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 03:45:28 +00:00
var testRemoveClass = function ( valueObj , assert ) {
assert . expect ( 8 ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
var $set = jQuery ( "#qunit-fixture div" ) ,
div = document . createElement ( "div" ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 06:59:58 +00:00
$set . addClass ( "test" ) . removeClass ( valueObj ( "test" ) ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 06:59:58 +00:00
assert . ok ( ! $set . is ( ".test" ) , "Remove Class" ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
$set . addClass ( "test" ) . addClass ( "foo" ) . addClass ( "bar" ) ;
$set . removeClass ( valueObj ( "test" ) ) . removeClass ( valueObj ( "bar" ) ) . removeClass ( valueObj ( "foo" ) ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 06:59:58 +00:00
assert . ok ( ! $set . is ( ".test,.bar,.foo" ) , "Remove multiple classes" ) ;
2009-03-18 21:15:38 +00:00
// Make sure that a null value doesn't cause problems
2015-08-16 06:59:58 +00:00
$set . eq ( 0 ) . addClass ( "expected" ) . removeClass ( valueObj ( null ) ) ;
assert . ok ( $set . eq ( 0 ) . is ( ".expected" ) , "Null value passed to removeClass" ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
$set . eq ( 0 ) . addClass ( "expected" ) . removeClass ( valueObj ( "" ) ) ;
assert . ok ( $set . eq ( 0 ) . is ( ".expected" ) , "Empty string passed to removeClass" ) ;
2009-03-18 21:15:38 +00:00
// using contents will get regular, text, and comment nodes
2015-08-16 06:59:58 +00:00
$set = jQuery ( "#nonnodes" ) . contents ( ) ;
$set . removeClass ( valueObj ( "asdf" ) ) ;
assert . ok ( ! $set . hasClass ( "asdf" ) , "Check node,textnode,comment for removeClass" ) ;
2012-11-27 14:46:06 +00:00
2015-08-16 06:59:58 +00:00
jQuery ( div ) . removeClass ( valueObj ( "foo" ) ) ;
assert . strictEqual ( jQuery ( div ) . attr ( "class" ) , undefined , "removeClass doesn't create a class attribute" ) ;
2010-02-02 02:33:58 +00:00
div . className = " test foo " ;
2015-08-16 06:59:58 +00:00
jQuery ( div ) . removeClass ( valueObj ( "foo" ) ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( div . className , "test" , "Make sure remaining className is trimmed." ) ;
2010-02-02 02:33:58 +00:00
div . className = " test " ;
2015-08-16 06:59:58 +00:00
jQuery ( div ) . removeClass ( valueObj ( "test" ) ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( div . className , "" , "Make sure there is nothing left after everything is removed." ) ;
2009-12-10 04:57:19 +00:00
} ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeClass(String) - simple" , function ( assert ) {
testRemoveClass ( bareObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeClass(Function) - simple" , function ( assert ) {
testRemoveClass ( functionReturningObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-12-10 04:57:19 +00:00
2018-01-02 21:45:10 +00:00
QUnit . test ( "removeClass(Array) - simple" , function ( assert ) {
testRemoveClass ( arrayFromString , assert ) ;
} ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeClass(Function) with incoming value" , function ( assert ) {
2019-11-18 21:10:55 +00:00
assert . expect ( 59 ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
var $divs = jQuery ( "#qunit-fixture div" ) . addClass ( "test" ) , old = $divs . map ( function ( ) {
return jQuery ( this ) . attr ( "class" ) ;
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
$divs . removeClass ( function ( i , val ) {
2019-06-26 19:39:10 +00:00
assert . equal ( val , old [ i ] , "Make sure the incoming value is correct." ) ;
return "test" ;
2015-08-16 06:59:58 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 06:59:58 +00:00
assert . ok ( ! $divs . is ( ".test" ) , "Remove Class" ) ;
} ) ;
2010-01-07 16:15:40 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "removeClass() removes duplicates" , function ( assert ) {
assert . expect ( 1 ) ;
2012-06-23 23:38:27 +00:00
2015-08-16 06:59:58 +00:00
var $div = jQuery ( jQuery . parseHTML ( "<div class='x x x'></div>" ) ) ;
2012-06-23 23:38:27 +00:00
2015-08-16 06:59:58 +00:00
$div . removeClass ( "x" ) ;
2012-06-23 23:38:27 +00:00
2015-08-16 06:59:58 +00:00
assert . ok ( ! $div . hasClass ( "x" ) , "Element with multiple same classes does not escape the wrath of removeClass()" ) ;
} ) ;
2012-06-23 23:38:27 +00:00
2015-08-16 06:59:58 +00:00
QUnit . test ( "removeClass(undefined) is a no-op" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 1 ) ;
2012-08-28 13:26:06 +00:00
2015-08-16 06:59:58 +00:00
var $div = jQuery ( "<div class='base second'></div>" ) ;
2012-08-28 13:26:06 +00:00
$div . removeClass ( undefined ) ;
2015-08-16 06:59:58 +00:00
assert . ok ( $div . hasClass ( "base" ) && $div . hasClass ( "second" ) , "Element still has classes after removeClass(undefined)" ) ;
} ) ;
2012-08-28 13:26:06 +00:00
2015-08-16 03:45:28 +00:00
var testToggleClass = function ( valueObj , assert ) {
2020-09-01 08:42:03 +00:00
assert . expect ( 11 ) ;
2009-05-02 21:14:38 +00:00
2015-08-16 06:59:58 +00:00
var e = jQuery ( "#firstp" ) ;
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
e . toggleClass ( valueObj ( "test" ) ) ;
assert . ok ( e . is ( ".test" ) , "Assert class present" ) ;
e . toggleClass ( valueObj ( "test" ) ) ;
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2009-03-18 21:15:38 +00:00
2009-05-02 21:14:38 +00:00
// class name with a boolean
2015-08-16 06:59:58 +00:00
e . toggleClass ( valueObj ( "test" ) , false ) ;
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2015-10-14 19:07:53 +00:00
e . toggleClass ( valueObj ( "test" ) , false ) ;
assert . ok ( ! e . is ( ".test" ) , "Assert class still not present" ) ;
2015-08-16 06:59:58 +00:00
e . toggleClass ( valueObj ( "test" ) , true ) ;
assert . ok ( e . is ( ".test" ) , "Assert class present" ) ;
2015-10-14 19:07:53 +00:00
e . toggleClass ( valueObj ( "test" ) , true ) ;
assert . ok ( e . is ( ".test" ) , "Assert class still present" ) ;
2015-08-16 06:59:58 +00:00
e . toggleClass ( valueObj ( "test" ) , false ) ;
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2009-05-02 21:14:38 +00:00
// multiple class names
2015-08-16 06:59:58 +00:00
e . addClass ( "testA testB" ) ;
assert . ok ( e . is ( ".testA.testB" ) , "Assert 2 different classes present" ) ;
e . toggleClass ( valueObj ( "testB testC" ) ) ;
assert . ok ( ( e . is ( ".testA.testC" ) && ! e . is ( ".testB" ) ) , "Assert 1 class added, 1 class removed, and 1 class kept" ) ;
e . toggleClass ( valueObj ( "testA testC" ) ) ;
assert . ok ( ( ! e . is ( ".testA" ) && ! e . is ( ".testB" ) && ! e . is ( ".testC" ) ) , "Assert no class present" ) ;
2009-12-10 04:57:19 +00:00
} ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "toggleClass(String|boolean|undefined[, boolean])" , function ( assert ) {
testToggleClass ( bareObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "toggleClass(Function[, boolean])" , function ( assert ) {
testToggleClass ( functionReturningObj , assert ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2009-12-10 04:57:19 +00:00
2018-01-02 21:45:10 +00:00
QUnit . test ( "toggleClass(Array[, boolean])" , function ( assert ) {
testToggleClass ( arrayFromString , assert ) ;
} ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "toggleClass(Function[, boolean]) with incoming value" , function ( assert ) {
assert . expect ( 14 ) ;
2009-12-10 04:57:19 +00:00
2015-08-16 06:59:58 +00:00
var e = jQuery ( "#firstp" ) ,
old = e . attr ( "class" ) || "" ;
Implement expectation test instead of using _removeData. Close gh-997.
* Removed inline usage of QUnit.reset() because it is messing with the
expectation model as reset does .empty() which does a recursive cleanData
on everything in #qunit-fixture, so any expectJqData above .reset() would
fail negatively.
Instead of calling reset inline, either updated the following assertions to
take previous assertions' state into account, or broke the test() up into
2 tests at the point where it would call QUnit.reset.
* After introducing the new memory leak discovery a whole bunch of tests were
failing as they didn't clean up everything. However I didn't (yet) add
QUnit.expectJqData calls all over the place because in most if not all of
these cases it is valid data storage. For example in test "data()", there
will be an internal data key for "parsedAttrs". This particular test isn't
intending to test for memory leaks, so therefor I made the new discovery
system only push failures when the test contains at least 1 call to
QUnit.expectJqData.
When not, we'll assume that whatever data is being stored is acceptable
because the relevant elements still exist in the DOM anyway (QUnit.reset
will remove the elements and clean up the data automatically).
I did add a "Always check jQuery.data" mode in the test suite that will
trigger it everywhere. Maybe one day we'll include a call to everywhere,
but for now I'm keeping the status quo: Only consider data left in storage
to be a problem if the test says so ("opt-in").
* Had to move #fx-tests inside the fixture because ".remove()" test would
otherwise remove stuff permanently and cause random other tests to fail
as "#hide div" would yield an empty collection.
(Why wasn't this in the fixture in the first place?)
As a result moving fx-tests into the fixture a whole bunch of tests failed
that relied on arbitrary stuff about the document-wide or fixture-wide
state (e.g. number of divs etc.). So I had to adjust various tests to
limit their sample data to not be so variable and unlimited...
* Moved out tests for expando cleanup into a separate test.
* Fixed implied global variable 'pass' in effects.js that was causing
"TypeError: boolean is not a function" in *UNRELATED* dimensions.js that
uses a global variable "pass = function () {};" ...
* Removed spurious calls to _removeData. The new test exposed various failures
e.g. where div[0] isn't being assigned any data anyway.
(queue.js and attributes.js toggleClass).
* Removed spurious clean up at the bottom of test() functions that are
already covered by the teardown (calling QUnit.reset or removeClass to
supposedly undo any changes).
* Documented the parentheses-less magic line in toggleClass. It appeared that
it would always keep the current class name if there was any (since the
assignment started with "this.className || ...".
Adding parentheses + spacing is 8 bytes (though only 1 in gzip apparently).
Only added the comment for now, though I prefer clarity with logical
operators, I'd rather not face the yayMinPD[1] in this test-related commit.
* Updated QUnit urlConfig to the new format (raw string is deprecated).
* Clean up odd htmlentities in test titles, QUnit escapes this.
(^\s+test\(.*)(>\;) → $1>
(^\s+test\(.*)(<\;) → $1<
[1] jQuery MinJsGz Release Police Department (do the same, download less)
2012-10-17 08:33:47 +00:00
2015-08-16 06:59:58 +00:00
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
e . toggleClass ( function ( i , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( old , val , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
2015-08-16 06:59:58 +00:00
} ) ;
assert . ok ( e . is ( ".test" ) , "Assert class present" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
old = e . attr ( "class" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
e . toggleClass ( function ( i , val ) {
2015-08-16 03:45:28 +00:00
assert . equal ( old , val , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
2015-08-16 06:59:58 +00:00
} ) ;
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
old = e . attr ( "class" ) || "" ;
2009-12-10 04:57:19 +00:00
2010-01-07 16:15:40 +00:00
// class name with a boolean
2015-08-16 06:59:58 +00:00
e . toggleClass ( function ( i , val , state ) {
2015-08-16 03:45:28 +00:00
assert . equal ( old , val , "Make sure the incoming value is correct." ) ;
assert . equal ( state , false , "Make sure that the state is passed in." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} , false ) ;
2015-08-16 06:59:58 +00:00
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
old = e . attr ( "class" ) || "" ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
e . toggleClass ( function ( i , val , state ) {
2015-08-16 03:45:28 +00:00
assert . equal ( old , val , "Make sure the incoming value is correct." ) ;
assert . equal ( state , true , "Make sure that the state is passed in." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} , true ) ;
2015-08-16 06:59:58 +00:00
assert . ok ( e . is ( ".test" ) , "Assert class present" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
old = e . attr ( "class" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
e . toggleClass ( function ( i , val , state ) {
2015-08-16 03:45:28 +00:00
assert . equal ( old , val , "Make sure the incoming value is correct." ) ;
assert . equal ( state , false , "Make sure that the state is passed in." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} , false ) ;
2015-08-16 06:59:58 +00:00
assert . ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
} ) ;
2009-03-18 21:15:38 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "addClass, removeClass, hasClass" , function ( assert ) {
assert . expect ( 17 ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
var jq = jQuery ( "<p>Hi</p>" ) , x = jq [ 0 ] ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
jq . addClass ( "hi" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( x . className , "hi" , "Check single added class" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
jq . addClass ( "foo bar" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( x . className , "hi foo bar" , "Check more added classes" ) ;
2010-12-30 06:34:48 +00:00
2009-09-08 01:07:50 +00:00
jq . removeClass ( ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( x . className , "" , "Remove all classes" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
jq . addClass ( "hi foo bar" ) ;
jq . removeClass ( "foo" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( x . className , "hi bar" , "Check removal of one class" ) ;
2010-12-30 06:34:48 +00:00
2015-08-16 06:59:58 +00:00
assert . ok ( jq . hasClass ( "hi" ) , "Check has1" ) ;
assert . ok ( jq . hasClass ( "bar" ) , "Check has2" ) ;
jq = jQuery ( "<p class='class1\nclass2\tcla.ss3\n\rclass4'></p>" ) ;
assert . ok ( jq . hasClass ( "class1" ) , "Check hasClass with line feed" ) ;
assert . ok ( jq . is ( ".class1" ) , "Check is with line feed" ) ;
assert . ok ( jq . hasClass ( "class2" ) , "Check hasClass with tab" ) ;
assert . ok ( jq . is ( ".class2" ) , "Check is with tab" ) ;
assert . ok ( jq . hasClass ( "cla.ss3" ) , "Check hasClass with dot" ) ;
assert . ok ( jq . hasClass ( "class4" ) , "Check hasClass with carriage return" ) ;
assert . ok ( jq . is ( ".class4" ) , "Check is with carriage return" ) ;
jq . removeClass ( "class2" ) ;
assert . ok ( jq . hasClass ( "class2" ) === false , "Check the class has been properly removed" ) ;
jq . removeClass ( "cla" ) ;
assert . ok ( jq . hasClass ( "cla.ss3" ) , "Check the dotted class has not been removed" ) ;
jq . removeClass ( "cla.ss3" ) ;
assert . ok ( jq . hasClass ( "cla.ss3" ) === false , "Check the dotted class has been removed" ) ;
jq . removeClass ( "class4" ) ;
assert . ok ( jq . hasClass ( "class4" ) === false , "Check the class has been properly removed" ) ;
} ) ;
2011-06-21 18:04:06 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "addClass, removeClass, hasClass on many elements" , function ( assert ) {
assert . expect ( 19 ) ;
2013-10-24 17:45:42 +00:00
var elem = jQuery ( "<p>p0</p><p>p1</p><p>p2</p>" ) ;
elem . addClass ( "hi" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( elem [ 0 ] . className , "hi" , "Check single added class" ) ;
assert . equal ( elem [ 1 ] . className , "hi" , "Check single added class" ) ;
assert . equal ( elem [ 2 ] . className , "hi" , "Check single added class" ) ;
2013-10-24 17:45:42 +00:00
elem . addClass ( "foo bar" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( elem [ 0 ] . className , "hi foo bar" , "Check more added classes" ) ;
assert . equal ( elem [ 1 ] . className , "hi foo bar" , "Check more added classes" ) ;
assert . equal ( elem [ 2 ] . className , "hi foo bar" , "Check more added classes" ) ;
2013-10-24 17:45:42 +00:00
elem . removeClass ( ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( elem [ 0 ] . className , "" , "Remove all classes" ) ;
assert . equal ( elem [ 1 ] . className , "" , "Remove all classes" ) ;
assert . equal ( elem [ 2 ] . className , "" , "Remove all classes" ) ;
2013-10-24 17:45:42 +00:00
elem . addClass ( "hi foo bar" ) ;
elem . removeClass ( "foo" ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( elem [ 0 ] . className , "hi bar" , "Check removal of one class" ) ;
assert . equal ( elem [ 1 ] . className , "hi bar" , "Check removal of one class" ) ;
assert . equal ( elem [ 2 ] . className , "hi bar" , "Check removal of one class" ) ;
2013-10-24 17:45:42 +00:00
2015-08-16 03:45:28 +00:00
assert . ok ( elem . hasClass ( "hi" ) , "Check has1" ) ;
assert . ok ( elem . hasClass ( "bar" ) , "Check has2" ) ;
2013-10-24 17:45:42 +00:00
2015-08-16 03:45:28 +00:00
assert . ok ( jQuery ( "<p class='hi'>p0</p><p>p1</p><p>p2</p>" ) . hasClass ( "hi" ) ,
2013-10-24 17:45:42 +00:00
"Did find a class in the first element" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( jQuery ( "<p>p0</p><p class='hi'>p1</p><p>p2</p>" ) . hasClass ( "hi" ) ,
2013-10-24 17:45:42 +00:00
"Did find a class in the second element" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( jQuery ( "<p>p0</p><p>p1</p><p class='hi'>p2</p>" ) . hasClass ( "hi" ) ,
2013-10-24 17:45:42 +00:00
"Did find a class in the last element" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( jQuery ( "<p class='hi'>p0</p><p class='hi'>p1</p><p class='hi'>p2</p>" ) . hasClass ( "hi" ) ,
2013-10-24 17:45:42 +00:00
"Did find a class when present in all elements" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( ! jQuery ( "<p class='hi0'>p0</p><p class='hi1'>p1</p><p class='hi2'>p2</p>" ) . hasClass ( "hi" ) ,
2013-10-24 17:45:42 +00:00
"Did not find a class when not present" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2013-10-24 17:45:42 +00:00
2018-01-02 21:45:10 +00:00
QUnit . test ( "addClass, removeClass, hasClass on many elements - Array" , function ( assert ) {
assert . expect ( 16 ) ;
var elem = jQuery ( "<p>p0</p><p>p1</p><p>p2</p>" ) ;
elem . addClass ( [ "hi" ] ) ;
assert . equal ( elem [ 0 ] . className , "hi" , "Check single added class" ) ;
assert . equal ( elem [ 1 ] . className , "hi" , "Check single added class" ) ;
assert . equal ( elem [ 2 ] . className , "hi" , "Check single added class" ) ;
elem . addClass ( [ "foo" , "bar" ] ) ;
assert . equal ( elem [ 0 ] . className , "hi foo bar" , "Check more added classes" ) ;
assert . equal ( elem [ 1 ] . className , "hi foo bar" , "Check more added classes" ) ;
assert . equal ( elem [ 2 ] . className , "hi foo bar" , "Check more added classes" ) ;
elem . removeClass ( ) ;
assert . equal ( elem [ 0 ] . className , "" , "Remove all classes" ) ;
assert . equal ( elem [ 1 ] . className , "" , "Remove all classes" ) ;
assert . equal ( elem [ 2 ] . className , "" , "Remove all classes" ) ;
elem . addClass ( [ "hi" , "foo" , "bar" , "baz" ] ) ;
elem . removeClass ( [ "foo" ] ) ;
assert . equal ( elem [ 0 ] . className , "hi bar baz" , "Check removal of one class" ) ;
assert . equal ( elem [ 1 ] . className , "hi bar baz" , "Check removal of one class" ) ;
assert . equal ( elem [ 2 ] . className , "hi bar baz" , "Check removal of one class" ) ;
elem . removeClass ( [ "bar baz" ] ) ;
assert . equal ( elem [ 0 ] . className , "hi" , "Check removal of two classes" ) ;
assert . equal ( elem [ 1 ] . className , "hi" , "Check removal of two classes" ) ;
assert . equal ( elem [ 2 ] . className , "hi" , "Check removal of two classes" ) ;
assert . ok ( elem . hasClass ( "hi" ) , "Check has1" ) ;
} ) ;
2016-09-12 16:32:02 +00:00
QUnit . test ( "addClass, removeClass, hasClass on elements with classes with non-HTML whitespace (gh-3072, gh-3003)" , function ( assert ) {
assert . expect ( 9 ) ;
var $elem = jQuery ( "<div class=' test'></div>" ) ;
function testMatches ( ) {
assert . ok ( $elem . is ( ".\\A0 test" ) , "Element matches with collapsed space" ) ;
assert . ok ( $elem . is ( ".\\A0test" ) , "Element matches with non-breaking space" ) ;
assert . ok ( $elem . hasClass ( "\xA0test" ) , "Element has class with non-breaking space" ) ;
}
testMatches ( ) ;
$elem . addClass ( "foo" ) ;
testMatches ( ) ;
$elem . removeClass ( "foo" ) ;
testMatches ( ) ;
} ) ;
2022-01-24 17:56:49 +00:00
( function ( ) {
var rnothtmlwhite = /[^\x20\t\r\n\f]+/g ;
function expectClasses ( assert , elem , classes ) {
var actualClassesSorted = ( elem . attr ( "class" ) . match ( rnothtmlwhite ) || [ ] )
. sort ( ) . join ( " " ) ;
var classesSorted = classes . slice ( )
. sort ( ) . join ( " " ) ;
assert . equal ( actualClassesSorted , classesSorted , "Expected classes present" ) ;
}
QUnit . test ( "addClass on arrays with falsy elements (gh-4998)" , function ( assert ) {
assert . expect ( 3 ) ;
var elem = jQuery ( "<div class='a'></div>" ) ;
elem . addClass ( [ "b" , "" , "c" ] ) ;
expectClasses ( assert , elem , [ "a" , "b" , "c" ] ) ;
elem . addClass ( [ "" , "d" ] ) ;
expectClasses ( assert , elem , [ "a" , "b" , "c" , "d" ] ) ;
elem . addClass ( [ "e" , "" ] ) ;
expectClasses ( assert , elem , [ "a" , "b" , "c" , "d" , "e" ] ) ;
} ) ;
QUnit . test ( "removeClass on arrays with falsy elements (gh-4998)" , function ( assert ) {
assert . expect ( 3 ) ;
var elem = jQuery ( "<div class='a b c d e'></div>" ) ;
elem . removeClass ( [ "e" , "" ] ) ;
expectClasses ( assert , elem , [ "a" , "b" , "c" , "d" ] ) ;
elem . removeClass ( [ "" , "d" ] ) ;
expectClasses ( assert , elem , [ "a" , "b" , "c" ] ) ;
elem . removeClass ( [ "b" , "" , "c" ] ) ;
expectClasses ( assert , elem , [ "a" ] ) ;
} ) ;
} ) ( ) ;
2015-08-16 03:45:28 +00:00
QUnit . test ( "contents().hasClass() returns correct values" , function ( assert ) {
assert . expect ( 2 ) ;
2011-06-21 18:04:06 +00:00
2015-08-16 06:59:58 +00:00
var $div = jQuery ( "<div><span class='foo'></span><!-- comment -->text</div>" ) ,
2011-06-21 18:04:06 +00:00
$contents = $div . contents ( ) ;
2015-08-16 06:59:58 +00:00
assert . ok ( $contents . hasClass ( "foo" ) , "Found 'foo' in $contents" ) ;
assert . ok ( ! $contents . hasClass ( "undefined" ) , "Did not find 'undefined' in $contents (correctly)" ) ;
} ) ;
2012-02-25 20:05:15 +00:00
2022-01-04 15:27:18 +00:00
QUnit . test ( "hasClass correctly interprets non-space separators (trac-13835)" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 4 ) ;
2013-05-14 01:55:00 +00:00
var
map = {
tab : "	" ,
"line-feed" : " " ,
"form-feed" : "" ,
"carriage-return" : " "
} ,
classes = jQuery . map ( map , function ( separator , label ) {
return " " + separator + label + separator + " " ;
2015-08-16 06:59:58 +00:00
} ) ,
2013-05-14 01:55:00 +00:00
$div = jQuery ( "<div class='" + classes + "'></div>" ) ;
jQuery . each ( map , function ( label ) {
2015-08-16 03:45:28 +00:00
assert . ok ( $div . hasClass ( label ) , label . replace ( "-" , " " ) ) ;
2015-08-16 06:59:58 +00:00
} ) ;
} ) ;
2013-05-14 01:55:00 +00:00
2022-01-04 15:27:18 +00:00
QUnit . test ( "coords returns correct values in IE6/IE7, see trac-10828" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 1 ) ;
2012-02-25 20:05:15 +00:00
2012-10-16 16:29:21 +00:00
var area ,
2020-03-16 20:49:29 +00:00
map = jQuery ( "<map></map>" ) ;
2012-02-25 20:05:15 +00:00
2020-03-16 20:49:29 +00:00
area = map . html ( "<area shape='rect' coords='0,0,0,0' href='#' alt='a'></area>" ) . find ( "area" ) ;
2015-08-16 06:59:58 +00:00
assert . equal ( area . attr ( "coords" ) , "0,0,0,0" , "did not retrieve coords correctly" ) ;
} ) ;
2014-01-12 19:44:07 +00:00
2022-01-04 15:27:18 +00:00
QUnit . test ( "should not throw at $(option).val() (trac-14686)" , function ( assert ) {
2015-08-16 03:45:28 +00:00
assert . expect ( 1 ) ;
2015-07-29 15:10:04 +00:00
2014-01-12 19:44:07 +00:00
try {
2020-03-16 20:49:29 +00:00
jQuery ( "<option></option>" ) . val ( ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( true ) ;
2014-01-12 19:44:07 +00:00
} catch ( _ ) {
2015-08-16 03:45:28 +00:00
assert . ok ( false ) ;
2014-01-12 19:44:07 +00:00
}
2015-08-16 06:59:58 +00:00
} ) ;
2014-03-06 19:56:09 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "option value not trimmed when setting via parent select" , function ( assert ) {
assert . expect ( 1 ) ;
assert . equal ( jQuery ( "<select><option> 2</option></select>" ) . val ( "2" ) . val ( ) , "2" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2014-12-04 13:43:35 +00:00
2022-01-04 15:27:18 +00:00
QUnit . test ( "Insignificant white space returned for $(option).val() (trac-14858, gh-2978)" , function ( assert ) {
2016-03-15 22:15:02 +00:00
assert . expect ( 16 ) ;
2014-03-06 19:56:09 +00:00
var val = jQuery ( "<option></option>" ) . val ( ) ;
2015-08-16 03:45:28 +00:00
assert . equal ( val . length , 0 , "Empty option should have no value" ) ;
2014-03-06 19:56:09 +00:00
2016-03-15 22:15:02 +00:00
jQuery . each ( [ " " , "\n" , "\t" , "\f" , "\r" ] , function ( i , character ) {
var val = jQuery ( "<option>" + character + "</option>" ) . val ( ) ;
assert . equal ( val . length , 0 , "insignificant white-space returned for value" ) ;
val = jQuery ( "<option>" + character + "test" + character + "</option>" ) . val ( ) ;
assert . equal ( val . length , 4 , "insignificant white-space returned for value" ) ;
2014-03-06 19:56:09 +00:00
2016-03-15 22:15:02 +00:00
val = jQuery ( "<option>te" + character + "st</option>" ) . val ( ) ;
assert . equal ( val , "te st" , "Whitespace is collapsed in values" ) ;
} ) ;
2015-08-16 06:59:58 +00:00
} ) ;
2015-05-06 20:30:16 +00:00
2015-08-16 03:45:28 +00:00
QUnit . test ( "SVG class manipulation (gh-2199)" , function ( assert ) {
assert . expect ( 12 ) ;
2015-05-06 20:30:16 +00:00
function createSVGElement ( nodeName ) {
return document . createElementNS ( "http://www.w3.org/2000/svg" , nodeName ) ;
}
2015-08-16 06:59:58 +00:00
jQuery . each ( [
2015-05-06 20:30:16 +00:00
"svg" ,
"rect" ,
"g"
] , function ( ) {
var elem = jQuery ( createSVGElement ( this ) ) ;
elem . addClass ( "awesome" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( elem . hasClass ( "awesome" ) , "SVG element (" + this + ") has added class" ) ;
2015-05-06 20:30:16 +00:00
elem . removeClass ( "awesome" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( ! elem . hasClass ( "awesome" ) , "SVG element (" + this + ") removes the class" ) ;
2015-05-06 20:30:16 +00:00
elem . toggleClass ( "awesome" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( elem . hasClass ( "awesome" ) , "SVG element (" + this + ") toggles the class on" ) ;
2015-05-06 20:30:16 +00:00
elem . toggleClass ( "awesome" ) ;
2015-08-16 03:45:28 +00:00
assert . ok ( ! elem . hasClass ( "awesome" ) , "SVG element (" + this + ") toggles the class off" ) ;
2015-08-16 06:59:58 +00:00
} ) ;
} ) ;
2016-05-29 20:24:28 +00:00
QUnit . test ( "non-lowercase boolean attribute getters should not crash" , function ( assert ) {
assert . expect ( 3 ) ;
var elem = jQuery ( "<input checked required autofocus type='checkbox'>" ) ;
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
[
"Checked" , "requiRed" , "AUTOFOCUS"
] . forEach ( function ( inconsistentlyCased ) {
2016-05-10 09:12:28 +00:00
try {
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
assert . strictEqual ( elem . attr ( inconsistentlyCased ) , "" ,
"The '" + this + "' attribute getter should return an empty string" ) ;
2016-05-29 20:24:28 +00:00
} catch ( e ) {
assert . ok ( false , "The '" + this + "' attribute getter threw" ) ;
}
} ) ;
} ) ;
2021-11-01 17:10:23 +00:00
Attributes: Make `.attr( name, false )` remove for all non-ARIA attrs
The HTML spec defines boolean attributes:
https://html.spec.whatwg.org/#boolean-attributes
that often correlate with boolean properties. If the attribute is missing, it
correlates with the `false` property value, if it's present - the `true`
property value. The only valid values are an empty string or the attribute name.
jQuery tried to be helpful here and treated boolean attributes in a special way
in the `.attr()` API:
1. For the getter, as long as the attribute was present, it was returning the
attribute name lowercased, ignoring the value.
2. For the setter, it was removing the attribute when `false` was passed;
otherwise, it was ignoring the passed value and set the attribute -
interestingly, in jQuery `>=3` not lowercased anymore.
The problem is the spec occasionally converts boolean attributes into ones with
additional attribute values with special behavior - one such example is the new
`"until-found"` value for the `hidden` attribute. Our setter normalization
means passing those values is impossible with jQuery. Also, new boolean
attributes are introduced occasionally and jQuery cannot easily add them to the
list without incurring breaking changes.
This patch removes any special handling of boolean attributes - the getter
returns the value as-is and the setter sets the provided value.
To provide better backwards compatibility with the very frequent `false` value
provided to remove the attribute, this patch makes `false` trigger attribute
removal for ALL non-ARIA attributes. ARIA attributes are exempt from the rule
since many of them recognize `"false"` as a valid value with semantics different
than the attribute missing. To remove an ARIA attribute, use `.removeAttr()` or
pass `null` as the value to `.attr()` which doesn't have this exception.
Fixes gh-5388
Closes gh-5452
Co-authored-by: Richard Gibson <richard.gibson@gmail.com>
2024-03-19 23:46:30 +00:00
QUnit . test ( "false setter removes non-ARIA attrs (gh-5388)" , function ( assert ) {
assert . expect ( 24 ) ;
var elem = jQuery ( "<input" +
" checked required autofocus" +
" type='checkbox'" +
" title='Example title'" +
" class='test-class'" +
" style='color: brown'" +
" aria-hidden='true'" +
" aria-checked='true'" +
" aria-label='Example ARIA label'" +
" data-prop='Example data value'" +
" data-title='Example data title'" +
" data-true='true'" +
">" ) ;
function testFalseSetter ( attributes , options ) {
var removal = options . removal ;
attributes . forEach ( function ( attrName ) {
assert . ok ( elem . attr ( attrName ) != null ,
"Attribute '" + attrName + "': initial defined value" ) ;
elem . attr ( attrName , false ) ;
if ( removal ) {
assert . strictEqual ( elem . attr ( attrName ) , undefined ,
"Attribute '" + attrName + "' removed" ) ;
} else {
assert . strictEqual ( elem . attr ( attrName ) , "false" ,
"Attribute '" + attrName + "' set to 'false'" ) ;
}
} ) ;
}
// Boolean attributes
testFalseSetter (
[ "checked" , "required" , "autofocus" ] ,
{ removal : true }
) ;
// Regular attributes
testFalseSetter (
[ "title" , "class" , "style" ] ,
{ removal : true }
) ;
// `aria-*` attributes
testFalseSetter (
[ "aria-hidden" , "aria-checked" , "aria-label" ] ,
{ removal : false }
) ;
// `data-*` attributes
testFalseSetter (
[ "data-prop" , "data-title" , "data-true" ] ,
{ removal : true }
) ;
} ) ;
2021-11-01 17:10:23 +00:00
// Test trustedTypes support in browsers where they're supported (currently Chrome 83+).
// Browsers with no TrustedScriptURL support still run tests on object wrappers with
// a proper `toString` function.
testIframe (
"Basic TrustedScriptURL support (gh-4948)" ,
"mock.php?action=trustedTypesAttributes" ,
function ( assert , jQuery , window , document , test ) {
var done = assert . async ( ) ;
assert . expect ( 1 ) ;
test . forEach ( function ( result ) {
assert . deepEqual ( result . actual , result . expected , result . message ) ;
} ) ;
supportjQuery . get ( baseURL + "mock.php?action=cspClean" ) . then ( done ) ;
}
) ;