2012-10-16 16:29:21 +00:00
module ( "attributes" , {
teardown : moduleTeardown
} ) ;
var bareObj = function ( value ) {
return value ;
} ;
2009-04-20 17:05:18 +00:00
2012-10-16 16:29:21 +00:00
var functionReturningObj = function ( value ) {
return ( function ( ) {
return value ;
} ) ;
} ;
2009-12-10 04:57:19 +00:00
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
2012-10-16 16:29:21 +00:00
test ( "jQuery.propFix integrity test" , function ( ) {
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
} ;
if ( ! jQuery . support . enctype ) {
props . enctype = "encoding" ;
}
2011-08-04 20:34:59 +00:00
2012-10-16 16:29:21 +00:00
deepEqual ( props , jQuery . propFix , "jQuery.propFix passes integrity check" ) ;
2010-11-09 21:31:52 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "attr(String)" , function ( ) {
2012-12-08 21:28:10 +00:00
expect ( 50 ) ;
2010-12-30 06:34:48 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#text1" ) . attr ( "type" ) , "text" , "Check for type attribute" ) ;
equal ( jQuery ( "#radio1" ) . attr ( "type" ) , "radio" , "Check for type attribute" ) ;
equal ( jQuery ( "#check1" ) . attr ( "type" ) , "checkbox" , "Check for type attribute" ) ;
equal ( jQuery ( "#simon1" ) . attr ( "rel" ) , "bookmark" , "Check for rel attribute" ) ;
equal ( jQuery ( "#google" ) . attr ( "title" ) , "Google!" , "Check for title attribute" ) ;
equal ( jQuery ( "#mark" ) . attr ( "hreflang" ) , "en" , "Check for hreflang attribute" ) ;
equal ( jQuery ( "#en" ) . attr ( "lang" ) , "en" , "Check for lang attribute" ) ;
equal ( jQuery ( "#simon" ) . attr ( "class" ) , "blog link" , "Check for class attribute" ) ;
equal ( jQuery ( "#name" ) . attr ( "name" ) , "name" , "Check for name attribute" ) ;
equal ( jQuery ( "#text1" ) . attr ( "name" ) , "action" , "Check for name attribute" ) ;
2011-04-11 20:33:29 +00:00
ok ( jQuery ( "#form" ) . attr ( "action" ) . indexOf ( "formaction" ) >= 0 , "Check for action attribute" ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#text1" ) . attr ( "value" , "t" ) . attr ( "value" ) , "t" , "Check setting the value attribute" ) ;
2012-12-08 21:28:10 +00:00
equal ( jQuery ( "#text1" ) . attr ( "value" , "" ) . attr ( "value" ) , "" , "Check setting the value attribute to empty string" ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "<div value='t'></div>" ) . attr ( "value" ) , "t" , "Check setting custom attr named 'value' on a div" ) ;
2013-02-27 20:44:34 +00:00
equal ( jQuery ( "#form" ) . attr ( "blah" , "blah" ) . attr ( "blah" ) , "blah" , "Set non-existent attribute on a form" ) ;
2011-11-06 20:27:42 +00:00
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")
2012-10-11 18:30:51 +00:00
var extras = jQuery ( "<input id='id' name='id' /><input id='name' name='name' /><input id='target' name='target' />" ) . appendTo ( "#testForm" ) ;
2011-09-12 23:40:14 +00:00
equal ( jQuery ( "#form" ) . attr ( "action" , "newformaction" ) . attr ( "action" ) , "newformaction" , "Check that action attribute was changed" ) ;
equal ( jQuery ( "#testForm" ) . attr ( "target" ) , undefined , "Retrieving target does not equal the input with name=target" ) ;
equal ( jQuery ( "#testForm" ) . attr ( "target" , "newTarget" ) . attr ( "target" ) , "newTarget" , "Set target successfully on a form" ) ;
equal ( jQuery ( "#testForm" ) . removeAttr ( "id" ) . attr ( "id" ) , undefined , "Retrieving id does not equal the input with name=id after id is removed [#7472]" ) ;
2011-03-25 06:07:15 +00:00
// Bug #3685 (form contains input with name="name")
2011-11-06 20:27:42 +00:00
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
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#text1" ) . attr ( "maxlength" ) , "30" , "Check for maxlength attribute" ) ;
equal ( jQuery ( "#text1" ) . attr ( "maxLength" ) , "30" , "Check for maxLength attribute" ) ;
equal ( jQuery ( "#area1" ) . attr ( "maxLength" ) , "30" , "Check for maxLength attribute" ) ;
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
2012-10-16 16:29:21 +00:00
jQuery ( "<a/>" ) . attr ( {
"id" : "tAnchor5" ,
"href" : "#5"
} ) . appendTo ( "#qunit-fixture" ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#tAnchor5" ) . attr ( "href" ) , "#5" , "Check for non-absolute href (an anchor)" ) ;
2012-11-02 00:50:45 +00:00
jQuery ( "<a id='tAnchor6' href='#5' />" ) . appendTo ( "#qunit-fixture" ) ;
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
2012-11-19 01:48:49 +00:00
$ ( "<script type='jquery/test' src='#5' id='scriptSrc'></script>" ) . appendTo ( "#qunit-fixture" ) ;
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
2012-10-16 16:29:21 +00:00
jQuery ( "#list-test" ) . attr ( "list" , "datalist" ) ;
2011-11-06 20:27:42 +00:00
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]
2012-10-16 16:29:21 +00:00
var body = document . body , $body = jQuery ( body ) ;
2009-03-18 21:15:38 +00:00
2011-04-11 20:33:29 +00:00
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" ) ;
2011-11-06 20:27:42 +00:00
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
2012-10-16 16:29:21 +00:00
$body . attr ( "foo" , "cool" ) ;
2011-11-06 20:27:42 +00:00
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
2011-04-11 20:33:29 +00:00
body . removeAttribute ( "foo" ) ; // Cleanup
2009-12-22 20:02:52 +00:00
2012-10-16 16:29:21 +00:00
var select = document . createElement ( "select" ) ,
optgroup = document . createElement ( "optgroup" ) ,
option = document . createElement ( "option" ) ;
2011-05-12 23:42:53 +00:00
optgroup . appendChild ( option ) ;
select . appendChild ( optgroup ) ;
2012-12-09 05:26:24 +00:00
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
2012-11-01 21:32:08 +00:00
var $img = jQuery ( "<img style='display:none' width='215' height='53' src='data/1x1.jpg'/>" ) . appendTo ( "body" ) ;
2011-11-06 20:27:42 +00:00
equal ( $img . attr ( "width" ) , "215" , "Retrieve width attribute an an element with display:none." ) ;
equal ( $img . attr ( "height" ) , "53" , "Retrieve height attribute an an element with display:none." ) ;
2011-04-02 01:13:01 +00:00
2011-03-30 01:49:37 +00:00
// Check for style support
2012-12-31 17:30:02 +00:00
var styleElem = jQuery ( "<div/>" ) . appendTo ( "#qunit-fixture" ) . css ( {
background : "url(UPPERlower.gif)"
} ) ;
ok ( ! ! ~ styleElem . attr ( "style" ) . indexOf ( "UPPERlower.gif" ) , "Check style attribute getter" ) ;
ok ( ! ! ~ styleElem . attr ( "style" , "position:absolute;" ) . attr ( "style" ) . indexOf ( "absolute" ) , "Check style setter" ) ;
2011-04-02 01:13:01 +00:00
2011-04-17 22:15:20 +00:00
// Check value on button element (#1954)
2012-12-08 21:28:10 +00:00
var $button = jQuery ( "<button>text</button>" ) . insertAfter ( "#button" ) ;
strictEqual ( $button . attr ( "value" ) , undefined , "Absence of value attribute on a button" ) ;
equal ( $button . attr ( "value" , "foobar" ) . attr ( "value" ) , "foobar" , "Value attribute on a button does not return innerHTML" ) ;
equal ( $button . attr ( "value" , "baz" ) . html ( ) , "text" , "Setting the value attribute does not change innerHTML" ) ;
2011-04-17 22:15:20 +00:00
2011-05-01 21:09:50 +00:00
// Attributes with a colon on a table element (#1591)
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#table" ) . attr ( "test:attrib" ) , undefined , "Retrieving a non-existent attribute on a table with a colon does not throw an error." ) ;
2012-10-16 16:29:21 +00:00
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
2011-05-14 16:07:40 +00:00
var $form = jQuery ( "<form class='something'></form>" ) . appendTo ( "#qunit-fixture" ) ;
2011-05-16 14:17:50 +00:00
equal ( $form . attr ( "class" ) , "something" , "Retrieve the class attribute on a form." ) ;
var $a = jQuery ( "<a href='#' onclick='something()'>Click</a>" ) . appendTo ( "#qunit-fixture" ) ;
equal ( $a . attr ( "onclick" ) , "something()" , "Retrieve ^on attribute without anonymous function wrapper." ) ;
2011-05-18 15:05:20 +00:00
ok ( jQuery ( "<div/>" ) . attr ( "doesntexist" ) === undefined , "Make sure undefined is returned when no attribute is found." ) ;
ok ( jQuery ( "<div/>" ) . attr ( "title" ) === undefined , "Make sure undefined is returned when no attribute is found." ) ;
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "<div/>" ) . attr ( "title" , "something" ) . attr ( "title" ) , "something" , "Set the title attribute." ) ;
2011-05-18 15:05:20 +00:00
ok ( jQuery ( ) . attr ( "doesntexist" ) === undefined , "Make sure undefined is returned when no element is there." ) ;
2011-05-18 15:46:22 +00:00
equal ( jQuery ( "<div/>" ) . attr ( "value" ) , undefined , "An unset value on a div returns undefined." ) ;
2012-12-08 21:28:10 +00:00
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
2012-10-16 16:29:21 +00:00
$form = jQuery ( "#form" ) . attr ( "enctype" , "multipart/form-data" ) ;
2011-10-22 20:03:57 +00:00
equal ( $form . prop ( "enctype" ) , "multipart/form-data" , "Set the enctype of a form (encoding in IE6/7 #6743)" ) ;
2012-10-01 23:36:54 +00:00
} ) ;
test ( "attr(String) on cloned elements, #9646" , function ( ) {
expect ( 4 ) ;
var div ,
input = jQuery ( "<input name='tester' />" ) ;
input . attr ( "name" ) ;
strictEqual ( input . clone ( true ) . attr ( "name" , "test" ) [ 0 ] . name , "test" , "Name attribute should be changed on cloned element" ) ;
div = jQuery ( "<div id='tester' />" ) ;
div . attr ( "id" ) ;
strictEqual ( div . clone ( true ) . attr ( "id" , "test" ) [ 0 ] . id , "test" , "Id attribute should be changed on cloned element" ) ;
input = jQuery ( "<input value='tester' />" ) ;
input . attr ( "value" ) ;
strictEqual ( input . clone ( true ) . attr ( "value" , "test" ) [ 0 ] . value , "test" , "Value attribute should be changed on cloned element" ) ;
strictEqual ( input . clone ( true ) . attr ( "value" , 42 ) [ 0 ] . value , "42" , "Value attribute should be changed on cloned element" ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "attr(String) in XML Files" , function ( ) {
expect ( 3 ) ;
2012-04-15 21:41:54 +00:00
var xml = createDashboardXML ( ) ;
equal ( jQuery ( "locations" , xml ) . attr ( "class" ) , "foo" , "Check class attribute in XML document" ) ;
equal ( jQuery ( "location" , xml ) . attr ( "for" ) , "bar" , "Check for attribute in XML document" ) ;
equal ( jQuery ( "location" , xml ) . attr ( "checked" ) , "different" , "Check that hooks are not attached in XML document" ) ;
} ) ;
2009-03-18 21:15:38 +00:00
2012-10-16 16:29:21 +00:00
test ( "attr(String, Function)" , function ( ) {
expect ( 2 ) ;
equal (
jQuery ( "#text1" ) . attr ( "value" , function ( ) {
return this . id ;
2012-12-08 21:28:10 +00:00
} ) . attr ( "value" ) ,
2012-10-16 16:29:21 +00:00
"text1" ,
"Set value from id"
) ;
equal (
jQuery ( "#text1" ) . attr ( "title" , function ( i ) {
return i ;
} ) . attr ( "title" ) ,
"0" ,
"Set value with an index"
) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "attr(Hash)" , function ( ) {
expect ( 3 ) ;
2009-03-18 21:15:38 +00:00
var pass = true ;
2012-10-16 16:29:21 +00:00
jQuery ( "div" ) . attr ( {
"foo" : "baz" ,
"zoo" : "ping"
} ) . each ( function ( ) {
2012-06-21 19:30:24 +00:00
if ( this . getAttribute ( "foo" ) != "baz" && this . getAttribute ( "zoo" ) != "ping" ) {
pass = false ;
}
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
2009-03-18 21:15:38 +00:00
ok ( pass , "Set Multiple Attributes" ) ;
2012-10-16 16:29:21 +00:00
equal (
jQuery ( "#text1" ) . attr ( {
"value" : function ( ) {
return this [ "id" ] ;
2012-12-08 21:28:10 +00:00
} } ) . attr ( "value" ) ,
2012-10-16 16:29:21 +00:00
"text1" ,
"Set attribute to computed value #1"
) ;
equal (
jQuery ( "#text1" ) . attr ( {
"title" : function ( i ) {
return i ;
}
} ) . attr ( "title" ) ,
"0" ,
"Set attribute to computed value #2"
) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "attr(String, Object)" , function ( ) {
2012-12-16 15:39:19 +00:00
expect ( 71 ) ;
2010-09-28 15:12:13 +00:00
2009-03-18 21:15:38 +00:00
var div = jQuery ( "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 ++ ) {
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
2011-11-06 20:27:42 +00:00
equal ( fail , false , "Set Attribute, the #" + fail + " element didn't get the attribute 'foo'" ) ;
2009-03-18 21:15:38 +00:00
2012-10-16 16:29:21 +00:00
ok (
jQuery ( "#foo" ) . attr ( {
"width" : null
} ) ,
"Try to set an attribute to nothing"
) ;
2009-03-18 21:15:38 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#name" ) . attr ( "name" , "something" ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#name" ) . attr ( "name" ) , "something" , "Set name attribute" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#name" ) . attr ( "name" , null ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#name" ) . attr ( "name" ) , undefined , "Remove name attribute" ) ;
2012-12-09 05:26:24 +00:00
2012-10-16 16:29:21 +00:00
var $input = jQuery ( "<input>" , {
name : "something" ,
id : "specified"
} ) ;
2011-09-12 23:40:14 +00:00
equal ( $input . attr ( "name" ) , "something" , "Check element creation gets/sets the name attribute." ) ;
equal ( $input . attr ( "id" ) , "specified" , "Check element creation gets/sets the id attribute." ) ;
2011-05-04 19:53:00 +00:00
2012-12-16 15:39:19 +00:00
// As of fixing #11115, we only guarantee boolean property update for checked and selected
$input = jQuery ( "<input type='checkbox'/>" ) . attr ( "checked" , true ) ;
equal ( $input . prop ( "checked" ) , true , "Setting checked updates property (verified by .prop)" ) ;
equal ( $input [ 0 ] . checked , true , "Setting checked updates property (verified by native property)" ) ;
$input = jQuery ( "<option/>" ) . attr ( "selected" , true ) ;
equal ( $input . prop ( "selected" ) , true , "Setting selected updates property (verified by .prop)" ) ;
equal ( $input [ 0 ] . selected , true , "Setting selected updates property (verified by native property)" ) ;
2012-12-09 05:26:24 +00:00
$input = jQuery ( "#check2" ) ;
$input . prop ( "checked" , true ) . prop ( "checked" , false ) . attr ( "checked" , true ) ;
equal ( $input . attr ( "checked" ) , "checked" , "Set checked (verified by .attr)" ) ;
$input . prop ( "checked" , false ) . prop ( "checked" , true ) . attr ( "checked" , false ) ;
equal ( $input . attr ( "checked" ) , undefined , "Remove checked (verified by .attr)" ) ;
$input = jQuery ( "#text1" ) . prop ( "readOnly" , true ) . prop ( "readOnly" , false ) . attr ( "readonly" , true ) ;
equal ( $input . attr ( "readonly" ) , "readonly" , "Set readonly (verified by .attr)" ) ;
$input . prop ( "readOnly" , false ) . prop ( "readOnly" , true ) . attr ( "readonly" , false ) ;
equal ( $input . attr ( "readonly" ) , undefined , "Remove readonly (verified by .attr)" ) ;
$input = jQuery ( "#check2" ) . attr ( "checked" , true ) . attr ( "checked" , false ) . prop ( "checked" , true ) ;
equal ( $input [ 0 ] . checked , true , "Set checked property (verified by native property)" ) ;
equal ( $input . prop ( "checked" ) , true , "Set checked property (verified by .prop)" ) ;
equal ( $input . attr ( "checked" ) , undefined , "Setting checked property doesn't affect checked attribute" ) ;
$input . attr ( "checked" , false ) . attr ( "checked" , true ) . prop ( "checked" , false ) ;
equal ( $input [ 0 ] . checked , false , "Clear checked property (verified by native property)" ) ;
equal ( $input . prop ( "checked" ) , false , "Clear checked property (verified by .prop)" ) ;
equal ( $input . attr ( "checked" ) , "checked" , "Clearing checked property doesn't affect checked attribute" ) ;
$input = jQuery ( "#check2" ) . attr ( "checked" , false ) . attr ( "checked" , "checked" ) ;
equal ( $input . attr ( "checked" ) , "checked" , "Set checked to 'checked' (verified by .attr)" ) ;
2011-09-14 18:25:14 +00:00
var $radios = jQuery ( "#checkedtest" ) . find ( "input[type='radio']" ) ;
2013-01-27 04:48:59 +00:00
$radios . eq ( 1 ) . trigger ( "click" ) ;
2012-10-16 16:29:21 +00:00
equal ( $radios . eq ( 1 ) . prop ( "checked" ) , true , "Second radio was checked when clicked" ) ;
2012-12-09 05:26:24 +00:00
equal ( $radios . eq ( 0 ) . attr ( "checked" ) , "checked" , "First radio is still [checked]" ) ;
$input = jQuery ( "#text1" ) . attr ( "readonly" , false ) . prop ( "readOnly" , true ) ;
equal ( $input [ 0 ] . readOnly , true , "Set readonly property (verified by native property)" ) ;
equal ( $input . prop ( "readOnly" ) , true , "Set readonly property (verified by .prop)" ) ;
$input . attr ( "readonly" , true ) . prop ( "readOnly" , false ) ;
equal ( $input [ 0 ] . readOnly , false , "Clear readonly property (verified by native property)" ) ;
equal ( $input . prop ( "readOnly" ) , false , "Clear readonly property (verified by .prop)" ) ;
$input = jQuery ( "#name" ) . attr ( "maxlength" , "5" ) ;
equal ( $input [ 0 ] . maxLength , 5 , "Set maxlength (verified by native property)" ) ;
$input . attr ( "maxLength" , "10" ) ;
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
var $text = jQuery ( "#text1" ) . attr ( {
"autofocus" : true ,
"required" : true
} ) ;
2012-12-09 05:26:24 +00:00
equal ( $text . attr ( "autofocus" ) , "autofocus" , "Reading autofocus attribute yields 'autofocus'" ) ;
equal ( $text . attr ( "autofocus" , false ) . attr ( "autofocus" ) , undefined , "Setting autofocus to false removes it" ) ;
equal ( $text . attr ( "required" ) , "required" , "Reading required attribute yields 'required'" ) ;
2012-10-16 16:29:21 +00:00
equal ( $text . attr ( "required" , false ) . attr ( "required" ) , undefined , "Setting required attribute to false removes it" ) ;
2011-07-09 18:41:58 +00:00
var $details = jQuery ( "<details open></details>" ) . appendTo ( "#qunit-fixture" ) ;
2013-02-27 20:44:34 +00:00
equal ( $details . attr ( "open" ) , "open" , "open attribute presence indicates true" ) ;
2012-10-16 16:29:21 +00:00
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 ) ;
2011-08-04 20:34:59 +00:00
equal ( $text . attr ( "data-something" ) , "true" , "Set data attributes" ) ;
equal ( $text . data ( "something" ) , true , "Setting data attributes are not affected by boolean settings" ) ;
2012-10-16 16:29:21 +00:00
$text . attr ( "data-another" , false ) ;
2011-08-04 20:34:59 +00:00
equal ( $text . attr ( "data-another" ) , "false" , "Set data attributes" ) ;
equal ( $text . data ( "another" ) , false , "Setting data attributes are not affected by boolean settings" ) ;
2012-10-16 16:29:21 +00:00
equal ( $text . attr ( "aria-disabled" , false ) . attr ( "aria-disabled" ) , "false" , "Setting aria attributes are not affected by boolean settings" ) ;
2011-04-23 21:07:31 +00:00
$text . removeData ( "something" ) . removeData ( "another" ) . removeAttr ( "aria-disabled" ) ;
2011-05-05 16:52:04 +00:00
jQuery ( "#foo" ) . attr ( "contenteditable" , true ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#foo" ) . attr ( "contenteditable" ) , "true" , "Enumerated attributes are set properly" ) ;
2011-05-05 16:52:04 +00:00
2011-03-14 02:24:45 +00:00
var attributeNode = document . createAttribute ( "irrelevant" ) ,
commentNode = document . createComment ( "some comment" ) ,
2011-05-10 04:27:52 +00:00
textNode = document . createTextNode ( "some text" ) ,
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" ) ;
strictEqual ( $elem . attr ( "nonexisting" ) , undefined , "attr(name, value) works correctly on comment and text nodes (bug #7500)." ) ;
} ) ;
2012-12-09 05:26:24 +00:00
// Register the property name to avoid generating a new global when testing window
Globals . register ( "nonexisting" ) ;
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 ) ;
2011-05-10 04:27:52 +00:00
strictEqual ( $elem . attr ( "nonexisting" ) , undefined , "attr works correctly for non existing attributes (bug #7500)." ) ;
2012-12-09 05:26:24 +00:00
equal ( $elem . attr ( "nonexisting" , "foo" ) . attr ( "nonexisting" ) , "foo" , "attr falls back to prop on unsupported arguments" ) ;
elem . nonexisting = oldVal ;
2011-03-14 02:24:45 +00:00
} ) ;
2010-11-13 13:39:28 +00:00
2011-04-11 20:33:29 +00:00
var 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>" ) ,
2013-02-19 04:52:29 +00:00
td = table . find ( "td" ) . eq ( 0 ) ;
2012-10-16 16:29:21 +00:00
td . attr ( "rowspan" , "2" ) ;
equal ( td [ 0 ] [ "rowSpan" ] , 2 , "Check rowspan is correctly set" ) ;
td . attr ( "colspan" , "2" ) ;
equal ( td [ 0 ] [ "colSpan" ] , 2 , "Check colspan is correctly set" ) ;
2009-05-16 15:10:24 +00:00
table . attr ( "cellspacing" , "2" ) ;
2012-10-16 16:29:21 +00:00
equal ( table [ 0 ] [ "cellSpacing" ] , "2" , "Check cellspacing is correctly set" ) ;
2009-05-16 15:10:24 +00:00
2012-12-08 21:28:10 +00:00
equal ( jQuery ( "#area1" ) . attr ( "value" ) , undefined , "Value attribute is distinct from value property." ) ;
2011-05-08 02:01:10 +00:00
2009-03-18 21:15:38 +00:00
// for #1070
2012-10-16 16:29:21 +00:00
jQuery ( "#name" ) . attr ( "someAttr" , "0" ) ;
equal ( jQuery ( "#name" ) . attr ( "someAttr" ) , "0" , "Set attribute to a string of '0'" ) ;
jQuery ( "#name" ) . attr ( "someAttr" , 0 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#name" ) . attr ( "someAttr" ) , "0" , "Set attribute to the number 0" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#name" ) . attr ( "someAttr" , 1 ) ;
2011-11-06 20:27:42 +00:00
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
var j = jQuery ( "#nonnodes" ) . contents ( ) ;
2012-10-16 16:29:21 +00:00
j . attr ( "name" , "attrvalue" ) ;
2011-11-06 20:27:42 +00:00
equal ( j . attr ( "name" ) , "attrvalue" , "Check node,textnode,comment for attr" ) ;
2009-03-18 21:15:38 +00:00
j . removeAttr ( "name" ) ;
2011-03-25 14:40:46 +00:00
// Type
2011-04-11 20:33:29 +00:00
var type = jQuery ( "#check2" ) . attr ( "type" ) ;
2009-03-18 21:15:38 +00:00
try {
2012-10-16 16:29:21 +00:00
jQuery ( "#check2" ) . attr ( "type" , "hidden" ) ;
2012-12-12 04:03:12 +00:00
ok ( true , "No exception thrown on input type change" ) ;
2012-10-16 16:29:21 +00:00
} catch ( e ) {
2012-12-12 04:03:12 +00:00
ok ( true , "Exception thrown on input type change: " + e ) ;
2009-03-18 21:15:38 +00:00
}
var check = document . createElement ( "input" ) ;
2012-12-12 04:35:51 +00:00
var thrown = true ;
2009-03-18 21:15:38 +00:00
try {
2012-10-16 16:29:21 +00:00
jQuery ( check ) . attr ( "type" , "checkbox" ) ;
} catch ( e ) {
2009-03-18 21:15:38 +00:00
thrown = false ;
}
ok ( thrown , "Exception thrown when trying to change type property" ) ;
2012-10-16 16:29:21 +00:00
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
2011-09-14 18:25:14 +00:00
check = jQuery ( "<input />" ) ;
thrown = true ;
2009-03-18 21:15:38 +00:00
try {
2012-10-16 16:29:21 +00:00
check . attr ( "type" , "checkbox" ) ;
} catch ( e ) {
2009-03-18 21:15:38 +00:00
thrown = false ;
}
ok ( thrown , "Exception thrown when trying to change type property" ) ;
2011-11-06 20:27:42 +00:00
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
2009-03-18 21:15:38 +00:00
var button = jQuery ( "#button" ) ;
try {
2012-10-16 16:29:21 +00:00
button . attr ( "type" , "submit" ) ;
2012-12-12 04:03:12 +00:00
ok ( true , "No exception thrown on button type change" ) ;
2012-10-16 16:29:21 +00:00
} catch ( e ) {
2012-12-12 04:03:12 +00:00
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
2012-10-16 16:29:21 +00:00
var $radio = jQuery ( "<input>" , {
"value" : "sup" ,
"type" : "radio"
} ) . appendTo ( "#testForm" ) ;
2011-11-06 20:27:42 +00:00
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
2011-03-25 14:40:46 +00:00
// Setting attributes on svg elements (bug #3116)
2012-06-21 19:30:24 +00:00
var $svg = jQuery (
"<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'>" +
"<circle cx='200' cy='200' r='150' />" +
"</svg>"
) . appendTo ( "body" ) ;
2012-10-16 16:29:21 +00:00
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
2012-10-16 16:29:21 +00:00
jQuery ( "#name" ) . attr ( "maxlength" , "5" ) . removeAttr ( "nonexisting" ) ;
equal ( typeof jQuery ( "#name" ) . attr ( "maxlength" , undefined ) , "object" , ".attr('attribute', undefined) is chainable (#5571)" ) ;
equal ( jQuery ( "#name" ) . attr ( "maxlength" , undefined ) . attr ( "maxlength" ) , "5" , ".attr('attribute', undefined) does not change value (#5571)" ) ;
equal ( jQuery ( "#name" ) . attr ( "nonexisting" , undefined ) . attr ( "nonexisting" ) , undefined , ".attr('attribute', undefined) does not create attribute (#5571)" ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "attr(String, Object) - Loaded via XML document" , function ( ) {
2012-05-30 17:46:50 +00:00
expect ( 2 ) ;
2012-04-15 21:52:48 +00:00
var xml = createDashboardXML ( ) ;
var titles = [ ] ;
jQuery ( "tab" , xml ) . each ( function ( ) {
2012-10-16 16:29:21 +00:00
titles . push ( jQuery ( this ) . attr ( "title" ) ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
equal ( titles [ 0 ] , "Location" , "attr() in XML context: Check first title" ) ;
equal ( titles [ 1 ] , "Users" , "attr() in XML context: Check second title" ) ;
2012-04-15 21:52:48 +00:00
} ) ;
2009-03-18 21:15:38 +00:00
2012-10-15 18:20:36 +00:00
test ( "attr(String, Object) - Loaded via XML fragment" , function ( ) {
expect ( 2 ) ;
var frag = createXMLFragment ( ) ,
$frag = jQuery ( frag ) ;
$frag . attr ( "test" , "some value" ) ;
equal ( $frag . attr ( "test" ) , "some value" , "set attribute" ) ;
$frag . attr ( "test" , null ) ;
equal ( $frag . attr ( "test" ) , undefined , "remove attribute" ) ;
} ) ;
2012-10-16 16:29:21 +00:00
test ( "attr('tabindex')" , function ( ) {
2012-05-30 17:46:50 +00:00
expect ( 8 ) ;
2009-03-18 21:15:38 +00:00
// elements not natively tabbable
2012-05-30 18:16:27 +00:00
equal ( jQuery ( "#listWithTabIndex" ) . attr ( "tabindex" ) , "5" , "not natively tabbable, with tabindex set to 0" ) ;
2012-05-30 17:46:50 +00:00
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
2012-05-30 17:46:50 +00:00
equal ( jQuery ( "#linkWithNoTabIndex" ) . attr ( "tabindex" ) , undefined , "anchor with href, no tabindex set" ) ;
2012-05-30 18:16:27 +00:00
equal ( jQuery ( "#linkWithTabIndex" ) . attr ( "tabindex" ) , "2" , "anchor with href, tabindex set to 2" ) ;
equal ( jQuery ( "#linkWithNegativeTabIndex" ) . attr ( "tabindex" ) , "-1" , "anchor with href, tabindex set to -1" ) ;
2009-03-18 21:15:38 +00:00
// anchor without href
2012-05-30 17:46:50 +00:00
equal ( jQuery ( "#linkWithNoHrefWithNoTabIndex" ) . attr ( "tabindex" ) , undefined , "anchor without href, no tabindex set" ) ;
2012-05-30 18:16:27 +00:00
equal ( jQuery ( "#linkWithNoHrefWithTabIndex" ) . attr ( "tabindex" ) , "1" , "anchor without href, tabindex set to 2" ) ;
equal ( jQuery ( "#linkWithNoHrefWithNegativeTabIndex" ) . attr ( "tabindex" ) , "-1" , "anchor without href, no tabindex set" ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "attr('tabindex', value)" , function ( ) {
2012-05-30 17:46:50 +00:00
expect ( 9 ) ;
2009-03-18 21:15:38 +00:00
2011-04-11 20:33:29 +00:00
var element = jQuery ( "#divWithNoTabIndex" ) ;
2012-05-30 17:46:50 +00:00
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" ) ;
2012-05-30 18:16:27 +00:00
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" ) ;
2012-05-30 18:16:27 +00:00
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" ) ;
2012-05-30 18:16:27 +00:00
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 ) ;
2012-05-30 18:16:27 +00:00
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 ) ;
2012-05-30 18:16:27 +00:00
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 ) ;
2012-05-30 18:16:27 +00:00
equal ( element . attr ( "tabindex" ) , "-1" , "set tabindex to -1 (number)" ) ;
2009-05-02 21:14:38 +00:00
2011-04-11 20:33:29 +00:00
element = jQuery ( "#linkWithTabIndex" ) ;
2012-05-30 18:16:27 +00:00
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 ) ;
2012-05-30 18:16:27 +00:00
equal ( element . attr ( "tabindex" ) , "-1" , "set negative tabindex" ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "removeAttr(String)" , function ( ) {
2012-07-12 02:46:34 +00:00
expect ( 12 ) ;
2011-10-17 20:45:27 +00:00
var $first ;
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#mark" ) . removeAttr ( "class" ) . attr ( "class" ) , undefined , "remove class" ) ;
2011-08-25 19:33:38 +00:00
equal ( jQuery ( "#form" ) . removeAttr ( "id" ) . attr ( "id" ) , undefined , "Remove id" ) ;
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#foo" ) . attr ( "style" , "position:absolute;" ) . removeAttr ( "style" ) . attr ( "style" ) , undefined , "Check removing style attribute" ) ;
equal ( jQuery ( "#form" ) . attr ( "style" , "position:absolute;" ) . removeAttr ( "style" ) . attr ( "style" ) , undefined , "Check removing style attribute on a form" ) ;
2011-08-25 19:33:38 +00:00
equal ( jQuery ( "<div style='position: absolute'></div>" ) . appendTo ( "#foo" ) . removeAttr ( "style" ) . prop ( "style" ) . cssText , "" , "Check removing style attribute (#9699 Webkit)" ) ;
2012-10-16 16:29:21 +00:00
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
2012-10-16 16:29:21 +00:00
jQuery ( "#check1" ) . removeAttr ( "checked" ) . prop ( "checked" , true ) . removeAttr ( "checked" ) ;
2011-08-25 19:33:38 +00:00
equal ( document . getElementById ( "check1" ) . checked , false , "removeAttr sets boolean properties to false" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . prop ( "readOnly" , true ) . removeAttr ( "readonly" ) ;
2011-08-25 19:33:38 +00:00
equal ( document . getElementById ( "text1" ) . readOnly , false , "removeAttr sets boolean properties to false" ) ;
2011-10-06 21:17:51 +00:00
2012-03-05 17:54:44 +00:00
jQuery ( "#option2c" ) . removeAttr ( "selected" ) ;
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#option2d" ) . attr ( "selected" ) , "selected" , "Removing `selected` from an option that is not selected does not remove selected from the currently selected option (#10870)" ) ;
2012-03-05 17:54:44 +00:00
2011-10-06 21:17:51 +00:00
try {
2012-10-16 16:29:21 +00:00
$first = jQuery ( "#first" ) . attr ( "contenteditable" , "true" ) . removeAttr ( "contenteditable" ) ;
2012-10-16 14:17:14 +00:00
equal ( $first . attr ( "contenteditable" ) , undefined , "Remove the contenteditable attribute" ) ;
2012-10-16 16:29:21 +00:00
} catch ( e ) {
2011-10-06 21:17:51 +00:00
ok ( false , "Removing contenteditable threw an error (#10429)" ) ;
}
2012-10-16 14:17:14 +00:00
2012-07-12 02:46:34 +00:00
$first = jQuery ( "<div Case='mixed'></div>" ) ;
equal ( $first . attr ( "Case" ) , "mixed" , "case of attribute doesn't matter" ) ;
$first . removeAttr ( "Case" ) ;
// IE 6/7 return empty string here, not undefined
ok ( ! $first . attr ( "Case" ) , "mixed-case attribute was removed" ) ;
} ) ;
2012-10-16 16:29:21 +00:00
test ( "removeAttr(String) in XML" , function ( ) {
2012-07-12 02:46:34 +00:00
expect ( 7 ) ;
var xml = createDashboardXML ( ) ,
iwt = jQuery ( "infowindowtab" , xml ) ;
equal ( iwt . attr ( "normal" ) , "ab" , "Check initial value" ) ;
iwt . removeAttr ( "Normal" ) ;
equal ( iwt . attr ( "normal" ) , "ab" , "Should still be there" ) ;
iwt . removeAttr ( "normal" ) ;
equal ( iwt . attr ( "normal" ) , undefined , "Removed" ) ;
equal ( iwt . attr ( "mixedCase" ) , "yes" , "Check initial value" ) ;
equal ( iwt . attr ( "mixedcase" ) , undefined , "toLowerCase not work good" ) ;
iwt . removeAttr ( "mixedcase" ) ;
equal ( iwt . attr ( "mixedCase" ) , "yes" , "Should still be there" ) ;
iwt . removeAttr ( "mixedCase" ) ;
equal ( iwt . attr ( "mixedCase" ) , undefined , "Removed" ) ;
2011-03-08 17:07:05 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "removeAttr(Multi String, variable space width)" , function ( ) {
expect ( 8 ) ;
2011-11-13 08:10:21 +00:00
var div = jQuery ( "<div id='a' alt='b' title='c' rel='d'></div>" ) ,
tests = {
id : "a" ,
alt : "b" ,
title : "c" ,
rel : "d"
} ;
jQuery . each ( tests , function ( key , val ) {
2012-10-16 16:29:21 +00:00
equal ( div . attr ( key ) , val , "Attribute `" + key + "` exists, and has a value of `" + val + "`" ) ;
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
jQuery . each ( tests , function ( key , val ) {
2012-10-16 16:29:21 +00:00
equal ( div . attr ( key ) , undefined , "Attribute `" + key + "` was removed" ) ;
2011-11-13 08:10:21 +00:00
} ) ;
} ) ;
2012-10-16 16:29:21 +00:00
test ( "prop(String, Object)" , function ( ) {
expect ( 31 ) ;
2011-05-04 04:31:01 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#text1" ) . prop ( "value" ) , "Test" , "Check for value attribute" ) ;
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#text1" ) . prop ( "value" , "Test2" ) . prop ( "defaultValue" ) , "Test" , "Check for defaultValue attribute" ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#select2" ) . prop ( "selectedIndex" ) , 3 , "Check for selectedIndex attribute" ) ;
equal ( jQuery ( "#foo" ) . prop ( "nodeName" ) . toUpperCase ( ) , "DIV" , "Check for nodeName attribute" ) ;
equal ( jQuery ( "#foo" ) . prop ( "tagName" ) . toUpperCase ( ) , "DIV" , "Check for tagName attribute" ) ;
equal ( jQuery ( "<option/>" ) . prop ( "selected" ) , false , "Check selected attribute on disconnected element." ) ;
2011-05-04 04:31:01 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#listWithTabIndex" ) . prop ( "tabindex" ) , 5 , "Check retrieving tabindex" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . prop ( "readonly" , true ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . readOnly , true , "Check setting readOnly property with 'readonly'" ) ;
equal ( jQuery ( "#label-for" ) . prop ( "for" ) , "action" , "Check retrieving htmlFor" ) ;
2011-05-04 04:31:01 +00:00
jQuery ( "#text1" ) . prop ( "class" , "test" ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . className , "test" , "Check setting className with 'class'" ) ;
equal ( jQuery ( "#text1" ) . prop ( "maxlength" ) , 30 , "Check retrieving maxLength" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#table" ) . prop ( "cellspacing" , 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#table" ) . prop ( "cellSpacing" ) , "1" , "Check setting and retrieving cellSpacing" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#table" ) . prop ( "cellpadding" , 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#table" ) . prop ( "cellPadding" ) , "1" , "Check setting and retrieving cellPadding" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#table" ) . prop ( "rowspan" , 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#table" ) . prop ( "rowSpan" ) , 1 , "Check setting and retrieving rowSpan" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#table" ) . prop ( "colspan" , 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#table" ) . prop ( "colSpan" ) , 1 , "Check setting and retrieving colSpan" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#table" ) . prop ( "usemap" , 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#table" ) . prop ( "useMap" ) , 1 , "Check setting and retrieving useMap" ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#table" ) . prop ( "frameborder" , 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#table" ) . prop ( "frameBorder" ) , 1 , "Check setting and retrieving frameBorder" ) ;
2011-05-04 04:31:01 +00:00
QUnit . reset ( ) ;
2011-10-22 20:03:57 +00:00
var body = document . body ,
$body = jQuery ( body ) ;
2011-05-04 04:31:01 +00:00
ok ( $body . prop ( "nextSibling" ) === null , "Make sure a null expando returns null" ) ;
2012-07-05 19:52:13 +00:00
body [ "foo" ] = "bar" ;
2011-11-06 20:27:42 +00:00
equal ( $body . prop ( "foo" ) , "bar" , "Make sure the expando is preferred over the dom attribute" ) ;
2012-07-05 19:52:13 +00:00
body [ "foo" ] = undefined ;
2011-05-04 04:31:01 +00:00
ok ( $body . prop ( "foo" ) === undefined , "Make sure the expando is preferred over the dom attribute, even if undefined" ) ;
2012-10-16 16:29:21 +00:00
var select = document . createElement ( "select" ) ,
optgroup = document . createElement ( "optgroup" ) ,
option = document . createElement ( "option" ) ;
2011-05-04 04:31:01 +00:00
optgroup . appendChild ( option ) ;
select . appendChild ( optgroup ) ;
2012-10-16 16:29:21 +00:00
equal ( jQuery ( option ) . prop ( "selected" ) , true , "Make sure that a single option is selected, even when in an optgroup." ) ;
equal ( jQuery ( document ) . prop ( "nodeName" ) , "#document" , "prop works correctly on document nodes (bug #7451)." ) ;
2011-05-04 04:31:01 +00:00
var attributeNode = document . createAttribute ( "irrelevant" ) ,
commentNode = document . createComment ( "some comment" ) ,
textNode = document . createTextNode ( "some text" ) ,
obj = { } ;
2012-10-16 16:29:21 +00:00
jQuery . each ( [ document , attributeNode , commentNode , textNode , obj , "#firstp" ] , function ( i , ele ) {
strictEqual ( jQuery ( ele ) . prop ( "nonexisting" ) , undefined , "prop works correctly for non existing attributes (bug #7500)." ) ;
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" ) ;
equal ( $ele . prop ( "nonexisting" ) , "foo" , "prop(name, value) works correctly for non existing attributes (bug #7500)." ) ;
} ) ;
jQuery ( document ) . removeProp ( "nonexisting" ) ;
2011-10-22 20:03:57 +00:00
2012-10-16 16:29:21 +00:00
var $form = jQuery ( "#form" ) . prop ( "enctype" , "multipart/form-data" ) ;
2011-10-22 20:03:57 +00:00
equal ( $form . prop ( "enctype" ) , "multipart/form-data" , "Set the enctype of a form (encoding in IE6/7 #6743)" ) ;
2011-05-04 04:31:01 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "prop('tabindex')" , function ( ) {
expect ( 8 ) ;
2011-08-04 19:47:53 +00:00
// elements not natively tabbable
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#listWithTabIndex" ) . prop ( "tabindex" ) , 5 , "not natively tabbable, with tabindex set to 0" ) ;
equal ( jQuery ( "#divWithNoTabIndex" ) . prop ( "tabindex" ) , undefined , "not natively tabbable, no tabindex set" ) ;
2011-08-04 19:47:53 +00:00
// anchor with href
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#linkWithNoTabIndex" ) . prop ( "tabindex" ) , 0 , "anchor with href, no tabindex set" ) ;
equal ( jQuery ( "#linkWithTabIndex" ) . prop ( "tabindex" ) , 2 , "anchor with href, tabindex set to 2" ) ;
equal ( jQuery ( "#linkWithNegativeTabIndex" ) . prop ( "tabindex" ) , - 1 , "anchor with href, tabindex set to -1" ) ;
2011-08-04 19:47:53 +00:00
// anchor without href
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#linkWithNoHrefWithNoTabIndex" ) . prop ( "tabindex" ) , undefined , "anchor without href, no tabindex set" ) ;
equal ( jQuery ( "#linkWithNoHrefWithTabIndex" ) . prop ( "tabindex" ) , 1 , "anchor without href, tabindex set to 2" ) ;
equal ( jQuery ( "#linkWithNoHrefWithNegativeTabIndex" ) . prop ( "tabindex" ) , - 1 , "anchor without href, no tabindex set" ) ;
2011-08-04 19:47:53 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "prop('tabindex', value)" , 10 , function ( ) {
2012-09-29 04:23:55 +00:00
2012-10-16 16:29:21 +00:00
var clone ,
element = jQuery ( "#divWithNoTabIndex" ) ;
2011-08-04 19:47:53 +00:00
2012-10-16 16:29:21 +00:00
equal ( element . prop ( "tabindex" ) , undefined , "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" ) ;
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" ) ;
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" ) ;
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 ) ;
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 ) ;
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 ) ;
equal ( element . prop ( "tabindex" ) , - 1 , "set tabindex to -1 (number)" ) ;
2011-08-04 19:47:53 +00:00
element = jQuery ( "#linkWithTabIndex" ) ;
2012-09-29 04:23:55 +00:00
equal ( element . prop ( "tabindex" ) , 2 , "start with tabindex 2" ) ;
element . prop ( "tabindex" , - 1 ) ;
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 ) ;
2012-10-01 02:19:31 +00:00
equal ( clone [ 0 ] . getAttribute ( "tabindex" ) , "1" , "set tabindex on cloned element" ) ;
2011-08-04 19:47:53 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "removeProp(String)" , function ( ) {
expect ( 6 ) ;
2010-11-13 13:39:28 +00:00
var attributeNode = document . createAttribute ( "irrelevant" ) ,
commentNode = document . createComment ( "some comment" ) ,
textNode = document . createTextNode ( "some text" ) ,
obj = { } ;
2011-03-08 17:07:05 +00:00
2012-10-16 16:29:21 +00:00
strictEqual (
jQuery ( "#firstp" ) . prop ( "nonexisting" , "foo" ) . removeProp ( "nonexisting" ) [ 0 ] [ "nonexisting" ] ,
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 ) ;
2012-10-16 16:29:21 +00:00
$ele . prop ( "nonexisting" , "foo" ) . removeProp ( "nonexisting" ) ;
2012-07-05 19:52:13 +00:00
strictEqual ( ele [ "nonexisting" ] , undefined , "removeProp works correctly on non DOM element nodes (bug #7500)." ) ;
2010-11-13 13:39:28 +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 ) ;
2012-10-16 16:29:21 +00:00
$ele . prop ( "nonexisting" , "foo" ) . removeProp ( "nonexisting" ) ;
2012-07-05 19:52:13 +00:00
strictEqual ( ele [ "nonexisting" ] , undefined , "removeProp works correctly on non DOM element nodes (bug #7500)." ) ;
2010-11-13 13:39:28 +00:00
} ) ;
2010-01-07 16:15:40 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "val()" , function ( ) {
2012-09-21 15:53:03 +00:00
expect ( 21 + ( jQuery . fn . serialize ? 6 : 0 ) ) ;
2010-01-07 14:55:15 +00:00
2011-04-11 20:33:29 +00:00
document . getElementById ( "text1" ) . value = "bla" ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#text1" ) . val ( ) , "bla" , "Check for modified value of input element" ) ;
2010-01-07 14:55:15 +00:00
2010-07-28 15:19:01 +00:00
QUnit . reset ( ) ;
2010-01-07 14:55:15 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#text1" ) . val ( ) , "Test" , "Check for value of input element" ) ;
2010-01-07 14:55:15 +00:00
// ticket #1714 this caused a JS error in IE
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#first" ) . val ( ) , "" , "Check a paragraph element to see if it has a value" ) ;
2010-01-07 14:55:15 +00:00
ok ( jQuery ( [ ] ) . val ( ) === undefined , "Check an empty jQuery object will return undefined from val" ) ;
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#select2" ) . val ( ) , "3" , "Call val() on a single='single' select" ) ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
deepEqual ( jQuery ( "#select3" ) . val ( ) , [ "1" , "2" ] , "Call val() on a multiple='multiple' select" ) ;
2010-01-07 14:55:15 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#option3c" ) . val ( ) , "2" , "Call val() on a option element with value" ) ;
2010-01-07 14:55:15 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#option3a" ) . val ( ) , "" , "Call val() on a option element with empty value" ) ;
2010-01-07 14:55:15 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#option3e" ) . val ( ) , "no value" , "Call val() on a option element with no value attribute" ) ;
2010-01-07 14:55:15 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#option3a" ) . val ( ) , "" , "Call val() on a option element with no value attribute" ) ;
2010-01-07 14:55:15 +00:00
2011-04-11 20:33:29 +00:00
jQuery ( "#select3" ) . val ( "" ) ;
2012-10-16 16:29:21 +00:00
deepEqual ( jQuery ( "#select3" ) . val ( ) , [ "" ] , "Call val() on a multiple='multiple' select" ) ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
deepEqual ( jQuery ( "#select4" ) . val ( ) , [ ] , "Call val() on multiple='multiple' select with all disabled options" ) ;
2010-09-24 21:26:22 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#select4 optgroup" ) . add ( "#select4 > [disabled]" ) . attr ( "disabled" , false ) ;
deepEqual ( jQuery ( "#select4" ) . val ( ) , [ "2" , "3" ] , "Call val() on multiple='multiple' select with some disabled options" ) ;
2010-09-24 21:26:22 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#select4" ) . attr ( "disabled" , true ) ;
deepEqual ( jQuery ( "#select4" ) . val ( ) , [ "2" , "3" ] , "Call val() on disabled multiple='multiple' select" ) ;
2010-09-24 21:26:22 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#select5" ) . val ( ) , "3" , "Check value on ambiguous select." ) ;
2010-09-28 15:36:28 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#select5" ) . val ( 1 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#select5" ) . val ( ) , "1" , "Check value on ambiguous select." ) ;
2010-09-28 15:36:28 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#select5" ) . val ( 3 ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#select5" ) . val ( ) , "3" , "Check value on ambiguous select." ) ;
2010-09-28 15:36:28 +00:00
2012-09-21 15:53:03 +00:00
strictEqual (
jQuery ( "<select name='select12584' id='select12584'><option value='1' disabled='disabled'>1</option></select>" ) . val ( ) ,
null ,
"Select-one with only option disabled (#12584)"
) ;
2012-06-11 11:59:34 +00:00
if ( jQuery . fn . serialize ) {
var 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
2012-06-11 11:59:34 +00:00
deepEqual ( checks . serialize ( ) , "" , "Get unchecked values." ) ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
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
2012-06-11 11:59:34 +00:00
checks . val ( [ "2" ] ) ;
deepEqual ( checks . serialize ( ) , "test=2" , "Get a single checked value." ) ;
2010-01-07 14:55:15 +00:00
2012-06-11 11:59:34 +00:00
checks . val ( [ "1" , "" ] ) ;
deepEqual ( checks . serialize ( ) , "test=1&test=" , "Get multiple checked values." ) ;
2010-01-07 14:55:15 +00:00
2012-06-11 11:59:34 +00:00
checks . val ( [ "" , "2" ] ) ;
deepEqual ( checks . serialize ( ) , "test=2&test=" , "Get multiple checked values." ) ;
2010-01-07 14:55:15 +00:00
2012-06-11 11:59:34 +00:00
checks . val ( [ "1" , "on" ] ) ;
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
var $button = jQuery ( "<button value='foobar'>text</button>" ) . insertAfter ( "#button" ) ;
2011-11-06 20:27:42 +00:00
equal ( $button . val ( ) , "foobar" , "Value retrieval on a button does not return innerHTML" ) ;
equal ( $button . val ( "baz" ) . html ( ) , "text" , "Setting the value does not change innerHTML" ) ;
2011-08-05 14:02:33 +00:00
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "<option/>" ) . val ( "test" ) . attr ( "value" ) , "test" , "Setting value sets the value attribute" ) ;
2010-01-07 14:55:15 +00:00
} ) ;
2013-03-03 15:51:04 +00:00
test ( "val() with non-matching values on dropdown list" , function ( ) {
expect ( 3 ) ;
2013-03-13 23:23:36 +00:00
2013-03-03 15:51:04 +00:00
jQuery ( "#select5" ) . val ( "" ) ;
equal ( jQuery ( "#select5" ) . val ( ) , null , "Non-matching set on select-one" ) ;
2013-03-13 23:23:36 +00:00
2013-03-03 15:51:04 +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" ) ;
equal ( jQuery ( select6 ) . val ( ) , null , "Non-matching set (single value) on select-multiple" ) ;
2013-03-13 23:23:36 +00:00
2013-03-03 15:51:04 +00:00
jQuery ( select6 ) . val ( [ "nothing1" , "nothing2" ] ) ;
equal ( jQuery ( select6 ) . val ( ) , null , "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 ( ) ;
} ) ;
2011-08-05 14:02:33 +00:00
if ( "value" in document . createElement ( "meter" ) &&
2011-05-20 15:03:33 +00:00
"value" in document . createElement ( "progress" ) ) {
2012-10-16 16:29:21 +00:00
test ( "val() respects numbers without exception (Bug #9319)" , function ( ) {
2011-05-20 15:03:33 +00:00
2012-10-16 16:29:21 +00:00
expect ( 4 ) ;
2011-05-20 15:03:33 +00:00
var $meter = jQuery ( "<meter min='0' max='10' value='5.6'></meter>" ) ,
$progress = jQuery ( "<progress max='10' value='1.5'></progress>" ) ;
try {
equal ( typeof $meter . val ( ) , "number" , "meter, returns a number and does not throw exception" ) ;
2012-10-16 16:29:21 +00:00
equal ( $meter . val ( ) , $meter [ 0 ] . value , "meter, api matches host and does not throw exception" ) ;
2011-05-20 15:03:33 +00:00
equal ( typeof $progress . val ( ) , "number" , "progress, returns a number and does not throw exception" ) ;
2012-10-16 16:29:21 +00:00
equal ( $progress . val ( ) , $progress [ 0 ] . value , "progress, api matches host and does not throw exception" ) ;
2011-05-20 15:03:33 +00:00
2012-10-16 16:29:21 +00:00
} catch ( e ) { }
2011-05-20 15:03:33 +00:00
$meter . remove ( ) ;
$progress . remove ( ) ;
} ) ;
}
2012-10-16 16:29:21 +00:00
var testVal = function ( valueObj ) {
expect ( 8 ) ;
2010-01-07 14:55:15 +00:00
2011-04-12 23:32:18 +00:00
QUnit . reset ( ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . val ( valueObj ( "test" ) ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . value , "test" , "Check for modified (via val(String)) value of input element" ) ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . val ( valueObj ( undefined ) ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . value , "" , "Check for modified (via val(undefined)) value of input element" ) ;
2010-08-21 02:32:34 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . val ( valueObj ( 67 ) ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . value , "67" , "Check for modified (via val(Number)) value of input element" ) ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . val ( valueObj ( null ) ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . value , "" , "Check for modified (via val(null)) value of input element" ) ;
2010-08-21 02:32:34 +00:00
2011-04-12 23:32:18 +00:00
var $select1 = jQuery ( "#select1" ) ;
2012-10-16 16:29:21 +00:00
$select1 . val ( valueObj ( "3" ) ) ;
2011-11-06 20:27:42 +00:00
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 ) ) ;
2011-11-06 20:27:42 +00:00
equal ( $select1 . val ( ) , "2" , "Check for modified (via val(Number)) value of select element" ) ;
2010-01-07 14:55:15 +00:00
2011-04-12 23:32:18 +00:00
$select1 . append ( "<option value='4'>four</option>" ) ;
2012-10-16 16:29:21 +00:00
$select1 . val ( valueObj ( 4 ) ) ;
2011-11-06 20:27:42 +00:00
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
var j = jQuery ( "#nonnodes" ) . contents ( ) ;
2012-10-16 16:29:21 +00:00
j . val ( valueObj ( "asdf" ) ) ;
2011-11-06 20:27:42 +00:00
equal ( j . val ( ) , "asdf" , "Check node,textnode,comment with val()" ) ;
2010-01-07 14:55:15 +00:00
j . removeAttr ( "value" ) ;
2012-06-21 19:30:24 +00:00
} ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
test ( "val(String/Number)" , function ( ) {
testVal ( bareObj ) ;
2010-01-07 14:55:15 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "val(Function)" , function ( ) {
testVal ( functionReturningObj ) ;
2010-10-09 03:48:06 +00:00
} ) ;
test ( "val(Array of Numbers) (Bug #7123)" , function ( ) {
2012-10-16 16:29:21 +00:00
expect ( 4 ) ;
2011-04-11 20:33:29 +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' />" ) ;
var elements = jQuery ( "input[name=arrayTest]" ) . val ( [ 1 , 2 ] ) ;
2012-10-16 16:29:21 +00:00
ok ( elements [ 0 ] . checked , "First element was checked" ) ;
ok ( elements [ 1 ] . checked , "Second element was checked" ) ;
ok ( ! elements [ 2 ] . checked , "Third element was unchecked" ) ;
ok ( ! elements [ 3 ] . checked , "Fourth element remained unchecked" ) ;
2010-12-30 06:34:48 +00:00
2010-10-09 03:48:06 +00:00
elements . remove ( ) ;
} ) ;
2010-01-07 14:55:15 +00:00
2012-10-16 16:29:21 +00:00
test ( "val(Function) with incoming value" , function ( ) {
expect ( 10 ) ;
2010-01-07 16:15:40 +00:00
2011-04-22 01:33:09 +00:00
QUnit . reset ( ) ;
2010-01-07 16:15:40 +00:00
var oldVal = jQuery ( "#text1" ) . val ( ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . val ( function ( i , val ) {
2011-11-06 20:27:42 +00:00
equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . value , "test" , "Check for modified (via val(String)) value of input element" ) ;
2010-01-07 16:15:40 +00:00
oldVal = jQuery ( "#text1" ) . val ( ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#text1" ) . val ( function ( i , val ) {
2011-11-06 20:27:42 +00:00
equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return 67 ;
} ) ;
2011-11-06 20:27:42 +00:00
equal ( document . getElementById ( "text1" ) . value , "67" , "Check for modified (via val(Number)) value of input element" ) ;
2010-01-07 16:15:40 +00:00
oldVal = jQuery ( "#select1" ) . val ( ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#select1" ) . val ( function ( i , val ) {
2011-11-06 20:27:42 +00:00
equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "3" ;
} ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#select1" ) . val ( ) , "3" , "Check for modified (via val(String)) value of select element" ) ;
2010-01-07 16:15:40 +00:00
oldVal = jQuery ( "#select1" ) . val ( ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#select1" ) . val ( function ( i , val ) {
2011-11-06 20:27:42 +00:00
equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return 2 ;
} ) ;
2011-11-06 20:27:42 +00:00
equal ( jQuery ( "#select1" ) . val ( ) , "2" , "Check for modified (via val(Number)) value of select element" ) ;
2010-01-07 16:15:40 +00:00
jQuery ( "#select1" ) . append ( "<option value='4'>four</option>" ) ;
oldVal = jQuery ( "#select1" ) . val ( ) ;
2012-10-16 16:29:21 +00:00
jQuery ( "#select1" ) . val ( function ( i , val ) {
2011-11-06 20:27:42 +00:00
equal ( val , oldVal , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return 4 ;
} ) ;
2011-11-06 20:27:42 +00:00
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)
2012-10-16 16:29:21 +00:00
test ( "val(select) after form.reset() (Bug #2551)" , function ( ) {
expect ( 3 ) ;
2011-02-10 22:50:02 +00:00
2012-06-21 19:30:24 +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
2012-10-16 16:29:21 +00:00
jQuery ( "#kkk" ) . val ( "gf" ) ;
2011-02-10 22:50:02 +00:00
2012-07-05 19:52:13 +00:00
document [ "kk" ] . reset ( ) ;
2011-02-10 22:50:02 +00:00
2012-10-16 16:29:21 +00:00
equal ( jQuery ( "#kkk" ) [ 0 ] . value , "cf" , "Check value of select after form reset." ) ;
2011-02-10 22:50:02 +00:00
equal ( jQuery ( "#kkk" ) . val ( ) , "cf" , "Check value of select after form reset." ) ;
// re-verify the multi-select is not broken (after form.reset) by our fix for single-select
2012-10-16 16:29:21 +00:00
deepEqual ( jQuery ( "#select3" ) . val ( ) , [ "1" , "2" ] , "Call val() on a multiple='multiple' select" ) ;
2011-02-10 22:50:02 +00:00
jQuery ( "#kk" ) . remove ( ) ;
2011-08-05 14:02:33 +00:00
} ) ;
2011-02-10 22:50:02 +00:00
2012-10-16 16:29:21 +00:00
var testAddClass = function ( valueObj ) {
expect ( 9 ) ;
2011-06-19 22:58:47 +00:00
2012-12-11 00:07:07 +00:00
var div = jQuery ( "#qunit-fixture div" ) ;
2009-12-10 04:57:19 +00:00
div . addClass ( valueObj ( "test" ) ) ;
2009-03-18 21:15:38 +00:00
var pass = true ;
for ( var i = 0 ; i < div . size ( ) ; i ++ ) {
2012-10-16 16:29:21 +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
}
ok ( pass , "Add Class" ) ;
// using contents will get regular, text, and comment nodes
var j = jQuery ( "#nonnodes" ) . contents ( ) ;
2009-12-10 04:57:19 +00:00
j . addClass ( valueObj ( "asdf" ) ) ;
2009-03-18 21:15:38 +00:00
ok ( j . hasClass ( "asdf" ) , "Check node,textnode,comment for addClass" ) ;
2010-02-13 07:18:38 +00:00
div = jQuery ( "<div/>" ) ;
div . addClass ( valueObj ( "test" ) ) ;
2011-11-06 20:27:42 +00:00
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" ) ;
2010-02-13 07:18:38 +00:00
div . addClass ( valueObj ( "test" ) ) ;
2011-11-06 20:27:42 +00:00
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" ) ;
2010-02-13 19:30:27 +00:00
div . addClass ( valueObj ( "bar baz" ) ) ;
2011-11-06 20:27:42 +00:00
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 ( ) ;
2011-10-06 21:17:51 +00:00
div . addClass ( valueObj ( "foo" ) ) . addClass ( valueObj ( "foo" ) ) ;
2011-06-08 00:54:11 +00:00
equal ( div . attr ( "class" ) , "foo" , "Do not add the same class twice in separate calls." ) ;
2011-06-19 22:58:47 +00:00
div . addClass ( valueObj ( "fo" ) ) ;
equal ( div . attr ( "class" ) , "foo fo" , "Adding a similar class does not get interrupted." ) ;
div . removeClass ( ) . addClass ( "wrap2" ) ;
ok ( div . addClass ( "wrap" ) . hasClass ( "wrap" ) , "Can add similarly named classes" ) ;
div . removeClass ( ) ;
2011-06-08 00:54:11 +00:00
div . addClass ( valueObj ( "bar bar" ) ) ;
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
2012-10-16 16:29:21 +00:00
test ( "addClass(String)" , function ( ) {
testAddClass ( bareObj ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "addClass(Function)" , function ( ) {
testAddClass ( functionReturningObj ) ;
2009-12-10 04:57:19 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "addClass(Function) with incoming value" , function ( ) {
2012-12-11 00:07:07 +00:00
expect ( 52 ) ;
var div = jQuery ( "#qunit-fixture div" ) ,
2012-10-16 16:29:21 +00:00
old = div . map ( function ( ) {
return jQuery ( this ) . attr ( "class" ) || "" ;
} ) ;
2011-08-05 14:02:33 +00:00
2012-10-16 16:29:21 +00:00
div . addClass ( function ( i , val ) {
if ( this . id !== "_firebugConsole" ) {
equal ( val , old [ i ] , "Make sure the incoming value is correct." ) ;
2010-03-23 16:12:16 +00:00
return "test" ;
}
2010-01-07 16:15:40 +00:00
} ) ;
var pass = true ;
2011-03-08 17:07:05 +00:00
for ( var i = 0 ; i < div . length ; i ++ ) {
2012-06-21 19:30:24 +00:00
if ( div . get ( i ) . className . indexOf ( "test" ) == - 1 ) {
pass = false ;
}
2010-01-07 16:15:40 +00:00
}
ok ( pass , "Add Class" ) ;
} ) ;
2009-12-10 04:57:19 +00:00
var testRemoveClass = function ( valueObj ) {
2012-11-27 14:46:06 +00:00
expect ( 8 ) ;
2009-05-02 21:14:38 +00:00
2012-12-11 00:07:07 +00:00
var $set = jQuery ( "#qunit-fixture div" ) ,
2012-11-27 14:46:06 +00:00
div = document . createElement ( "div" ) ;
2009-03-18 21:15:38 +00:00
2012-11-27 14:46:06 +00:00
$set . addClass ( "test" ) . removeClass ( valueObj ( "test" ) ) ;
2009-03-18 21:15:38 +00:00
2012-11-27 14:46:06 +00:00
ok ( ! $set . is ( ".test" ) , "Remove Class" ) ;
2009-05-02 21:14:38 +00:00
2012-11-27 14:46:06 +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
2012-11-27 14:46:06 +00:00
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
2012-11-27 14:46:06 +00:00
$set . eq ( 0 ) . addClass ( "expected" ) . removeClass ( valueObj ( null ) ) ;
ok ( $set . eq ( 0 ) . is ( ".expected" ) , "Null value passed to removeClass" ) ;
2009-05-02 21:14:38 +00:00
2012-11-27 14:46:06 +00:00
$set . eq ( 0 ) . addClass ( "expected" ) . removeClass ( valueObj ( "" ) ) ;
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
2012-11-27 14:46:06 +00:00
$set = jQuery ( "#nonnodes" ) . contents ( ) ;
$set . removeClass ( valueObj ( "asdf" ) ) ;
ok ( ! $set . hasClass ( "asdf" ) , "Check node,textnode,comment for removeClass" ) ;
jQuery ( div ) . removeClass ( valueObj ( "foo" ) ) ;
strictEqual ( jQuery ( div ) . attr ( "class" ) , undefined , "removeClass doesn't create a class attribute" ) ;
2010-02-02 02:33:58 +00:00
div . className = " test foo " ;
2012-10-16 16:29:21 +00:00
jQuery ( div ) . removeClass ( valueObj ( "foo" ) ) ;
2011-11-06 20:27:42 +00:00
equal ( div . className , "test" , "Make sure remaining className is trimmed." ) ;
2010-02-02 02:33:58 +00:00
div . className = " test " ;
2012-10-16 16:29:21 +00:00
jQuery ( div ) . removeClass ( valueObj ( "test" ) ) ;
2011-11-06 20:27:42 +00:00
equal ( div . className , "" , "Make sure there is nothing left after everything is removed." ) ;
2009-12-10 04:57:19 +00:00
} ;
2012-10-16 16:29:21 +00:00
test ( "removeClass(String) - simple" , function ( ) {
testRemoveClass ( bareObj ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "removeClass(Function) - simple" , function ( ) {
testRemoveClass ( functionReturningObj ) ;
2009-12-10 04:57:19 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "removeClass(Function) with incoming value" , function ( ) {
2012-12-11 00:07:07 +00:00
expect ( 52 ) ;
2010-01-07 16:15:40 +00:00
2012-12-11 00:07:07 +00:00
var $divs = jQuery ( "#qunit-fixture div" ) . addClass ( "test" ) , old = $divs . map ( function ( ) {
2012-10-16 16:29:21 +00:00
return jQuery ( this ) . attr ( "class" ) ;
2010-01-07 16:15:40 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
$divs . removeClass ( function ( i , val ) {
2010-03-23 16:12:16 +00:00
if ( this . id !== "_firebugConsole" ) {
2012-10-16 16:29:21 +00:00
equal ( val , old [ i ] , "Make sure the incoming value is correct." ) ;
2010-03-23 16:12:16 +00:00
return "test" ;
}
2010-01-07 16:15:40 +00:00
} ) ;
2011-04-11 20:33:29 +00:00
ok ( ! $divs . is ( ".test" ) , "Remove Class" ) ;
2010-01-07 16:15:40 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "removeClass() removes duplicates" , function ( ) {
expect ( 1 ) ;
2012-06-23 23:38:27 +00:00
var $div = jQuery ( jQuery . parseHTML ( "<div class='x x x'></div>" ) ) ;
$div . removeClass ( "x" ) ;
ok ( ! $div . hasClass ( "x" ) , "Element with multiple same classes does not escape the wrath of removeClass()" ) ;
} ) ;
2012-08-28 13:26:06 +00:00
test ( "removeClass(undefined) is a no-op" , function ( ) {
expect ( 1 ) ;
var $div = jQuery ( "<div class='base second'></div>" ) ;
$div . removeClass ( undefined ) ;
ok ( $div . hasClass ( "base" ) && $div . hasClass ( "second" ) , "Element still has classes after removeClass(undefined)" ) ;
} ) ;
2009-12-10 04:57:19 +00:00
var testToggleClass = function ( valueObj ) {
2012-10-16 16:29:21 +00:00
expect ( 17 ) ;
2009-05-02 21:14:38 +00:00
2009-03-18 21:15:38 +00:00
var e = jQuery ( "#firstp" ) ;
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2009-12-10 04:57:19 +00:00
e . toggleClass ( valueObj ( "test" ) ) ;
2009-03-18 21:15:38 +00:00
ok ( e . is ( ".test" ) , "Assert class present" ) ;
2009-12-10 04:57:19 +00:00
e . toggleClass ( valueObj ( "test" ) ) ;
2009-03-18 21:15:38 +00:00
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2009-05-02 21:14:38 +00:00
// class name with a boolean
2009-12-10 04:57:19 +00:00
e . toggleClass ( valueObj ( "test" ) , false ) ;
2009-03-18 21:15:38 +00:00
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2009-12-10 04:57:19 +00:00
e . toggleClass ( valueObj ( "test" ) , true ) ;
2009-03-18 21:15:38 +00:00
ok ( e . is ( ".test" ) , "Assert class present" ) ;
2009-12-10 04:57:19 +00:00
e . toggleClass ( valueObj ( "test" ) , false ) ;
2009-03-18 21:15:38 +00:00
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2009-05-02 21:14:38 +00:00
// multiple class names
e . addClass ( "testA testB" ) ;
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
ok ( e . is ( ".testA.testB" ) , "Assert 2 different classes present" ) ;
2009-12-10 04:57:19 +00:00
e . toggleClass ( valueObj ( "testB testC" ) ) ;
2009-05-02 21:14:38 +00:00
ok ( ( e . is ( ".testA.testC" ) && ! e . is ( ".testB" ) ) , "Assert 1 class added, 1 class removed, and 1 class kept" ) ;
2009-12-10 04:57:19 +00:00
e . toggleClass ( valueObj ( "testA testC" ) ) ;
2009-05-02 21:14:38 +00:00
ok ( ( ! e . is ( ".testA" ) && ! e . is ( ".testB" ) && ! e . is ( ".testC" ) ) , "Assert no class present" ) ;
// toggleClass storage
2012-10-16 16:29:21 +00:00
e . toggleClass ( true ) ;
ok ( e [ 0 ] . className === "" , "Assert class is empty (data was empty)" ) ;
2009-05-02 22:35:39 +00:00
e . addClass ( "testD testE" ) ;
ok ( e . is ( ".testD.testE" ) , "Assert class present" ) ;
2009-05-02 21:14:38 +00:00
e . toggleClass ( ) ;
2009-05-02 22:35:39 +00:00
ok ( ! e . is ( ".testD.testE" ) , "Assert class not present" ) ;
2012-10-16 16:29:21 +00:00
ok ( jQuery . _data ( e [ 0 ] , "__className__" ) === "testD testE" , "Assert data was stored" ) ;
2009-05-02 21:14:38 +00:00
e . toggleClass ( ) ;
2009-05-02 22:35:39 +00:00
ok ( e . is ( ".testD.testE" ) , "Assert class present (restored from data)" ) ;
2012-10-16 16:29:21 +00:00
e . toggleClass ( false ) ;
2009-05-02 22:35:39 +00:00
ok ( ! e . is ( ".testD.testE" ) , "Assert class not present" ) ;
2012-10-16 16:29:21 +00:00
e . toggleClass ( true ) ;
2009-05-02 22:35:39 +00:00
ok ( e . is ( ".testD.testE" ) , "Assert class present (restored from data)" ) ;
e . toggleClass ( ) ;
2012-10-16 16:29:21 +00:00
e . toggleClass ( false ) ;
2009-05-02 22:35:39 +00:00
e . toggleClass ( ) ;
ok ( e . is ( ".testD.testE" ) , "Assert class present (restored from data)" ) ;
2009-07-11 13:57:38 +00:00
2009-05-02 21:14:38 +00:00
// Cleanup
e . removeClass ( "testD" ) ;
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
QUnit . expectJqData ( e [ 0 ] , "__className__" ) ;
2009-12-10 04:57:19 +00:00
} ;
2012-10-16 16:29:21 +00:00
test ( "toggleClass(String|boolean|undefined[, boolean])" , function ( ) {
testToggleClass ( bareObj ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "toggleClass(Function[, boolean])" , function ( ) {
testToggleClass ( functionReturningObj ) ;
2009-12-10 04:57:19 +00:00
} ) ;
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
test ( "toggleClass(Function[, boolean]) with incoming value" , function ( ) {
2012-10-16 16:29:21 +00:00
expect ( 14 ) ;
2009-12-10 04:57:19 +00:00
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
var e = jQuery ( "#firstp" ) ,
old = e . attr ( "class" ) || "" ;
2010-01-07 16:15:40 +00:00
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2010-12-30 06:34:48 +00:00
2012-10-16 16:29:21 +00:00
e . toggleClass ( function ( i , val ) {
2011-08-04 20:34:59 +00:00
equal ( old , val , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} ) ;
ok ( e . is ( ".test" ) , "Assert class present" ) ;
2010-12-30 06:34:48 +00:00
2010-01-07 16:15:40 +00:00
old = e . attr ( "class" ) ;
2010-12-30 06:34:48 +00:00
2012-10-16 16:29:21 +00:00
e . toggleClass ( function ( i , val ) {
2011-08-04 20:34:59 +00:00
equal ( old , val , "Make sure the incoming value is correct." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} ) ;
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2010-12-30 06:34:48 +00:00
2011-08-04 20:34:59 +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
2012-10-16 16:29:21 +00:00
e . toggleClass ( function ( i , val , state ) {
2011-08-04 20:34:59 +00:00
equal ( old , val , "Make sure the incoming value is correct." ) ;
equal ( state , false , "Make sure that the state is passed in." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} , false ) ;
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2010-12-30 06:34:48 +00:00
2011-08-04 20:34:59 +00:00
old = e . attr ( "class" ) || "" ;
2010-12-30 06:34:48 +00:00
2012-10-16 16:29:21 +00:00
e . toggleClass ( function ( i , val , state ) {
2011-08-04 20:34:59 +00:00
equal ( old , val , "Make sure the incoming value is correct." ) ;
equal ( state , true , "Make sure that the state is passed in." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} , true ) ;
ok ( e . is ( ".test" ) , "Assert class present" ) ;
2010-12-30 06:34:48 +00:00
2010-01-07 16:15:40 +00:00
old = e . attr ( "class" ) ;
2010-12-30 06:34:48 +00:00
2012-10-16 16:29:21 +00:00
e . toggleClass ( function ( i , val , state ) {
2011-08-04 20:34:59 +00:00
equal ( old , val , "Make sure the incoming value is correct." ) ;
equal ( state , false , "Make sure that the state is passed in." ) ;
2010-01-07 16:15:40 +00:00
return "test" ;
} , false ) ;
ok ( ! e . is ( ".test" ) , "Assert class not present" ) ;
2009-03-18 21:15:38 +00:00
} ) ;
2012-10-16 16:29:21 +00:00
test ( "addClass, removeClass, hasClass" , function ( ) {
expect ( 17 ) ;
2010-12-30 06:34:48 +00:00
2012-10-16 16:29:21 +00:00
var jq = jQuery ( "<p>Hi</p>" ) , x = jq [ 0 ] ;
2010-12-30 06:34:48 +00:00
2009-09-08 01:07:50 +00:00
jq . addClass ( "hi" ) ;
2011-11-06 20:27:42 +00:00
equal ( x . className , "hi" , "Check single added class" ) ;
2010-12-30 06:34:48 +00:00
2009-09-08 01:07:50 +00:00
jq . addClass ( "foo bar" ) ;
2011-11-06 20:27:42 +00:00
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 ( ) ;
2011-11-06 20:27:42 +00:00
equal ( x . className , "" , "Remove all classes" ) ;
2010-12-30 06:34:48 +00:00
2009-09-08 01:07:50 +00:00
jq . addClass ( "hi foo bar" ) ;
jq . removeClass ( "foo" ) ;
2011-11-06 20:27:42 +00:00
equal ( x . className , "hi bar" , "Check removal of one class" ) ;
2010-12-30 06:34:48 +00:00
2009-09-08 01:07:50 +00:00
ok ( jq . hasClass ( "hi" ) , "Check has1" ) ;
ok ( jq . hasClass ( "bar" ) , "Check has2" ) ;
2010-12-30 06:34:48 +00:00
2012-06-21 19:30:24 +00:00
jq = jQuery ( "<p class='class1\nclass2\tcla.ss3\n\rclass4'></p>" ) ;
2010-12-01 20:31:22 +00:00
ok ( jq . hasClass ( "class1" ) , "Check hasClass with line feed" ) ;
ok ( jq . is ( ".class1" ) , "Check is with line feed" ) ;
2009-12-14 21:24:28 +00:00
ok ( jq . hasClass ( "class2" ) , "Check hasClass with tab" ) ;
ok ( jq . is ( ".class2" ) , "Check is with tab" ) ;
ok ( jq . hasClass ( "cla.ss3" ) , "Check hasClass with dot" ) ;
2010-12-01 20:31:22 +00:00
ok ( jq . hasClass ( "class4" ) , "Check hasClass with carriage return" ) ;
ok ( jq . is ( ".class4" ) , "Check is with carriage return" ) ;
2010-12-30 06:34:48 +00:00
2009-12-14 21:24:28 +00:00
jq . removeClass ( "class2" ) ;
2012-10-16 16:29:21 +00:00
ok ( jq . hasClass ( "class2" ) === false , "Check the class has been properly removed" ) ;
2009-12-14 21:24:28 +00:00
jq . removeClass ( "cla" ) ;
ok ( jq . hasClass ( "cla.ss3" ) , "Check the dotted class has not been removed" ) ;
jq . removeClass ( "cla.ss3" ) ;
2012-10-16 16:29:21 +00:00
ok ( jq . hasClass ( "cla.ss3" ) === false , "Check the dotted class has been removed" ) ;
2010-12-01 20:31:22 +00:00
jq . removeClass ( "class4" ) ;
2012-10-16 16:29:21 +00:00
ok ( jq . hasClass ( "class4" ) === false , "Check the class has been properly removed" ) ;
2011-05-04 01:44:42 +00:00
} ) ;
2011-06-21 18:04:06 +00:00
2012-10-16 16:29:21 +00:00
test ( "contents().hasClass() returns correct values" , function ( ) {
expect ( 2 ) ;
2011-06-21 18:04:06 +00:00
2011-08-05 14:02:33 +00:00
var $div = jQuery ( "<div><span class='foo'></span><!-- comment -->text</div>" ) ,
2011-06-21 18:04:06 +00:00
$contents = $div . contents ( ) ;
ok ( $contents . hasClass ( "foo" ) , "Found 'foo' in $contents" ) ;
2011-06-22 12:50:44 +00:00
ok ( ! $contents . hasClass ( "undefined" ) , "Did not find 'undefined' in $contents (correctly)" ) ;
2011-06-21 18:04:06 +00:00
} ) ;
2012-02-25 20:05:15 +00:00
2012-10-16 16:29:21 +00:00
test ( "coords returns correct values in IE6/IE7, see #10828" , function ( ) {
2012-11-28 02:32:59 +00:00
expect ( 1 ) ;
2012-02-25 20:05:15 +00:00
2012-10-16 16:29:21 +00:00
var area ,
map = jQuery ( "<map />" ) ;
2012-02-25 20:05:15 +00:00
area = map . html ( "<area shape='rect' coords='0,0,0,0' href='#' alt='a' />" ) . find ( "area" ) ;
2012-10-16 16:29:21 +00:00
equal ( area . attr ( "coords" ) , "0,0,0,0" , "did not retrieve coords correctly" ) ;
2012-02-25 20:05:15 +00:00
} ) ;