Merge branch 'setterargs'

This commit is contained in:
jeresig 2010-01-07 14:26:06 -05:00
commit d6d5ed4c68
8 changed files with 654 additions and 264 deletions

View file

@ -12,10 +12,20 @@ jQuery.fn.extend({
return access( this, name, value, true, jQuery.attr );
},
removeAttr: function( name, fn ) {
return this.each(function(){
jQuery.attr( this, name, "" );
if ( this.nodeType === 1 ) {
this.removeAttribute( name );
}
});
},
addClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function() {
jQuery(this).addClass( value.call(this) );
return this.each(function(i) {
var self = jQuery(this);
self.addClass( value.call(this, i, self.attr("class")) );
});
}
@ -46,8 +56,9 @@ jQuery.fn.extend({
removeClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function() {
jQuery(this).removeClass( value.call(this) );
return this.each(function(i) {
var self = jQuery(this);
self.removeClass( value.call(this, i, self.attr("class")) );
});
}
@ -75,6 +86,41 @@ jQuery.fn.extend({
return this;
},
toggleClass: function( value, stateVal ) {
var type = typeof value, isBool = typeof stateVal === "boolean";
if ( jQuery.isFunction( value ) ) {
return this.each(function(i) {
var self = jQuery(this);
self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
});
}
return this.each(function() {
if ( type === "string" ) {
// toggle individual class names
var className, i = 0, self = jQuery(this),
state = stateVal,
classNames = value.split( rspace );
while ( (className = classNames[ i++ ]) ) {
// check each className given, space seperated list
state = isBool ? state : !self.hasClass( className );
self[ state ? "addClass" : "removeClass" ]( className );
}
} else if ( type === "undefined" || type === "boolean" ) {
if ( this.className ) {
// store className if set
jQuery.data( this, "__className__", this.className );
}
// toggle whole className
this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
}
});
},
hasClass: function( selector ) {
var className = " " + selector + " ";
for ( var i = 0, l = this.length; i < l; i++ ) {
@ -142,30 +188,27 @@ jQuery.fn.extend({
return undefined;
}
// Typecast once if the value is a number
if ( typeof value === "number" ) {
value += "";
}
var isFunction = jQuery.isFunction(value);
var val = value;
return this.each(function() {
if ( jQuery.isFunction(value) ) {
val = value.call(this);
// Typecast each time if the value is a Function and the appended
// value is therefore different each time.
if ( typeof val === "number" ) {
val += "";
}
}
return this.each(function(i) {
var self = jQuery(this), val = value;
if ( this.nodeType !== 1 ) {
return;
}
if ( isFunction ) {
val = value.call(this, i, self.val());
}
// Typecast each time if the value is a Function and the appended
// value is therefore different each time.
if ( typeof val === "number" ) {
val += "";
}
if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
this.checked = jQuery.inArray( jQuery(this).val(), val ) >= 0;
this.checked = jQuery.inArray( self.val(), val ) >= 0;
} else if ( jQuery.nodeName( this, "select" ) ) {
var values = jQuery.makeArray(val);
@ -185,50 +228,6 @@ jQuery.fn.extend({
}
});
jQuery.each({
removeAttr: function( name ) {
jQuery.attr( this, name, "" );
if ( this.nodeType === 1 ) {
this.removeAttribute( name );
}
},
toggleClass: function( classNames, state ) {
var type = typeof classNames;
if ( type === "string" ) {
// toggle individual class names
var isBool = typeof state === "boolean", className, i = 0,
classNames = classNames.split( rspace );
while ( (className = classNames[ i++ ]) ) {
// check each className given, space seperated list
state = isBool ? state : !jQuery(this).hasClass( className );
jQuery(this)[ state ? "addClass" : "removeClass" ]( className );
}
} else if ( type === "undefined" || type === "boolean" ) {
if ( this.className ) {
// store className if set
jQuery.data( this, "__className__", this.className );
}
// toggle whole className
this.className = this.className || classNames === false ? "" : jQuery.data( this, "__className__" ) || "";
}
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( val, state ) {
if ( jQuery.isFunction( val ) ) {
return this.each(function() {
jQuery(this)[ name ]( val.call(this), state );
});
}
return this.each( fn, arguments );
};
});
jQuery.extend({
attrFn: {
val: true,

View file

@ -775,7 +775,7 @@ function access( elems, key, value, exec, fn, pass ) {
exec = exec && jQuery.isFunction(value);
for ( var i = 0; i < length; i++ ) {
fn( elems[i], key, exec ? value.call( elems[i], i ) : value, pass );
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
}
return elems;

View file

@ -33,8 +33,9 @@ if ( !jQuery.support.htmlSerialize ) {
jQuery.fn.extend({
text: function( text ) {
if ( jQuery.isFunction(text) ) {
return this.each(function() {
return jQuery(this).text( text.call(this) );
return this.each(function(i) {
var self = jQuery(this);
return self.text( text.call(this, i, self.text()) );
});
}
@ -47,8 +48,8 @@ jQuery.fn.extend({
wrapAll: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each(function() {
jQuery(this).wrapAll( html.apply(this, arguments) );
return this.each(function(i) {
jQuery(this).wrapAll( html.call(this, i) );
});
}
@ -172,7 +173,7 @@ jQuery.fn.extend({
html: function( value ) {
if ( value === undefined ) {
return this[0] ?
return this[0] && this[0].nodeType === 1 ?
this[0].innerHTML.replace(rinlinejQuery, "") :
null;
@ -195,6 +196,14 @@ jQuery.fn.extend({
this.empty().append( value );
}
} else if ( jQuery.isFunction( value ) ) {
this.each(function(i){
var self = jQuery(this), old = self.html();
self.empty().append(function(){
return value.call( this, i, old );
});
});
} else {
this.empty().append( value );
}
@ -228,9 +237,10 @@ jQuery.fn.extend({
var results, first, value = args[0], scripts = [];
if ( jQuery.isFunction(value) ) {
return this.each(function() {
args[0] = value.call(this);
return jQuery(this).domManip( args, table, callback );
return this.each(function(i) {
var self = jQuery(this);
args[0] = value.call(this, i, table ? self.html() : undefined);
return self.domManip( args, table, callback );
});
}

View file

@ -7,8 +7,8 @@ if ( "getBoundingClientRect" in document.documentElement ) {
}
if ( options ) {
return this.each(function() {
jQuery.offset.setOffset( this, options );
return this.each(function( i ) {
jQuery.offset.setOffset( this, options, i );
});
}
@ -33,8 +33,8 @@ if ( "getBoundingClientRect" in document.documentElement ) {
}
if ( options ) {
return this.each(function() {
jQuery.offset.setOffset( this, options );
return this.each(function( i ) {
jQuery.offset.setOffset( this, options, i );
});
}
@ -137,7 +137,7 @@ jQuery.offset = {
return { top: top, left: left };
},
setOffset: function( elem, options ) {
setOffset: function( elem, options, i ) {
// set position first, in-case top/left are set even on static elem
if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
elem.style.position = "relative";
@ -145,11 +145,16 @@ jQuery.offset = {
var curElem = jQuery( elem ),
curOffset = curElem.offset(),
curTop = parseInt( jQuery.curCSS( elem, "top", true ), 10 ) || 0,
curLeft = parseInt( jQuery.curCSS( elem, "left", true ), 10) || 0,
props = {
top: (options.top - curOffset.top) + curTop,
left: (options.left - curOffset.left) + curLeft
};
curLeft = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
if ( jQuery.isFunction( options ) ) {
options = options.call( elem, i, curOffset );
}
var props = {
top: (options.top - curOffset.top) + curTop,
left: (options.left - curOffset.left) + curLeft
};
if ( "using" in options ) {
options.using.call( elem, props );

View file

@ -292,6 +292,148 @@ test("attr('tabindex', value)", function() {
equals(element.attr('tabindex'), -1, 'set negative tabindex');
});
test("removeAttr(String)", function() {
expect(1);
equals( jQuery('#mark').removeAttr( "class" )[0].className, "", "remove class" );
});
test("val()", function() {
expect(17);
document.getElementById('text1').value = "bla";
equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" );
reset();
equals( jQuery("#text1").val(), "Test", "Check for value of input element" );
// ticket #1714 this caused a JS error in IE
equals( jQuery("#first").val(), "", "Check a paragraph element to see if it has a value" );
ok( jQuery([]).val() === undefined, "Check an empty jQuery object will return undefined from val" );
equals( jQuery('#select2').val(), '3', 'Call val() on a single="single" select' );
same( jQuery('#select3').val(), ['1', '2'], 'Call val() on a multiple="multiple" select' );
equals( jQuery('#option3c').val(), '2', 'Call val() on a option element with value' );
equals( jQuery('#option3a').val(), '', 'Call val() on a option element with empty value' );
equals( jQuery('#option3e').val(), 'no value', 'Call val() on a option element with no value attribute' );
equals( jQuery('#option3a').val(), '', 'Call val() on a option element with no value attribute' );
jQuery('#select3').val("");
same( jQuery('#select3').val(), [''], 'Call val() on a multiple="multiple" select' );
var checks = jQuery("<input type='checkbox' name='test' value='1'/>").appendTo("#form")
.add( jQuery("<input type='checkbox' name='test' value='2'/>").appendTo("#form") )
.add( jQuery("<input type='checkbox' name='test' value=''/>").appendTo("#form") )
.add( jQuery("<input type='checkbox' name='test'/>").appendTo("#form") );
same( checks.serialize(), "", "Get unchecked values." );
equals( checks.eq(3).val(), "on", "Make sure a value of 'on' is provided if none is specified." );
checks.val([ "2" ]);
same( checks.serialize(), "test=2", "Get a single checked value." );
checks.val([ "1", "" ]);
same( checks.serialize(), "test=1&test=", "Get multiple checked values." );
checks.val([ "", "2" ]);
same( checks.serialize(), "test=2&test=", "Get multiple checked values." );
checks.val([ "1", "on" ]);
same( checks.serialize(), "test=1&test=on", "Get multiple checked values." );
checks.remove();
});
var testVal = function(valueObj) {
expect(6);
jQuery("#text1").val(valueObj( 'test' ));
equals( document.getElementById('text1').value, "test", "Check for modified (via val(String)) value of input element" );
jQuery("#text1").val(valueObj( 67 ));
equals( document.getElementById('text1').value, "67", "Check for modified (via val(Number)) value of input element" );
jQuery("#select1").val(valueObj( "3" ));
equals( jQuery("#select1").val(), "3", "Check for modified (via val(String)) value of select element" );
jQuery("#select1").val(valueObj( 2 ));
equals( jQuery("#select1").val(), "2", "Check for modified (via val(Number)) value of select element" );
jQuery("#select1").append("<option value='4'>four</option>");
jQuery("#select1").val(valueObj( 4 ));
equals( jQuery("#select1").val(), "4", "Should be possible to set the val() to a newly created option" );
// using contents will get comments regular, text, and comment nodes
var j = jQuery("#nonnodes").contents();
j.val(valueObj( "asdf" ));
equals( j.val(), "asdf", "Check node,textnode,comment with val()" );
j.removeAttr("value");
}
test("val(String/Number)", function() {
testVal(bareObj);
});
test("val(Function)", function() {
testVal(functionReturningObj);
})
test("val(Function) with incoming value", function() {
expect(10);
var oldVal = jQuery("#text1").val();
jQuery("#text1").val(function(i, val) {
equals( val, oldVal, "Make sure the incoming value is correct." );
return "test";
});
equals( document.getElementById('text1').value, "test", "Check for modified (via val(String)) value of input element" );
oldVal = jQuery("#text1").val();
jQuery("#text1").val(function(i, val) {
equals( val, oldVal, "Make sure the incoming value is correct." );
return 67;
});
equals( document.getElementById('text1').value, "67", "Check for modified (via val(Number)) value of input element" );
oldVal = jQuery("#select1").val();
jQuery("#select1").val(function(i, val) {
equals( val, oldVal, "Make sure the incoming value is correct." );
return "3";
});
equals( jQuery("#select1").val(), "3", "Check for modified (via val(String)) value of select element" );
oldVal = jQuery("#select1").val();
jQuery("#select1").val(function(i, val) {
equals( val, oldVal, "Make sure the incoming value is correct." );
return 2;
});
equals( jQuery("#select1").val(), "2", "Check for modified (via val(Number)) value of select element" );
jQuery("#select1").append("<option value='4'>four</option>");
oldVal = jQuery("#select1").val();
jQuery("#select1").val(function(i, val) {
equals( val, oldVal, "Make sure the incoming value is correct." );
return 4;
});
equals( jQuery("#select1").val(), "4", "Should be possible to set the val() to a newly created option" );
});
var testAddClass = function(valueObj) {
expect(2);
var div = jQuery("div");
@ -316,6 +458,25 @@ test("addClass(Function)", function() {
testAddClass(functionReturningObj);
});
test("addClass(Function) with incoming value", function() {
expect(39);
var div = jQuery("div"), old = div.map(function(){
return jQuery(this).attr("class");
});
div.addClass(function(i, val) {
equals( val, old[i], "Make sure the incoming value is correct." );
return "test";
});
var pass = true;
for ( var i = 0; i < div.size(); i++ ) {
if ( div.get(i).className.indexOf("test") == -1 ) pass = false;
}
ok( pass, "Add Class" );
});
var testRemoveClass = function(valueObj) {
expect(5);
@ -357,6 +518,23 @@ test("removeClass(Function) - simple", function() {
testRemoveClass(functionReturningObj);
});
test("removeClass(Function) with incoming value", function() {
expect(39);
var $divs = jQuery('div').addClass("test"), old = $divs.map(function(){
return jQuery(this).attr("class");
});
$divs.removeClass(function(i, val) {
equals( val, old[i], "Make sure the incoming value is correct." );
return "test";
});
ok( !$divs.is('.test'), "Remove Class" );
reset();
});
var testToggleClass = function(valueObj) {
expect(17);
@ -417,17 +595,57 @@ test("toggleClass(Function[, boolean])", function() {
testToggleClass(functionReturningObj);
});
var testRemoveAttr = function(valueObj) {
expect(1);
equals( jQuery('#mark').removeAttr( valueObj("class") )[0].className, "", "remove class" );
};
test("toggleClass(Fucntion[, boolean]) with incoming value", function() {
expect(14);
test("removeAttr(String)", function() {
testRemoveAttr(bareObj);
});
var e = jQuery("#firstp"), old = e.attr("class");
ok( !e.is(".test"), "Assert class not present" );
e.toggleClass(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return "test";
});
ok( e.is(".test"), "Assert class present" );
old = e.attr("class");
e.toggleClass(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return "test";
});
ok( !e.is(".test"), "Assert class not present" );
old = e.attr("class");
test("removeAttr(Function)", function() {
testRemoveAttr(functionReturningObj);
// class name with a boolean
e.toggleClass(function(i, val, state) {
equals( val, old, "Make sure the incoming value is correct." );
equals( state, false, "Make sure that the state is passed in." );
return "test";
}, false );
ok( !e.is(".test"), "Assert class not present" );
old = e.attr("class");
e.toggleClass(function(i, val, state) {
equals( val, old, "Make sure the incoming value is correct." );
equals( state, true, "Make sure that the state is passed in." );
return "test";
}, true );
ok( e.is(".test"), "Assert class present" );
old = e.attr("class");
e.toggleClass(function(i, val, state) {
equals( val, old, "Make sure the incoming value is correct." );
equals( state, false, "Make sure that the state is passed in." );
return "test";
}, false );
ok( !e.is(".test"), "Assert class not present" );
// Cleanup
e.removeClass("test");
e.removeData('__className__');
});
test("addClass, removeClass, hasClass", function() {

View file

@ -120,69 +120,123 @@ if(jQuery.browser.msie) {
}
test("css(String, Function)", function() {
try {
expect(3);
expect(3);
var sizes = ["10px", "20px", "30px"];
var sizes = ["10px", "20px", "30px"];
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
"<div class='cssFunction'></div>" +
"<div class='cssFunction'></div></div>")
.appendTo("body");
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
"<div class='cssFunction'></div>" +
"<div class='cssFunction'></div></div>")
.appendTo("body");
var index = 0;
var index = 0;
jQuery("#cssFunctionTest div").css("font-size", function() {
var size = sizes[index];
index++;
return size;
});
jQuery("#cssFunctionTest div").css("font-size", function() {
var size = sizes[index];
index++;
return size;
});
index = 0;
index = 0;
jQuery("#cssFunctionTest div").each(function() {
var computedSize = jQuery(this).css("font-size")
var expectedSize = sizes[index]
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
index++;
});
jQuery("#cssFunctionTest").remove();
});
test("css(String, Function) with incoming value", function() {
expect(3);
jQuery("#cssFunctionTest div").each(function() {
var computedSize = jQuery(this).css("font-size")
var expectedSize = sizes[index]
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
index++;
});
var sizes = ["10px", "20px", "30px"];
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
"<div class='cssFunction'></div>" +
"<div class='cssFunction'></div></div>")
.appendTo("body");
var index = 0;
jQuery("#cssFunctionTest div").css("font-size", function() {
var size = sizes[index];
index++;
return size;
});
} finally {
jQuery("#cssFunctionTest").remove();
}
index = 0;
jQuery("#cssFunctionTest div").css("font-size", function(i, computedSize) {
var expectedSize = sizes[index]
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
index++;
return computedSize;
});
jQuery("#cssFunctionTest").remove();
});
test("css(Object) where values are Functions", function() {
try {
expect(3);
expect(3);
var sizes = ["10px", "20px", "30px"];
var sizes = ["10px", "20px", "30px"];
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
"<div class='cssFunction'></div>" +
"<div class='cssFunction'></div></div>")
.appendTo("body");
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
"<div class='cssFunction'></div>" +
"<div class='cssFunction'></div></div>")
.appendTo("body");
var index = 0;
var index = 0;
jQuery("#cssFunctionTest div").css({fontSize: function() {
var size = sizes[index];
index++;
return size;
}});
index = 0;
jQuery("#cssFunctionTest div").each(function() {
var computedSize = jQuery(this).css("font-size")
var expectedSize = sizes[index]
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
index++;
});
jQuery("#cssFunctionTest").remove();
});
test("css(Object) where values are Functions with incoming values", function() {
expect(3);
var sizes = ["10px", "20px", "30px"];
jQuery("#cssFunctionTest div").css({fontSize: function() {
var size = sizes[index];
index++;
return size;
}});
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
"<div class='cssFunction'></div>" +
"<div class='cssFunction'></div></div>")
.appendTo("body");
var index = 0;
jQuery("#cssFunctionTest div").css({fontSize: function() {
var size = sizes[index];
index++;
return size;
}});
index = 0;
index = 0;
jQuery("#cssFunctionTest div").each(function() {
var computedSize = jQuery(this).css("font-size")
var expectedSize = sizes[index]
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
index++;
});
jQuery("#cssFunctionTest div").css({"font-size": function(i, computedSize) {
var expectedSize = sizes[index]
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
index++;
return computedSize;
}});
} finally {
jQuery("#cssFunctionTest").remove();
}
jQuery("#cssFunctionTest").remove();
});
test("jQuery.css(elem, 'height') doesn't clear radio buttons (bug #1095)", function () {

View file

@ -12,6 +12,42 @@ test("text()", function() {
equals( jQuery(document.createTextNode("foo")).text(), "foo", "Text node was retreived from .text()." );
});
var testText = function(valueObj) {
expect(4);
var val = valueObj("<div><b>Hello</b> cruel world!</div>");
equals( jQuery("#foo").text(val)[0].innerHTML.replace(/>/g, "&gt;"), "&lt;div&gt;&lt;b&gt;Hello&lt;/b&gt; cruel world!&lt;/div&gt;", "Check escaped text" );
// using contents will get comments regular, text, and comment nodes
var j = jQuery("#nonnodes").contents();
j.text(valueObj("hi!"));
equals( jQuery(j[0]).text(), "hi!", "Check node,textnode,comment with text()" );
equals( j[1].nodeValue, " there ", "Check node,textnode,comment with text()" );
equals( j[2].nodeType, 8, "Check node,textnode,comment with text()" );
}
test("text(String)", function() {
testText(bareObj)
});
test("text(Function)", function() {
testText(functionReturningObj);
});
test("text(Function) with incoming value", function() {
expect(2);
var old = "This link has class=\"blog\": Simon Willison's Weblog";
jQuery('#sap').text(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return "foobar";
});
equals( jQuery("#sap").text(), "foobar", 'Check for merged text of more then one element.' );
reset();
});
var testWrap = function(val) {
expect(18);
var defaultText = 'Try them out:'
@ -133,7 +169,7 @@ test("wrapInner(String|Element)", function() {
// testWrapInner(functionReturningObj)
// })
var testUnwrap = function() {
test("unwrap()", function() {
expect(9);
jQuery("body").append(' <div id="unwrap" style="display: none;"> <div id="unwrap1"> <span class="unwrap">a</span> <span class="unwrap">b</span> </div> <div id="unwrap2"> <span class="unwrap">c</span> <span class="unwrap">d</span> </div> <div id="unwrap3"> <b><span class="unwrap unwrap3">e</span></b> <b><span class="unwrap unwrap3">f</span></b> </div> </div>');
@ -158,10 +194,6 @@ var testUnwrap = function() {
same( jQuery('body > span.unwrap').get(), abcdef, 'body contains 6 .unwrap child spans' );
jQuery('body > span.unwrap').remove();
}
test("unwrap()", function() {
testUnwrap();
});
var testAppend = function(valueObj) {
@ -256,7 +288,68 @@ test("append(String|Element|Array&lt;Element&gt;|jQuery)", function() {
test("append(Function)", function() {
testAppend(functionReturningObj);
})
});
test("append(Function) with incoming value", function() {
expect(12);
var defaultText = 'Try them out:', old = jQuery("#first").html();
var result = jQuery('#first').append(function(i, val){
equals( val, old, "Make sure the incoming value is correct." );
return '<b>buga</b>';
});
equals( result.text(), defaultText + 'buga', 'Check if text appending works' );
var select = jQuery('#select3');
old = select.html();
equals( select.append(function(i, val){
equals( val, old, "Make sure the incoming value is correct." );
return '<option value="appendTest">Append Test</option>';
}).find('option:last-child').attr('value'), 'appendTest', 'Appending html options to select element');
reset();
var expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:";
old = jQuery("#sap").html();
jQuery('#sap').append(function(i, val){
equals( val, old, "Make sure the incoming value is correct." );
return document.getElementById('first');
});
equals( expected, jQuery('#sap').text(), "Check for appending of element" );
reset();
expected = "This link has class=\"blog\": Simon Willison's WeblogTry them out:Yahoo";
old = jQuery("#sap").html();
jQuery('#sap').append(function(i, val){
equals( val, old, "Make sure the incoming value is correct." );
return [document.getElementById('first'), document.getElementById('yahoo')];
});
equals( expected, jQuery('#sap').text(), "Check for appending of array of elements" );
reset();
expected = "This link has class=\"blog\": Simon Willison's WeblogYahooTry them out:";
old = jQuery("#sap").html();
jQuery('#sap').append(function(i, val){
equals( val, old, "Make sure the incoming value is correct." );
return jQuery("#first, #yahoo");
});
equals( expected, jQuery('#sap').text(), "Check for appending of jQuery object" );
reset();
old = jQuery("#sap").html();
jQuery("#sap").append(function(i, val){
equals( val, old, "Make sure the incoming value is correct." );
return 5;
});
ok( jQuery("#sap")[0].innerHTML.match( /5$/ ), "Check for appending a number" );
reset();
});
test("appendTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
expect(12);
@ -330,7 +423,7 @@ var testPrepend = function(val) {
expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog";
jQuery('#sap').prepend(val( jQuery("#first, #yahoo") ));
equals( expected, jQuery('#sap').text(), "Check for prepending of jQuery object" );
}
};
test("prepend(String|Element|Array&lt;Element&gt;|jQuery)", function() {
testPrepend(bareObj);
@ -338,7 +431,58 @@ test("prepend(String|Element|Array&lt;Element&gt;|jQuery)", function() {
test("prepend(Function)", function() {
testPrepend(functionReturningObj);
})
});
test("prepend(Function) with incoming value", function() {
expect(10);
var defaultText = 'Try them out:', old = jQuery('#first').html();
var result = jQuery('#first').prepend(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return '<b>buga</b>';
});
equals( result.text(), 'buga' + defaultText, 'Check if text prepending works' );
old = jQuery("#select3").html();
equals( jQuery('#select3').prepend(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return '<option value="prependTest">Prepend Test</option>';
}).find('option:first-child').attr('value'), 'prependTest', 'Prepending html options to select element');
reset();
var expected = "Try them out:This link has class=\"blog\": Simon Willison's Weblog";
old = jQuery('#sap').html();
jQuery('#sap').prepend(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return document.getElementById('first');
});
equals( expected, jQuery('#sap').text(), "Check for prepending of element" );
reset();
expected = "Try them out:YahooThis link has class=\"blog\": Simon Willison's Weblog";
old = jQuery('#sap').html();
jQuery('#sap').prepend(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return [document.getElementById('first'), document.getElementById('yahoo')];
});
equals( expected, jQuery('#sap').text(), "Check for prepending of array of elements" );
reset();
expected = "YahooTry them out:This link has class=\"blog\": Simon Willison's Weblog";
old = jQuery('#sap').html();
jQuery('#sap').prepend(function(i, val) {
equals( val, old, "Make sure the incoming value is correct." );
return jQuery("#first, #yahoo");
});
equals( expected, jQuery('#sap').text(), "Check for prepending of jQuery object" );
});
test("prependTo(String|Element|Array&lt;Element&gt;|jQuery)", function() {
expect(6);
@ -618,92 +762,6 @@ test("clone() on XML nodes", function() {
});
}
test("val()", function() {
expect(17);
document.getElementById('text1').value = "bla";
equals( jQuery("#text1").val(), "bla", "Check for modified value of input element" );
reset();
equals( jQuery("#text1").val(), "Test", "Check for value of input element" );
// ticket #1714 this caused a JS error in IE
equals( jQuery("#first").val(), "", "Check a paragraph element to see if it has a value" );
ok( jQuery([]).val() === undefined, "Check an empty jQuery object will return undefined from val" );
equals( jQuery('#select2').val(), '3', 'Call val() on a single="single" select' );
same( jQuery('#select3').val(), ['1', '2'], 'Call val() on a multiple="multiple" select' );
equals( jQuery('#option3c').val(), '2', 'Call val() on a option element with value' );
equals( jQuery('#option3a').val(), '', 'Call val() on a option element with empty value' );
equals( jQuery('#option3e').val(), 'no value', 'Call val() on a option element with no value attribute' );
equals( jQuery('#option3a').val(), '', 'Call val() on a option element with no value attribute' );
jQuery('#select3').val("");
same( jQuery('#select3').val(), [''], 'Call val() on a multiple="multiple" select' );
var checks = jQuery("<input type='checkbox' name='test' value='1'/>").appendTo("#form")
.add( jQuery("<input type='checkbox' name='test' value='2'/>").appendTo("#form") )
.add( jQuery("<input type='checkbox' name='test' value=''/>").appendTo("#form") )
.add( jQuery("<input type='checkbox' name='test'/>").appendTo("#form") );
same( checks.serialize(), "", "Get unchecked values." );
equals( checks.eq(3).val(), "on", "Make sure a value of 'on' is provided if none is specified." );
checks.val([ "2" ]);
same( checks.serialize(), "test=2", "Get a single checked value." );
checks.val([ "1", "" ]);
same( checks.serialize(), "test=1&test=", "Get multiple checked values." );
checks.val([ "", "2" ]);
same( checks.serialize(), "test=2&test=", "Get multiple checked values." );
checks.val([ "1", "on" ]);
same( checks.serialize(), "test=1&test=on", "Get multiple checked values." );
checks.remove();
});
var testVal = function(valueObj) {
expect(6);
jQuery("#text1").val(valueObj( 'test' ));
equals( document.getElementById('text1').value, "test", "Check for modified (via val(String)) value of input element" );
jQuery("#text1").val(valueObj( 67 ));
equals( document.getElementById('text1').value, "67", "Check for modified (via val(Number)) value of input element" );
jQuery("#select1").val(valueObj( "3" ));
equals( jQuery("#select1").val(), "3", "Check for modified (via val(String)) value of select element" );
jQuery("#select1").val(valueObj( 2 ));
equals( jQuery("#select1").val(), "2", "Check for modified (via val(Number)) value of select element" );
jQuery("#select1").append("<option value='4'>four</option>");
jQuery("#select1").val(valueObj( 4 ));
equals( jQuery("#select1").val(), "4", "Should be possible to set the val() to a newly created option" );
// using contents will get comments regular, text, and comment nodes
var j = jQuery("#nonnodes").contents();
j.val(valueObj( "asdf" ));
equals( j.val(), "asdf", "Check node,textnode,comment with val()" );
j.removeAttr("value");
}
test("val(String/Number)", function() {
testVal(bareObj);
});
test("val(Function)", function() {
testVal(functionReturningObj);
})
var testHtml = function(valueObj) {
expect(22);
@ -768,27 +826,66 @@ test("html(Function)", function() {
testHtml(functionReturningObj);
});
var testText = function(valueObj) {
expect(4);
var val = valueObj("<div><b>Hello</b> cruel world!</div>");
equals( jQuery("#foo").text(val)[0].innerHTML.replace(/>/g, "&gt;"), "&lt;div&gt;&lt;b&gt;Hello&lt;/b&gt; cruel world!&lt;/div&gt;", "Check escaped text" );
test("html(Function) with incoming value", function() {
expect(20);
var div = jQuery("#main > div"), old = div.map(function(){ return jQuery(this).html() });
div.html(function(i, val) {
equals( val, old[i], "Make sure the incoming value is correct." );
return "<b>test</b>";
});
var pass = true;
div.each(function(){
if ( this.childNodes.length !== 1 ) {
pass = false;
}
})
ok( pass, "Set HTML" );
reset();
// using contents will get comments regular, text, and comment nodes
var j = jQuery("#nonnodes").contents();
j.text(valueObj("hi!"));
equals( jQuery(j[0]).text(), "hi!", "Check node,textnode,comment with text()" );
equals( j[1].nodeValue, " there ", "Check node,textnode,comment with text()" );
equals( j[2].nodeType, 8, "Check node,textnode,comment with text()" );
}
old = j.map(function(){ return jQuery(this).html(); });
j.html(function(i, val) {
equals( val, old[i], "Make sure the incoming value is correct." );
return "<b>bold</b>";
});
j.find('b').removeData();
equals( j.html().replace(/ xmlns="[^"]+"/g, "").toLowerCase(), "<b>bold</b>", "Check node,textnode,comment with html()" );
var $div = jQuery('<div />');
equals( $div.html(function(i, val) {
equals( val, "", "Make sure the incoming value is correct." );
return 5;
}).html(), '5', 'Setting a number as html' );
equals( $div.html(function(i, val) {
equals( val, "5", "Make sure the incoming value is correct." );
return 0;
}).html(), '0', 'Setting a zero as html' );
test("text(String)", function() {
testText(bareObj)
var $div2 = jQuery('<div/>'), insert = "&lt;div&gt;hello1&lt;/div&gt;";
equals( $div2.html(function(i, val) {
equals( val, "", "Make sure the incoming value is correct." );
return insert;
}).html(), insert, "Verify escaped insertion." );
equals( $div2.html(function(i, val) {
equals( val, insert, "Make sure the incoming value is correct." );
return "x" + insert;
}).html(), "x" + insert, "Verify escaped insertion." );
equals( $div2.html(function(i, val) {
equals( val, "x" + insert, "Make sure the incoming value is correct." );
return " " + insert;
}).html(), " " + insert, "Verify escaped insertion." );
});
test("text(Function)", function() {
testText(functionReturningObj);
})
var testRemove = function(method) {
expect(9);

View file

@ -1,6 +1,8 @@
module("offset");
testoffset("absolute", function( jQuery ) {
expect(144);
// get offset tests
var tests = [
{ id: '#absolute-1', top: 1, left: 1 },
@ -51,6 +53,16 @@ testoffset("absolute", function( jQuery ) {
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" );
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
var top = this.top, left = this.left;
jQuery( this.id ).offset(function(i, val){
equals( val.top, top, "Verify incoming top position." );
equals( val.left, left, "Verify incoming top position." );
return { top: top + 1, left: left + 1 };
});
equals( jQuery( this.id ).offset().top, this.top + 1, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" );
equals( jQuery( this.id ).offset().left, this.left + 1, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
jQuery( this ).css({
top: props.top + 1,
@ -63,6 +75,8 @@ testoffset("absolute", function( jQuery ) {
});
testoffset("relative", function( jQuery ) {
expect(60);
// IE is collapsing the top margin of 1px
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version ) < 8;
@ -122,6 +136,8 @@ testoffset("relative", function( jQuery ) {
});
testoffset("static", function( jQuery ) {
expect(80);
// IE is collapsing the top margin of 1px
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version ) < 8;
@ -187,6 +203,8 @@ testoffset("static", function( jQuery ) {
});
testoffset("fixed", function( jQuery ) {
expect(28);
jQuery.offset.initialize();
var tests = [
@ -238,31 +256,18 @@ testoffset("fixed", function( jQuery ) {
});
testoffset("table", function( jQuery ) {
var ie = jQuery.browser.msie;
expect(4);
equals( jQuery('#table-1').offset().top, 6, "jQuery('#table-1').offset().top" );
equals( jQuery('#table-1').offset().left, 6, "jQuery('#table-1').offset().left" );
equals( jQuery('#th-1').offset().top, 10, "jQuery('#th-1').offset().top" );
equals( jQuery('#th-1').offset().left, 10, "jQuery('#th-1').offset().left" );
// equals( jQuery('#th-2').offset().top, 10, "jQuery('#th-2').offset().top" );
// equals( jQuery('#th-2').offset().left, 116, "jQuery('#th-2').offset().left" );
//
// equals( jQuery('#th-3').offset().top, 10, "jQuery('#th-3').offset().top" );
// equals( jQuery('#th-3').offset().left, 222, "jQuery('#th-3').offset().left" );
// equals( jQuery('#td-1').offset().top, ie ? 116 : 112, "jQuery('#td-1').offset().top" );
// equals( jQuery('#td-1').offset().left, 10, "jQuery('#td-1').offset().left" );
//
// equals( jQuery('#td-2').offset().top, ie ? 116 : 112, "jQuery('#td-2').offset().top" );
// equals( jQuery('#td-2').offset().left, 116, "jQuery('#td-2').offset().left" );
//
// equals( jQuery('#td-3').offset().top, ie ? 116 : 112, "jQuery('#td-3').offset().top" );
// equals( jQuery('#td-3').offset().left, 222, "jQuery('#td-3').offset().left" );
});
testoffset("scroll", function( jQuery, win ) {
expect(12);
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version ) < 8;
// IE is collapsing the top margin of 1px
@ -294,6 +299,8 @@ testoffset("scroll", function( jQuery, win ) {
});
testoffset("body", function( jQuery ) {
expect(2);
equals( jQuery('body').offset().top, 1, "jQuery('#body').offset().top" );
equals( jQuery('body').offset().left, 1, "jQuery('#body').offset().left" );
});