X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fjquery%2Fjquery.js;h=b7715be353ab57e0bdda6c71ab3e8d7b5059a33a;hb=94b0bf5f2b7a4003196a679649567a13d0f13ad0;hp=c1d64f2e97daf26be96323909c8d7f168cc732a1;hpb=f50224d6530da96293ddbc16943e374a8b236e39;p=jquery.git
diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js
index c1d64f2..b7715be 100644
--- a/src/jquery/jquery.js
+++ b/src/jquery/jquery.js
@@ -28,7 +28,7 @@ window.undefined = window.undefined;
* @name jQuery
* @cat Core
*/
-function jQuery(a,c) {
+jQuery = function(a,c) {
// Shortcut for document ready (because $(document).each() is silly)
if ( a && a.constructor == Function && jQuery.fn.ready )
@@ -67,7 +67,7 @@ function jQuery(a,c) {
// If so, execute it in context
if ( fn && fn.constructor == Function )
this.each(fn);
-}
+};
// Map over the $ in case of overwrite
if ( typeof $ != "undefined" )
@@ -203,7 +203,7 @@ jQuery.fn = jQuery.prototype = {
* @before
* @result 2
*
- * @test cmpOK( $("div").length, "==", 2, "Get Number of Elements Found" );
+ * @test ok( $("div").length == 2, "Get Number of Elements Found" );
*
* @property
* @name length
@@ -218,7 +218,7 @@ jQuery.fn = jQuery.prototype = {
* @before
* @result 2
*
- * @test cmpOK( $("div").size(), "==", 2, "Get Number of Elements Found" );
+ * @test ok( $("div").size() == 2, "Get Number of Elements Found" );
*
* @name size
* @type Number
@@ -252,7 +252,7 @@ jQuery.fn = jQuery.prototype = {
* @before
* @result [ ]
*
- * @test cmpOK( $("div").get(0), "==", document.getElementById("main"), "Get A Single Element" );
+ * @test ok( $("div").get(0) == document.getElementById("main"), "Get A Single Element" );
*
* @name get
* @type Element
@@ -587,19 +587,17 @@ jQuery.fn = jQuery.prototype = {
* and finds the deepest ancestor element within its
* structure - it is that element that will en-wrap everything else.
*
+ * This does not work with elements that contain text. Any necessary text
+ * must be added after the wrapping is done.
+ *
* @example $("p").wrap("
");
* @before
Test Paragraph.
* @result
Test Paragraph.
*
* @test var defaultText = 'Try them out:'
* var result = $('#first').wrap('
').text();
- * ok( defaultText == result, 'Check for simple wrapping' );
- * ok( $('#first').parent().parent().is('.red'), 'Check if wrapper div has class "red"' );
- *
- * @test var defaultText = 'Try them out:'
- * var result = $('#first').wrap('
xxyy
').text()
- * ok( 'xx' + defaultText + 'yy' == result, 'Check for wrapping' );
- * ok( $('#first').parent().parent().is('.red'), 'Check if wrapper div has class "red"' );
+ * ok( defaultText == result, 'Check for wrapping of on-the-fly html' );
+ * ok( $('#first').parent().parent().is('.red'), 'Check if wrapper has class "red"' );
*
* @name wrap
* @type jQuery
@@ -617,9 +615,17 @@ jQuery.fn = jQuery.prototype = {
* provided and finding the deepest ancestor element within its
* structure - it is that element that will en-wrap everything else.
*
- * @example $("p").wrap("");
- * @before
Test Paragraph.
- * @result
Test Paragraph.
+ * This does not work with elements that contain text. Any necessary text
+ * must be added after the wrapping is done.
+ *
+ * @example $("p").wrap( document.getElementById('content') );
+ * @before
Test Paragraph.
+ * @result
Test Paragraph.
+ *
+ * @test var defaultText = 'Try them out:'
+ * var result = $('#first').wrap(document.getElementById('empty')).parent();
+ * ok( result.is('ol'), 'Check for element wrapping' );
+ * ok( result.text() == defaultText, 'Check for element wrapping' );
*
* @name wrap
* @type jQuery
@@ -661,6 +667,12 @@ jQuery.fn = jQuery.prototype = {
* var result = $('#first').append('buga');
* ok( result.text() == defaultText + 'buga', 'Check if text appending works' );
*
+ * @test reset();
+ * var expected = "Try them out: bla ";
+ * $('#first').append(" ");
+ * $('#first').append("bla ");
+ * ok( expected == $('#first').text(), "Check for appending of spaces" );
+ *
* @name append
* @type jQuery
* @param String html A string of HTML, that will be created on the fly and appended to the target.
@@ -1035,7 +1047,7 @@ jQuery.fn = jQuery.prototype = {
* @example $("p").not("#selected")
* @before
Hello
Hello Again
* @result [
Hello
]
- * @test cmpOK($("#main > p#ap > a").not("#google").length, "==", 2, ".not")
+ * @test ok($("#main > p#ap > a").not("#google").length == 2, ".not")
*
* @name not
* @type jQuery
@@ -1165,7 +1177,7 @@ jQuery.fn = jQuery.prototype = {
return this.each(function(){
var obj = this;
- if ( table && this.nodeName == "TABLE" && a[0].nodeName != "THEAD" ) {
+ if ( table && this.nodeName.toUpperCase() == "TABLE" && a[0].nodeName.toUpperCase() != "THEAD" ) {
var tbody = this.getElementsByTagName("tbody");
if ( !tbody.length ) {
@@ -1212,7 +1224,20 @@ jQuery.fn = jQuery.prototype = {
};
/**
- *
+ * Extends the jQuery object itself. Can be used to add both static
+ * functions and plugin methods.
+ *
+ * @example $.fn.extend({
+ * check: function() {
+ * this.each(function() { this.checked = true; });
+ * ),
+ * uncheck: function() {
+ * this.each(function() { this.checked = false; });
+ * }
+ * });
+ * $("input[@type=checkbox]").check();
+ * $("input[@type=radio]").uncheck();
+ * @desc Adds two plugin methods.
*
* @private
* @name extend
@@ -1348,9 +1373,22 @@ jQuery.extend({
o.className += ( o.className ? " " : "" ) + c;
},
remove: function(o,c){
+ /*
o.className = !c ? "" :
o.className.replace(
- new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");
+ new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");*/
+ if( !c ) {
+ o.className = "";
+ } else {
+ var classes = o.className.split(" ");
+ for(var i=0; i=0",
+ "^=": "z && !z.indexOf(m[4])",
+ "$=": "z && z.substr(z.length - m[4].length,m[4].length)==m[4]",
+ "*=": "z && z.indexOf(m[4])>=0",
"": "z"
},
"[": "jQuery.find(m[2],a).length"
@@ -1549,7 +1599,7 @@ jQuery.extend({
* @test t( "Element Selector", "div", ["main","foo"] );
* @test t( "Element Selector", "body", ["body"] );
* @test t( "Element Selector", "html", ["html"] );
- * @test cmpOK( $("*").size(), ">=", 30, "Element Selector" );
+ * @test ok( $("*").size() >= 30, "Element Selector" );
* @test t( "Parent Element", "div div", ["foo"] );
*
* @test t( "ID Selector", "#body", ["body"] );
@@ -1583,6 +1633,11 @@ jQuery.extend({
* @test t( "Attribute Exists", "a[@title]", ["google"] );
* @test t( "Attribute Exists", "*[@title]", ["google"] );
* @test t( "Attribute Exists", "[@title]", ["google"] );
+ *
+ * @test t( "Non-existing part of attribute [@name*=bla]", "[@name*=bla]", [] );
+ * @test t( "Non-existing start of attribute [@name^=bla]", "[@name^=bla]", [] );
+ * @test t( "Non-existing end of attribute [@name$=bla]", "[@name$=bla]", [] );
+ *
* @test t( "Attribute Equals", "a[@rel='bookmark']", ["simon1"] );
* @test t( "Attribute Equals", 'a[@rel="bookmark"]', ["simon1"] );
* @test t( "Attribute Equals", "a[@rel=bookmark]", ["simon1"] );
@@ -1606,7 +1661,7 @@ jQuery.extend({
* @test t( "Element Preceded By", "p ~ div", ["foo"] );
* @test t( "Not", "a.blog:not(.link)", ["mark"] );
*
- * @test cmpOK( jQuery.find("//*").length, ">=", 30, "All Elements (//*)" );
+ * @test ok( jQuery.find("//*").length >= 30, "All Elements (//*)" );
* @test t( "All Div Elements", "//div", ["main","foo"] );
* @test t( "Absolute Path", "/html/body", ["body"] );
* @test t( "Absolute Path w/ *", "/* /body", ["body"] );
@@ -1638,6 +1693,15 @@ jQuery.extend({
* @test t( "All Children of ID", "#foo/*", ["sndp", "en", "sap"] );
* @test t( "All Children of ID with no children", "#firstUL/*", [] );
*
+ * @test t( "Form element :input", ":input", ["text1", "text2", "radio1", "radio2", "check1", "check2", "hidden1", "hidden2", "name", "area1", "select1", "select2", "select3"] );
+ * @test t( "Form element :radio", ":radio", ["radio1", "radio2"] );
+ * @test t( "Form element :checkbox", ":checkbox", ["check1", "check2"] );
+ * @test t( "Form element :text", ":text", ["text1", "text2", "hidden2", "name"] );
+ *
+ * @test t( ":not() Existing attribute", "input:not([@name])", ["text2", "check2"]);
+ * @test t( ":not() Equals attribute", "select:not([@name=select1])", ["select2", "select3"]);
+ * @test t( ":not() Equals quoted attribute", "select:not([@name='select1'])", ["select2", "select3"]);
+ *
* @name $.find
* @type Array
* @private
@@ -1770,16 +1834,16 @@ jQuery.extend({
// The regular expressions that power the parsing engine
parse: [
// Match: [@value='test'], [@foo]
- [ "\\[ *(@)S *([!*$^=]*) *Q\\]", 1 ],
+ "\\[ *(@)S *([!*$^=]*)Q\\]",
// Match: [div], [div p]
- [ "(\\[)Q\\]", 0 ],
+ "(\\[)Q\\]",
// Match: :contains('foo')
- [ "(:)S\\(Q\\)", 0 ],
+ "(:)S\\(Q\\)",
// Match: :even, :last-chlid
- [ "([:.#]*)S", 0 ]
+ "([:.#]*)S"
],
filter: function(t,r,not) {
@@ -1792,21 +1856,28 @@ jQuery.extend({
var p = jQuery.parse;
for ( var i = 0; i < p.length; i++ ) {
- var re = new RegExp( "^" + p[i][0]
-
+ // get number for backreference
+ var br = 0;
+ if(p[i].indexOf('Q') != -1){
+ br = p[i].replace(/\\\(/g,'').match(/\(|S/g).length+1;
+ }
+ var re = new RegExp( "^" + p[i]
+
// Look for a string-like sequence
.replace( 'S', "([a-z*_-][a-z0-9_-]*)" )
// Look for something (optionally) enclosed with quotes
- .replace( 'Q', " *'?\"?([^'\"]*?)'?\"? *" ), "i" );
+ .replace( 'Q', " *('|\"|)([^'\"]*?)\\"+br+" *" ), "i" );
var m = re.exec( t );
if ( m ) {
// Re-organize the match
- if ( p[i][1] )
- m = ["", m[1], m[3], m[2], m[4]];
-
+ if(br == 4){
+ m = ["",m[1], m[3], m[2], m[5]];
+ } else if(br != 0) {
+ m.splice(br,1);
+ }
// Remove what we just matched
t = t.replace( re, "" );
@@ -1885,15 +1956,17 @@ jQuery.extend({
*/
sibling: function(elem, pos, not) {
var elems = [];
-
- var siblings = elem.parentNode.childNodes;
- for ( var i = 0; i < siblings.length; i++ ) {
- if ( not === true && siblings[i] == elem ) continue;
-
- if ( siblings[i].nodeType == 1 )
- elems.push( siblings[i] );
- if ( siblings[i] == elem )
- elems.n = elems.length - 1;
+
+ if(elem) {
+ var siblings = elem.parentNode.childNodes;
+ for ( var i = 0; i < siblings.length; i++ ) {
+ if ( not === true && siblings[i] == elem ) continue;
+
+ if ( siblings[i].nodeType == 1 )
+ elems.push( siblings[i] );
+ if ( siblings[i] == elem )
+ elems.n = elems.length - 1;
+ }
}
return jQuery.extend( elems, {
@@ -2131,8 +2204,11 @@ jQuery.extend({
var c = this.events[event.type];
+ var args = [].slice.call( arguments, 1 );
+ args.unshift( event );
+
for ( var j in c ) {
- if ( c[j].apply( this, [event] ) === false ) {
+ if ( c[j].apply( this, args ) === false ) {
event.preventDefault();
event.stopPropagation();
returnValue = false;
@@ -2616,6 +2692,10 @@ jQuery.macros = {
* @before
* @result "test"
*
+ * @test ok( $(document.getElementById('main')).id() == "main", "Check for id" );
+ * @test ok( $("#foo").id() == "foo", "Check for id" );
+ * @test ok( !$("head").id(), "Check for id" );
+ *
* @name id
* @type String
* @cat DOM/Attributes
@@ -2642,6 +2722,9 @@ jQuery.macros = {
* @before
* @result "my image"
*
+ * @test ok( $(document.getElementById('google')).title() == "Google!", "Check for title" );
+ * @test ok( !$("#yahoo").title(), "Check for title" );
+ *
* @name title
* @type String
* @cat DOM/Attributes
@@ -2668,6 +2751,10 @@ jQuery.macros = {
* @before
* @result "username"
*
+ * @test ok( $(document.getElementById('text1')).name() == "action", "Check for name" );
+ * @test ok( $("#hidden1").name() == "hidden", "Check for name" );
+ * @test ok( !$("#area1").name(), "Check for name" );
+ *
* @name name
* @type String
* @cat DOM/Attributes
@@ -2946,7 +3033,7 @@ jQuery.macros = {
* @param String expr An expression to filter the sibling Elements with
* @cat DOM/Traversing
*/
- siblings: jQuery.sibling,
+ siblings: "jQuery.sibling(a, null, true)",
/**
@@ -2957,6 +3044,8 @@ jQuery.macros = {
* @before