Merge branch 'master' of https://github.com/jquery/jquery
This commit is contained in:
commit
610ab137da
42 changed files with 2307 additions and 2069 deletions
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2010 John Resig, http://jquery.com/
|
Copyright (c) 2011 John Resig, http://jquery.com/
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
a copy of this software and associated documentation files (the
|
a copy of this software and associated documentation files (the
|
||||||
|
|
11
Makefile
11
Makefile
|
@ -24,10 +24,9 @@ BASE_FILES = ${SRC_DIR}/core.js\
|
||||||
${SRC_DIR}/manipulation.js\
|
${SRC_DIR}/manipulation.js\
|
||||||
${SRC_DIR}/css.js\
|
${SRC_DIR}/css.js\
|
||||||
${SRC_DIR}/ajax.js\
|
${SRC_DIR}/ajax.js\
|
||||||
${SRC_DIR}/xhr.js\
|
${SRC_DIR}/ajax/jsonp.js\
|
||||||
${SRC_DIR}/transports/jsonp.js\
|
${SRC_DIR}/ajax/script.js\
|
||||||
${SRC_DIR}/transports/script.js\
|
${SRC_DIR}/ajax/xhr.js\
|
||||||
${SRC_DIR}/transports/xhr.js\
|
|
||||||
${SRC_DIR}/effects.js\
|
${SRC_DIR}/effects.js\
|
||||||
${SRC_DIR}/offset.js\
|
${SRC_DIR}/offset.js\
|
||||||
${SRC_DIR}/dimensions.js
|
${SRC_DIR}/dimensions.js
|
||||||
|
@ -79,13 +78,13 @@ init:
|
||||||
jquery: ${JQ}
|
jquery: ${JQ}
|
||||||
jq: ${JQ}
|
jq: ${JQ}
|
||||||
|
|
||||||
${JQ}: ${MODULES} ${DIST_DIR}
|
${JQ}: ${MODULES} | ${DIST_DIR}
|
||||||
@@echo "Building" ${JQ}
|
@@echo "Building" ${JQ}
|
||||||
|
|
||||||
@@cat ${MODULES} | \
|
@@cat ${MODULES} | \
|
||||||
sed 's/.function..jQuery...{//' | \
|
sed 's/.function..jQuery...{//' | \
|
||||||
sed 's/}...jQuery..;//' | \
|
sed 's/}...jQuery..;//' | \
|
||||||
sed 's/Date:./&'"${DATE}"'/' | \
|
sed 's/@DATE/'"${DATE}"'/' | \
|
||||||
${VER} > ${JQ};
|
${VER} > ${JQ};
|
||||||
|
|
||||||
${SRC_DIR}/selector.js: ${SIZZLE_DIR}/sizzle.js
|
${SRC_DIR}/selector.js: ${SIZZLE_DIR}/sizzle.js
|
||||||
|
|
48
Rakefile
48
Rakefile
|
@ -9,7 +9,27 @@ test_dir = File.join( prefix, 'test' )
|
||||||
# setting DIST_DIR before calling rake
|
# setting DIST_DIR before calling rake
|
||||||
dist_dir = ENV['DIST_DIR'] || File.join( prefix, 'dist' )
|
dist_dir = ENV['DIST_DIR'] || File.join( prefix, 'dist' )
|
||||||
|
|
||||||
base_files = %w{intro core support data queue attributes event selector traversing manipulation css ajax xhr transports/jsonp transports/script transports/xhr effects offset dimensions outro}.map { |js| File.join( src_dir, "#{js}.js" ) }
|
base_files = %w{
|
||||||
|
intro
|
||||||
|
core
|
||||||
|
support
|
||||||
|
data
|
||||||
|
queue
|
||||||
|
attributes
|
||||||
|
event
|
||||||
|
selector
|
||||||
|
traversing
|
||||||
|
manipulation
|
||||||
|
css
|
||||||
|
ajax
|
||||||
|
ajax/jsonp
|
||||||
|
ajax/script
|
||||||
|
ajax/xhr
|
||||||
|
effects
|
||||||
|
offset
|
||||||
|
dimensions
|
||||||
|
outro
|
||||||
|
}.map { |js| File.join( src_dir, "#{js}.js" ) }
|
||||||
|
|
||||||
# Sizzle, QUnit and jQuery files/dirs
|
# Sizzle, QUnit and jQuery files/dirs
|
||||||
sizzle_dir = File.join( src_dir, "sizzle" )
|
sizzle_dir = File.join( src_dir, "sizzle" )
|
||||||
|
@ -31,7 +51,7 @@ rhino = "java -jar #{build_dir}/js.jar"
|
||||||
minfier = "java -jar #{build_dir}/google-compiler-20100917.jar"
|
minfier = "java -jar #{build_dir}/google-compiler-20100917.jar"
|
||||||
|
|
||||||
# Turn off output other than needed from `sh` and file commands
|
# Turn off output other than needed from `sh` and file commands
|
||||||
verbose(false)
|
verbose(false)
|
||||||
|
|
||||||
# Tasks
|
# Tasks
|
||||||
task :default => "all"
|
task :default => "all"
|
||||||
|
@ -51,7 +71,7 @@ task :min => jq_min
|
||||||
task :init => [sizzle, qunit] do
|
task :init => [sizzle, qunit] do
|
||||||
sizzle_git = File.join(sizzle_dir, '.git')
|
sizzle_git = File.join(sizzle_dir, '.git')
|
||||||
qunit_git = File.join(qunit_dir, '.git')
|
qunit_git = File.join(qunit_dir, '.git')
|
||||||
|
|
||||||
puts "Updating SizzleJS with latest..."
|
puts "Updating SizzleJS with latest..."
|
||||||
sh "git --git-dir=#{sizzle_git} pull -q origin master"
|
sh "git --git-dir=#{sizzle_git} pull -q origin master"
|
||||||
|
|
||||||
|
@ -61,7 +81,7 @@ end
|
||||||
|
|
||||||
desc "Removes dist folder, selector.js, and Sizzle/QUnit"
|
desc "Removes dist folder, selector.js, and Sizzle/QUnit"
|
||||||
task :clean do
|
task :clean do
|
||||||
puts "Removing Distribution directory: #{dist_dir}..."
|
puts "Removing Distribution directory: #{dist_dir}..."
|
||||||
rm_rf dist_dir
|
rm_rf dist_dir
|
||||||
|
|
||||||
puts "Removing built copy of Sizzle..."
|
puts "Removing built copy of Sizzle..."
|
||||||
|
@ -87,9 +107,13 @@ directory dist_dir
|
||||||
|
|
||||||
file jq => [dist_dir, base_files].flatten do
|
file jq => [dist_dir, base_files].flatten do
|
||||||
puts "Building jquery.js..."
|
puts "Building jquery.js..."
|
||||||
|
|
||||||
File.open(jq, 'w') do |f|
|
File.open(jq, 'w') do |f|
|
||||||
f.write cat(base_files).gsub(/(Date:.)/, "\\1#{date}" ).gsub(/@VERSION/, version)
|
f.write cat(base_files).
|
||||||
|
gsub(/@DATE/, date).
|
||||||
|
gsub(/@VERSION/, version).
|
||||||
|
gsub(/.function..jQuery...\{/, '').
|
||||||
|
gsub(/\}...jQuery..;/, '')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -97,9 +121,9 @@ file jq_min => jq do
|
||||||
puts "Building jquery.min.js..."
|
puts "Building jquery.min.js..."
|
||||||
|
|
||||||
sh "#{minfier} --js #{jq} --warning_level QUIET --js_output_file #{jq_min}"
|
sh "#{minfier} --js #{jq} --warning_level QUIET --js_output_file #{jq_min}"
|
||||||
|
|
||||||
min = File.read( jq_min )
|
min = File.read( jq_min )
|
||||||
|
|
||||||
# Equivilent of "head"
|
# Equivilent of "head"
|
||||||
File.open(jq_min, 'w') do |f|
|
File.open(jq_min, 'w') do |f|
|
||||||
f.write File.readlines(jq)[0..14].join()
|
f.write File.readlines(jq)[0..14].join()
|
||||||
|
@ -107,12 +131,12 @@ file jq_min => jq do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
file selector => [sizzle, :init] do
|
file selector => [sizzle, :init] do
|
||||||
puts "Building selector code from Sizzle..."
|
puts "Building selector code from Sizzle..."
|
||||||
|
|
||||||
File.open(selector, 'w') do |f|
|
File.open(selector, 'w') do |f|
|
||||||
f.write File.read(sizzle).gsub(
|
f.write File.read(sizzle).gsub(
|
||||||
/^.+EXPOSE$\n/,
|
/^.+EXPOSE$\n/,
|
||||||
'\0' + File.read( File.join( src_dir, 'sizzle-jquery.js' ))
|
'\0' + File.read( File.join( src_dir, 'sizzle-jquery.js' ))
|
||||||
).gsub(
|
).gsub(
|
||||||
/^window.Sizzle.+$\n/, ''
|
/^window.Sizzle.+$\n/, ''
|
||||||
|
|
|
@ -63,10 +63,9 @@
|
||||||
<fileset file="src/manipulation.js" />
|
<fileset file="src/manipulation.js" />
|
||||||
<fileset file="src/css.js" />
|
<fileset file="src/css.js" />
|
||||||
<fileset file="src/ajax.js" />
|
<fileset file="src/ajax.js" />
|
||||||
<fileset file="src/xhr.js" />
|
<fileset file="src/ajax/jsonp.js" />
|
||||||
<fileset file="src/transports/jsonp.js" />
|
<fileset file="src/ajax/script.js" />
|
||||||
<fileset file="src/transports/script.js" />
|
<fileset file="src/ajax/xhr.js" />
|
||||||
<fileset file="src/transports/xhr.js" />
|
|
||||||
<fileset file="src/effects.js" />
|
<fileset file="src/effects.js" />
|
||||||
<fileset file="src/offset.js" />
|
<fileset file="src/offset.js" />
|
||||||
<fileset file="src/dimensions.js" />
|
<fileset file="src/dimensions.js" />
|
||||||
|
@ -77,7 +76,7 @@
|
||||||
<arg line="log -1 --pretty=format:%ad" />
|
<arg line="log -1 --pretty=format:%ad" />
|
||||||
</exec>
|
</exec>
|
||||||
<replaceregexp match="(\(\s*function\s*\(\s*jQuery\s*\)\s*\{)|(\}\s*\)\s*\(\s*jQuery\s*\)\s*;)" flags="g" replace="" file="${JQ}" />
|
<replaceregexp match="(\(\s*function\s*\(\s*jQuery\s*\)\s*\{)|(\}\s*\)\s*\(\s*jQuery\s*\)\s*;)" flags="g" replace="" file="${JQ}" />
|
||||||
<replaceregexp match="Date: " replace="Date: ${date}" file="${JQ}" />
|
<replaceregexp match="@DATE" replace="${date}" file="${JQ}" />
|
||||||
<echo message="${JQ} built." />
|
<echo message="${JQ} built." />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
|
826
src/ajax.js
826
src/ajax.js
|
@ -1,11 +1,20 @@
|
||||||
(function( jQuery ) {
|
(function( jQuery ) {
|
||||||
|
|
||||||
var rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
var r20 = /%20/g,
|
||||||
rselectTextarea = /^(?:select|textarea)/i,
|
|
||||||
rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
|
|
||||||
rbracket = /\[\]$/,
|
rbracket = /\[\]$/,
|
||||||
|
rhash = /#.*$/,
|
||||||
|
rheaders = /^(.*?):\s*(.*?)\r?$/mg, // IE leaves an \r character at EOL
|
||||||
|
rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
|
||||||
|
rnoContent = /^(?:GET|HEAD)$/,
|
||||||
rquery = /\?/,
|
rquery = /\?/,
|
||||||
r20 = /%20/g,
|
rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
||||||
|
rselectTextarea = /^(?:select|textarea)/i,
|
||||||
|
rts = /([?&])_=[^&]*/,
|
||||||
|
rurl = /^(\w+:)?\/\/([^\/?#:]+)(?::(\d+))?/,
|
||||||
|
rCRLF = /\r?\n/g,
|
||||||
|
|
||||||
|
// Slice function
|
||||||
|
sliceFunc = Array.prototype.slice,
|
||||||
|
|
||||||
// Keep a copy of the old load method
|
// Keep a copy of the old load method
|
||||||
_load = jQuery.fn.load;
|
_load = jQuery.fn.load;
|
||||||
|
@ -43,35 +52,43 @@ jQuery.fn.extend({
|
||||||
type = "POST";
|
type = "POST";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
// Request the remote document
|
// Request the remote document
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url,
|
url: url,
|
||||||
type: type,
|
type: type,
|
||||||
dataType: "html",
|
dataType: "html",
|
||||||
data: params,
|
data: params,
|
||||||
complete: function( res, status ) {
|
// Complete callback (responseText is used internally)
|
||||||
|
complete: function( jXHR, status, responseText ) {
|
||||||
|
// Store the response as specified by the jXHR object
|
||||||
|
responseText = jXHR.responseText;
|
||||||
// If successful, inject the HTML into all the matched elements
|
// If successful, inject the HTML into all the matched elements
|
||||||
if ( status === "success" || status === "notmodified" ) {
|
if ( jXHR.isResolved() ) {
|
||||||
|
// #4825: Get the actual response in case
|
||||||
|
// a dataFilter is present in ajaxSettings
|
||||||
|
jXHR.done(function( r ) {
|
||||||
|
responseText = r;
|
||||||
|
});
|
||||||
// See if a selector was specified
|
// See if a selector was specified
|
||||||
self.html( selector ?
|
self.html( selector ?
|
||||||
// Create a dummy div to hold the results
|
// Create a dummy div to hold the results
|
||||||
jQuery("<div>")
|
jQuery("<div>")
|
||||||
// inject the contents of the document in, removing the scripts
|
// inject the contents of the document in, removing the scripts
|
||||||
// to avoid any 'Permission Denied' errors in IE
|
// to avoid any 'Permission Denied' errors in IE
|
||||||
.append(res.responseText.replace(rscript, ""))
|
.append(responseText.replace(rscript, ""))
|
||||||
|
|
||||||
// Locate the specified elements
|
// Locate the specified elements
|
||||||
.find(selector) :
|
.find(selector) :
|
||||||
|
|
||||||
// If not, just inject the full result
|
// If not, just inject the full result
|
||||||
res.responseText );
|
responseText );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( callback ) {
|
if ( callback ) {
|
||||||
self.each( callback, [res.responseText, status, res] );
|
self.each( callback, [responseText, status, jXHR] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -99,9 +116,9 @@ jQuery.fn.extend({
|
||||||
null :
|
null :
|
||||||
jQuery.isArray(val) ?
|
jQuery.isArray(val) ?
|
||||||
jQuery.map( val, function(val, i){
|
jQuery.map( val, function(val, i){
|
||||||
return {name: elem.name, value: val};
|
return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
|
||||||
}) :
|
}) :
|
||||||
{name: elem.name, value: val};
|
{ name: elem.name, value: val.replace(rCRLF, "\r\n") };
|
||||||
}).get();
|
}).get();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -113,9 +130,8 @@ jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".sp
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery.extend({
|
jQuery.each( [ "get", "post" ], function( i, method ) {
|
||||||
|
jQuery[ method ] = function( url, data, callback, type ) {
|
||||||
get: function( url, data, callback, type ) {
|
|
||||||
// shift arguments if data argument was omited
|
// shift arguments if data argument was omited
|
||||||
if ( jQuery.isFunction( data ) ) {
|
if ( jQuery.isFunction( data ) ) {
|
||||||
type = type || callback;
|
type = type || callback;
|
||||||
|
@ -124,13 +140,16 @@ jQuery.extend({
|
||||||
}
|
}
|
||||||
|
|
||||||
return jQuery.ajax({
|
return jQuery.ajax({
|
||||||
type: "GET",
|
type: method,
|
||||||
url: url,
|
url: url,
|
||||||
data: data,
|
data: data,
|
||||||
success: callback,
|
success: callback,
|
||||||
dataType: type
|
dataType: type
|
||||||
});
|
});
|
||||||
},
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
|
|
||||||
getScript: function( url, callback ) {
|
getScript: function( url, callback ) {
|
||||||
return jQuery.get(url, null, callback, "script");
|
return jQuery.get(url, null, callback, "script");
|
||||||
|
@ -140,25 +159,9 @@ jQuery.extend({
|
||||||
return jQuery.get(url, data, callback, "json");
|
return jQuery.get(url, data, callback, "json");
|
||||||
},
|
},
|
||||||
|
|
||||||
post: function( url, data, callback, type ) {
|
|
||||||
// shift arguments if data argument was omited
|
|
||||||
if ( jQuery.isFunction( data ) ) {
|
|
||||||
type = type || callback;
|
|
||||||
callback = data;
|
|
||||||
data = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
return jQuery.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: url,
|
|
||||||
data: data,
|
|
||||||
success: callback,
|
|
||||||
dataType: type
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
ajaxSetup: function( settings ) {
|
ajaxSetup: function( settings ) {
|
||||||
jQuery.extend( jQuery.ajaxSettings, settings );
|
jQuery.extend( true, jQuery.ajaxSettings, settings );
|
||||||
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
ajaxSettings: {
|
ajaxSettings: {
|
||||||
|
@ -181,12 +184,7 @@ jQuery.extend({
|
||||||
xhr: function() {
|
xhr: function() {
|
||||||
return new window.XMLHttpRequest();
|
return new window.XMLHttpRequest();
|
||||||
},
|
},
|
||||||
xhrResponseFields: {
|
|
||||||
xml: "XML",
|
|
||||||
text: "Text",
|
|
||||||
json: "JSON"
|
|
||||||
},
|
|
||||||
|
|
||||||
accepts: {
|
accepts: {
|
||||||
xml: "application/xml, text/xml",
|
xml: "application/xml, text/xml",
|
||||||
html: "text/html",
|
html: "text/html",
|
||||||
|
@ -194,97 +192,523 @@ jQuery.extend({
|
||||||
json: "application/json, text/javascript",
|
json: "application/json, text/javascript",
|
||||||
"*": "*/*"
|
"*": "*/*"
|
||||||
},
|
},
|
||||||
|
|
||||||
autoDataType: {
|
contents: {
|
||||||
xml: /xml/,
|
xml: /xml/,
|
||||||
html: /html/,
|
html: /html/,
|
||||||
json: /json/
|
json: /json/
|
||||||
},
|
},
|
||||||
|
|
||||||
// Prefilters
|
// Prefilters
|
||||||
// 1) They are useful to introduce custom dataTypes (see transport/jsonp for an example)
|
// 1) They are useful to introduce custom dataTypes (see transport/jsonp for an example)
|
||||||
// 2) These are called:
|
// 2) These are called:
|
||||||
// * BEFORE asking for a transport
|
// * BEFORE asking for a transport
|
||||||
// * AFTER param serialization (s.data is a string if s.processData is true)
|
// * AFTER param serialization (s.data is a string if s.processData is true)
|
||||||
// 3) They MUST be order agnostic
|
// 3) key is the dataType
|
||||||
prefilters: [],
|
// 4) the catchall symbol "*" can be used
|
||||||
|
// 5) execution will start with transport dataType and THEN continue down to "*" if needed
|
||||||
|
prefilters: {},
|
||||||
|
|
||||||
// Transports bindings
|
// Transports bindings
|
||||||
// 1) key is the dataType
|
// 1) key is the dataType
|
||||||
// 2) the catchall symbol "*" can be used
|
// 2) the catchall symbol "*" can be used
|
||||||
// 3) selection will start with transport dataType and THEN go to "*" if needed
|
// 3) selection will start with transport dataType and THEN go to "*" if needed
|
||||||
transports: {
|
transports: {},
|
||||||
},
|
|
||||||
|
|
||||||
// Checkers
|
|
||||||
// 1) key is dataType
|
|
||||||
// 2) they are called to control successful response
|
|
||||||
// 3) error throws is used as error data
|
|
||||||
dataCheckers: {
|
|
||||||
|
|
||||||
// Check if data is a string
|
|
||||||
"text": function(data) {
|
|
||||||
if ( typeof data != "string" ) {
|
|
||||||
jQuery.error("typeerror");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Check if xml has been properly parsed
|
|
||||||
"xml": function(data) {
|
|
||||||
var documentElement = data ? data.documentElement : data;
|
|
||||||
if ( ! documentElement || ! documentElement.nodeName ) {
|
|
||||||
jQuery.error("typeerror");
|
|
||||||
}
|
|
||||||
if ( documentElement.nodeName == "parsererror" ) {
|
|
||||||
jQuery.error("parsererror");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// List of data converters
|
// List of data converters
|
||||||
// 1) key format is "source_type => destination_type" (spaces required)
|
// 1) key format is "source_type destination_type" (a single space in-between)
|
||||||
// 2) the catchall symbol "*" can be used for source_type
|
// 2) the catchall symbol "*" can be used for source_type
|
||||||
dataConverters: {
|
converters: {
|
||||||
|
|
||||||
// Convert anything to text
|
// Convert anything to text
|
||||||
"* => text": function(data) {
|
"* text": window.String,
|
||||||
return "" + data;
|
|
||||||
},
|
// Text to html (true = no transformation)
|
||||||
|
"text html": true,
|
||||||
// Text to html (no transformation)
|
|
||||||
"text => html": function(data) {
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Evaluate text as a json expression
|
// Evaluate text as a json expression
|
||||||
"text => json": jQuery.parseJSON,
|
"text json": jQuery.parseJSON,
|
||||||
|
|
||||||
// Parse text as xml
|
// Parse text as xml
|
||||||
"text => xml": function(data) {
|
"text xml": jQuery.parseXML
|
||||||
var xml, parser;
|
|
||||||
if ( window.DOMParser ) { // Standard
|
|
||||||
parser = new DOMParser();
|
|
||||||
xml = parser.parseFromString(data,"text/xml");
|
|
||||||
} else { // IE
|
|
||||||
xml = new ActiveXObject("Microsoft.XMLDOM");
|
|
||||||
xml.async="false";
|
|
||||||
xml.loadXML(data);
|
|
||||||
}
|
|
||||||
return xml;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// Main method
|
// Main method
|
||||||
ajax: function( url , s ) {
|
// (s is used internally)
|
||||||
|
ajax: function( url , options , s ) {
|
||||||
|
|
||||||
|
// Handle varargs
|
||||||
if ( arguments.length === 1 ) {
|
if ( arguments.length === 1 ) {
|
||||||
s = url;
|
options = url;
|
||||||
url = s ? s.url : undefined;
|
url = options ? options.url : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
return jQuery.xhr().open( s ? s.type : undefined , url ).send( undefined , s );
|
// Force options to be an object
|
||||||
|
options = options || {};
|
||||||
|
|
||||||
|
// Get the url if provided separately
|
||||||
|
options.url = url || options.url;
|
||||||
|
|
||||||
|
// Create the final options object
|
||||||
|
s = jQuery.extend( true , {} , jQuery.ajaxSettings , options );
|
||||||
|
|
||||||
|
// We force the original context
|
||||||
|
// (plain objects used as context get extended)
|
||||||
|
s.context = options.context;
|
||||||
|
|
||||||
|
var // jQuery lists
|
||||||
|
jQuery_lastModified = jQuery.lastModified,
|
||||||
|
jQuery_etag = jQuery.etag,
|
||||||
|
// Callbacks contexts
|
||||||
|
callbackContext = s.context || s,
|
||||||
|
globalEventContext = s.context ? jQuery( s.context ) : jQuery.event,
|
||||||
|
// Deferreds
|
||||||
|
deferred = jQuery.Deferred(),
|
||||||
|
completeDeferred = jQuery._Deferred(),
|
||||||
|
// Status-dependent callbacks
|
||||||
|
statusCode = s.statusCode || {},
|
||||||
|
// Headers (they are sent all at once)
|
||||||
|
requestHeaders = {},
|
||||||
|
// Response headers
|
||||||
|
responseHeadersString,
|
||||||
|
responseHeaders,
|
||||||
|
// transport
|
||||||
|
transport,
|
||||||
|
// timeout handle
|
||||||
|
timeoutTimer,
|
||||||
|
// Cross-domain detection vars
|
||||||
|
loc = document.location,
|
||||||
|
parts,
|
||||||
|
// The jXHR state
|
||||||
|
state = 0,
|
||||||
|
// Loop variable
|
||||||
|
i,
|
||||||
|
// Fake xhr
|
||||||
|
jXHR = {
|
||||||
|
|
||||||
|
readyState: 0,
|
||||||
|
|
||||||
|
// Caches the header
|
||||||
|
setRequestHeader: function(name,value) {
|
||||||
|
if ( state === 0 ) {
|
||||||
|
requestHeaders[ name.toLowerCase() ] = value;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Raw string
|
||||||
|
getAllResponseHeaders: function() {
|
||||||
|
return state === 2 ? responseHeadersString : null;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Builds headers hashtable if needed
|
||||||
|
// (match is used internally)
|
||||||
|
getResponseHeader: function( key , match ) {
|
||||||
|
|
||||||
|
if ( state !== 2 ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( responseHeaders === undefined ) {
|
||||||
|
|
||||||
|
responseHeaders = {};
|
||||||
|
|
||||||
|
if ( typeof responseHeadersString === "string" ) {
|
||||||
|
|
||||||
|
while( ( match = rheaders.exec( responseHeadersString ) ) ) {
|
||||||
|
responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return responseHeaders[ key.toLowerCase() ];
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cancel the request
|
||||||
|
abort: function( statusText ) {
|
||||||
|
if ( transport && state !== 2 ) {
|
||||||
|
transport.abort( statusText || "abort" );
|
||||||
|
done( 0 , statusText );
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Callback for when everything is done
|
||||||
|
// It is defined here because jslint complains if it is declared
|
||||||
|
// at the end of the function (which would be more logical and readable)
|
||||||
|
function done( status , statusText , response , headers) {
|
||||||
|
|
||||||
|
// Called once
|
||||||
|
if ( state === 2 ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// State is "done" now
|
||||||
|
state = 2;
|
||||||
|
|
||||||
|
// Set readyState
|
||||||
|
jXHR.readyState = status ? 4 : 0;
|
||||||
|
|
||||||
|
// Cache response headers
|
||||||
|
responseHeadersString = headers || "";
|
||||||
|
|
||||||
|
// Clear timeout if it exists
|
||||||
|
if ( timeoutTimer ) {
|
||||||
|
clearTimeout(timeoutTimer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var // Reference url
|
||||||
|
url = s.url,
|
||||||
|
// and ifModified status
|
||||||
|
ifModified = s.ifModified,
|
||||||
|
|
||||||
|
// Is it a success?
|
||||||
|
isSuccess = 0,
|
||||||
|
// Stored success
|
||||||
|
success,
|
||||||
|
// Stored error
|
||||||
|
error;
|
||||||
|
|
||||||
|
// If successful, handle type chaining
|
||||||
|
if ( status >= 200 && status < 300 || status === 304 ) {
|
||||||
|
|
||||||
|
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||||
|
if ( s.ifModified ) {
|
||||||
|
|
||||||
|
var lastModified = jXHR.getResponseHeader("Last-Modified"),
|
||||||
|
etag = jXHR.getResponseHeader("Etag");
|
||||||
|
|
||||||
|
if (lastModified) {
|
||||||
|
jQuery_lastModified[ s.url ] = lastModified;
|
||||||
|
}
|
||||||
|
if (etag) {
|
||||||
|
jQuery_etag[ s.url ] = etag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If not modified
|
||||||
|
if ( status === 304 ) {
|
||||||
|
|
||||||
|
// Set the statusText accordingly
|
||||||
|
statusText = "notmodified";
|
||||||
|
// Mark as a success
|
||||||
|
isSuccess = 1;
|
||||||
|
|
||||||
|
// If we have data
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Set the statusText accordingly
|
||||||
|
statusText = "success";
|
||||||
|
|
||||||
|
// Chain data conversions and determine the final value
|
||||||
|
// (if an exception is thrown in the process, it'll be notified as an error)
|
||||||
|
try {
|
||||||
|
|
||||||
|
var i,
|
||||||
|
// Current dataType
|
||||||
|
current,
|
||||||
|
// Previous dataType
|
||||||
|
prev,
|
||||||
|
// Conversion function
|
||||||
|
conv,
|
||||||
|
// Conversion functions (when text is used in-between)
|
||||||
|
conv1,
|
||||||
|
conv2,
|
||||||
|
// Local references to dataTypes & converters
|
||||||
|
dataTypes = s.dataTypes,
|
||||||
|
converters = s.converters,
|
||||||
|
// DataType to responseXXX field mapping
|
||||||
|
responses = {
|
||||||
|
"xml": "XML",
|
||||||
|
"text": "Text"
|
||||||
|
};
|
||||||
|
|
||||||
|
// For each dataType in the chain
|
||||||
|
for( i = 0 ; i < dataTypes.length ; i++ ) {
|
||||||
|
|
||||||
|
current = dataTypes[ i ];
|
||||||
|
|
||||||
|
// If a responseXXX field for this dataType exists
|
||||||
|
// and if it hasn't been set yet
|
||||||
|
if ( responses[ current ] ) {
|
||||||
|
// Set it
|
||||||
|
jXHR[ "response" + responses[ current ] ] = response;
|
||||||
|
// Mark it as set
|
||||||
|
responses[ current ] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this is not the first element
|
||||||
|
if ( i ) {
|
||||||
|
|
||||||
|
// Get the dataType to convert from
|
||||||
|
prev = dataTypes[ i - 1 ];
|
||||||
|
|
||||||
|
// If no catch-all and dataTypes are actually different
|
||||||
|
if ( prev !== "*" && current !== "*" && prev !== current ) {
|
||||||
|
|
||||||
|
// Get the converter
|
||||||
|
conv = converters[ prev + " " + current ] ||
|
||||||
|
converters[ "* " + current ];
|
||||||
|
|
||||||
|
conv1 = conv2 = 0;
|
||||||
|
|
||||||
|
// If there is no direct converter and none of the dataTypes is text
|
||||||
|
if ( ! conv && prev !== "text" && current !== "text" ) {
|
||||||
|
// Try with text in-between
|
||||||
|
conv1 = converters[ prev + " text" ] || converters[ "* text" ];
|
||||||
|
conv2 = converters[ "text " + current ];
|
||||||
|
// Revert back to a single converter
|
||||||
|
// if one of the converter is an equivalence
|
||||||
|
if ( conv1 === true ) {
|
||||||
|
conv = conv2;
|
||||||
|
} else if ( conv2 === true ) {
|
||||||
|
conv = conv1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If we found no converter, dispatch an error
|
||||||
|
if ( ! ( conv || conv1 && conv2 ) ) {
|
||||||
|
throw conversion;
|
||||||
|
}
|
||||||
|
// If found converter is not an equivalence
|
||||||
|
if ( conv !== true ) {
|
||||||
|
// Convert with 1 or 2 converters accordingly
|
||||||
|
response = conv ? conv( response ) : conv2( conv1( response ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If it is the first element of the chain
|
||||||
|
// and we have a dataFilter
|
||||||
|
} else if ( s.dataFilter ) {
|
||||||
|
// Apply the dataFilter
|
||||||
|
response = s.dataFilter( response , current );
|
||||||
|
// Get dataTypes again in case the filter changed them
|
||||||
|
dataTypes = s.dataTypes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// End of loop
|
||||||
|
|
||||||
|
// We have a real success
|
||||||
|
success = response;
|
||||||
|
isSuccess = 1;
|
||||||
|
|
||||||
|
// If an exception was thrown
|
||||||
|
} catch(e) {
|
||||||
|
|
||||||
|
// We have a parsererror
|
||||||
|
statusText = "parsererror";
|
||||||
|
error = "" + e;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if not success, mark it as an error
|
||||||
|
} else {
|
||||||
|
|
||||||
|
error = statusText = statusText || "error";
|
||||||
|
|
||||||
|
// Set responseText if needed
|
||||||
|
if ( response ) {
|
||||||
|
jXHR.responseText = response;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set data for the fake xhr object
|
||||||
|
jXHR.status = status;
|
||||||
|
jXHR.statusText = statusText;
|
||||||
|
|
||||||
|
// Success/Error
|
||||||
|
if ( isSuccess ) {
|
||||||
|
deferred.fire( callbackContext , [ success , statusText , jXHR ] );
|
||||||
|
} else {
|
||||||
|
deferred.fireReject( callbackContext , [ jXHR , statusText , error ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status-dependent callbacks
|
||||||
|
jXHR.statusCode( statusCode );
|
||||||
|
|
||||||
|
if ( s.global ) {
|
||||||
|
globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ) ,
|
||||||
|
[ jXHR , s , isSuccess ? success : error ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Complete
|
||||||
|
completeDeferred.fire( callbackContext, [ jXHR , statusText ] );
|
||||||
|
|
||||||
|
if ( s.global ) {
|
||||||
|
globalEventContext.trigger( "ajaxComplete" , [ jXHR , s] );
|
||||||
|
// Handle the global AJAX counter
|
||||||
|
if ( ! --jQuery.active ) {
|
||||||
|
jQuery.event.trigger( "ajaxStop" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attach deferreds
|
||||||
|
deferred.promise( jXHR );
|
||||||
|
jXHR.success = jXHR.done;
|
||||||
|
jXHR.error = jXHR.fail;
|
||||||
|
jXHR.complete = completeDeferred.done;
|
||||||
|
|
||||||
|
// Status-dependent callbacks
|
||||||
|
jXHR.statusCode = function( map ) {
|
||||||
|
if ( map ) {
|
||||||
|
var resolved = jXHR.isResolved(),
|
||||||
|
tmp;
|
||||||
|
if ( resolved || jXHR.isRejected() ) {
|
||||||
|
tmp = map[ jXHR.status ];
|
||||||
|
if ( tmp ) {
|
||||||
|
if ( map === statusCode ) {
|
||||||
|
delete statusCode[ jXHR.status ];
|
||||||
|
}
|
||||||
|
jXHR[ resolved ? "done" : "fail" ]( tmp );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for( tmp in map ) {
|
||||||
|
statusCode[ tmp ] = [ statusCode[ tmp ] , map[ tmp ] ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove hash character (#7531: and string promotion)
|
||||||
|
s.url = ( "" + s.url ).replace( rhash , "" );
|
||||||
|
|
||||||
|
// Uppercase the type
|
||||||
|
s.type = s.type.toUpperCase();
|
||||||
|
|
||||||
|
// Determine if request has content
|
||||||
|
s.hasContent = ! rnoContent.test( s.type );
|
||||||
|
|
||||||
|
// Extract dataTypes list
|
||||||
|
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( /\s+/ );
|
||||||
|
|
||||||
|
// Determine if a cross-domain request is in order
|
||||||
|
if ( ! s.crossDomain ) {
|
||||||
|
parts = rurl.exec( s.url.toLowerCase() );
|
||||||
|
s.crossDomain = !!(
|
||||||
|
parts &&
|
||||||
|
( parts[ 1 ] && parts[ 1 ] != loc.protocol ||
|
||||||
|
parts[ 2 ] != loc.hostname ||
|
||||||
|
( parts[ 3 ] || 80 ) != ( loc.port || 80 ) )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert data if not already a string
|
||||||
|
if ( s.data && s.processData && typeof s.data != "string" ) {
|
||||||
|
s.data = jQuery.param( s.data , s.traditional );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get transport
|
||||||
|
transport = jQuery.ajaxPrefilter( s , options ).ajaxTransport( s );
|
||||||
|
|
||||||
|
// Watch for a new set of requests
|
||||||
|
if ( s.global && jQuery.active++ === 0 ) {
|
||||||
|
jQuery.event.trigger( "ajaxStart" );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no transport, we auto-abort
|
||||||
|
if ( ! transport ) {
|
||||||
|
|
||||||
|
done( 0 , "transport not found" );
|
||||||
|
jXHR = false;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// More options handling for requests with no content
|
||||||
|
if ( ! s.hasContent ) {
|
||||||
|
|
||||||
|
// If data is available, append data to url
|
||||||
|
if ( s.data ) {
|
||||||
|
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add anti-cache in url if needed
|
||||||
|
if ( s.cache === false ) {
|
||||||
|
|
||||||
|
var ts = jQuery.now(),
|
||||||
|
// try replacing _= if it is there
|
||||||
|
ret = s.url.replace( rts , "$1_=" + ts );
|
||||||
|
|
||||||
|
// if nothing was replaced, add timestamp to the end
|
||||||
|
s.url = ret + ( (ret == s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the correct header, if data is being sent
|
||||||
|
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
|
||||||
|
requestHeaders[ "content-type" ] = s.contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
||||||
|
if ( s.ifModified ) {
|
||||||
|
if ( jQuery_lastModified[ s.url ] ) {
|
||||||
|
requestHeaders[ "if-modified-since" ] = jQuery_lastModified[ s.url ];
|
||||||
|
}
|
||||||
|
if ( jQuery_etag[ s.url ] ) {
|
||||||
|
requestHeaders[ "if-none-match" ] = jQuery_etag[ s.url ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the Accepts header for the server, depending on the dataType
|
||||||
|
requestHeaders.accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
|
||||||
|
s.accepts[ s.dataTypes[ 0 ] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
|
||||||
|
s.accepts[ "*" ];
|
||||||
|
|
||||||
|
// Check for headers option
|
||||||
|
for ( i in s.headers ) {
|
||||||
|
requestHeaders[ i.toLowerCase() ] = s.headers[ i ];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow custom headers/mimetypes and early abort
|
||||||
|
if ( s.beforeSend && ( s.beforeSend.call( callbackContext , jXHR , s ) === false || state === 2 ) ) {
|
||||||
|
|
||||||
|
// Abort if not done already
|
||||||
|
done( 0 , "abort" );
|
||||||
|
jXHR = false;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// Set state as sending
|
||||||
|
state = 1;
|
||||||
|
jXHR.readyState = 1;
|
||||||
|
|
||||||
|
// Install callbacks on deferreds
|
||||||
|
for ( i in { success:1, error:1, complete:1 } ) {
|
||||||
|
jXHR[ i ]( s[ i ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send global event
|
||||||
|
if ( s.global ) {
|
||||||
|
globalEventContext.trigger( "ajaxSend" , [ jXHR , s ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Timeout
|
||||||
|
if ( s.async && s.timeout > 0 ) {
|
||||||
|
timeoutTimer = setTimeout(function(){
|
||||||
|
jXHR.abort( "timeout" );
|
||||||
|
}, s.timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to send
|
||||||
|
try {
|
||||||
|
transport.send(requestHeaders, done);
|
||||||
|
} catch (e) {
|
||||||
|
// Propagate exception as error if not done
|
||||||
|
if ( status === 1 ) {
|
||||||
|
|
||||||
|
done(0, "error", "" + e);
|
||||||
|
jXHR = false;
|
||||||
|
|
||||||
|
// Simply rethrow otherwise
|
||||||
|
} else {
|
||||||
|
jQuery.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jXHR;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Serialize an array of form elements or a set of
|
// Serialize an array of form elements or a set of
|
||||||
|
@ -296,19 +720,19 @@ jQuery.extend({
|
||||||
value = jQuery.isFunction(value) ? value() : value;
|
value = jQuery.isFunction(value) ? value() : value;
|
||||||
s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
|
s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set traditional to true for jQuery <= 1.3.2 behavior.
|
// Set traditional to true for jQuery <= 1.3.2 behavior.
|
||||||
if ( traditional === undefined ) {
|
if ( traditional === undefined ) {
|
||||||
traditional = jQuery.ajaxSettings.traditional;
|
traditional = jQuery.ajaxSettings.traditional;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If an array was passed in, assume that it is an array of form elements.
|
// If an array was passed in, assume that it is an array of form elements.
|
||||||
if ( jQuery.isArray(a) || a.jquery ) {
|
if ( jQuery.isArray(a) || a.jquery ) {
|
||||||
// Serialize the form elements
|
// Serialize the form elements
|
||||||
jQuery.each( a, function() {
|
jQuery.each( a, function() {
|
||||||
add( this.name, this.value );
|
add( this.name, this.value );
|
||||||
});
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// If traditional, encode the "old" way (the way 1.3.2 or older
|
// If traditional, encode the "old" way (the way 1.3.2 or older
|
||||||
// did it), otherwise encode params recursively.
|
// did it), otherwise encode params recursively.
|
||||||
|
@ -341,9 +765,11 @@ function buildParams( prefix, obj, traditional, add ) {
|
||||||
buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
|
buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
} else if ( !traditional && obj != null && typeof obj === "object" ) {
|
} else if ( !traditional && obj != null && typeof obj === "object" ) {
|
||||||
if ( jQuery.isEmptyObject( obj ) ) {
|
// If we see an array here, it is empty and should be treated as an empty
|
||||||
|
// object
|
||||||
|
if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
|
||||||
add( prefix, "" );
|
add( prefix, "" );
|
||||||
|
|
||||||
// Serialize object item.
|
// Serialize object item.
|
||||||
|
@ -352,7 +778,7 @@ function buildParams( prefix, obj, traditional, add ) {
|
||||||
buildParams( prefix + "[" + k + "]", v, traditional, add );
|
buildParams( prefix + "[" + k + "]", v, traditional, add );
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Serialize scalar item.
|
// Serialize scalar item.
|
||||||
add( prefix, obj );
|
add( prefix, obj );
|
||||||
|
@ -372,6 +798,172 @@ jQuery.extend({
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//Execute or select from functions in a given structure of options
|
||||||
|
function ajax_selectOrExecute( structure , s ) {
|
||||||
|
|
||||||
|
var dataTypes = s.dataTypes,
|
||||||
|
transportDataType,
|
||||||
|
list,
|
||||||
|
selected,
|
||||||
|
i,
|
||||||
|
length,
|
||||||
|
checked = {},
|
||||||
|
flag,
|
||||||
|
noSelect = structure !== "transports";
|
||||||
|
|
||||||
|
function initSearch( dataType ) {
|
||||||
|
|
||||||
|
flag = transportDataType !== dataType && ! checked[ dataType ];
|
||||||
|
|
||||||
|
if ( flag ) {
|
||||||
|
|
||||||
|
checked[ dataType ] = 1;
|
||||||
|
transportDataType = dataType;
|
||||||
|
list = s[ structure ][ dataType ];
|
||||||
|
i = -1;
|
||||||
|
length = list ? list.length : 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
initSearch( dataTypes[ 0 ] );
|
||||||
|
|
||||||
|
for ( i = 0 ; ( noSelect || ! selected ) && i <= length ; i++ ) {
|
||||||
|
|
||||||
|
if ( i === length ) {
|
||||||
|
|
||||||
|
initSearch( "*" );
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
selected = list[ i ]( s , determineDataType );
|
||||||
|
|
||||||
|
// If we got redirected to another dataType
|
||||||
|
// Search there (if not in progress or already tried)
|
||||||
|
if ( typeof( selected ) === "string" &&
|
||||||
|
initSearch( selected ) ) {
|
||||||
|
|
||||||
|
dataTypes.unshift( selected );
|
||||||
|
selected = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return noSelect ? jQuery : selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add an element to one of the structures in ajaxSettings
|
||||||
|
function ajax_addElement( structure , args ) {
|
||||||
|
|
||||||
|
var i,
|
||||||
|
start = 0,
|
||||||
|
length = args.length,
|
||||||
|
dataTypes = [ "*" ],
|
||||||
|
dLength = 1,
|
||||||
|
dataType,
|
||||||
|
functors = [],
|
||||||
|
first,
|
||||||
|
append,
|
||||||
|
list;
|
||||||
|
|
||||||
|
if ( length ) {
|
||||||
|
|
||||||
|
first = jQuery.type( args[ 0 ] );
|
||||||
|
|
||||||
|
if ( first === "object" ) {
|
||||||
|
return ajax_selectOrExecute( structure , args[ 0 ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
structure = jQuery.ajaxSettings[ structure ];
|
||||||
|
|
||||||
|
if ( first !== "function" ) {
|
||||||
|
|
||||||
|
dataTypes = args[ 0 ].toLowerCase().split(/\s+/);
|
||||||
|
dLength = dataTypes.length;
|
||||||
|
start = 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( dLength && start < length ) {
|
||||||
|
|
||||||
|
functors = sliceFunc.call( args , start );
|
||||||
|
|
||||||
|
for( i = 0 ; i < dLength ; i++ ) {
|
||||||
|
|
||||||
|
dataType = dataTypes[ i ];
|
||||||
|
|
||||||
|
first = /^\+/.test( dataType );
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
dataType = dataType.substr(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( dataType !== "" ) {
|
||||||
|
|
||||||
|
append = Array.prototype[ first ? "unshift" : "push" ];
|
||||||
|
list = structure[ dataType ] = structure[ dataType ] || [];
|
||||||
|
append.apply( list , functors );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return jQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Install prefilter & transport methods
|
||||||
|
jQuery.each( [ "Prefilter" , "Transport" ] , function( _ , name ) {
|
||||||
|
_ = name.toLowerCase() + "s";
|
||||||
|
jQuery[ "ajax" + name ] = function() {
|
||||||
|
return ajax_addElement( _ , arguments );
|
||||||
|
};
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Utility function that handles dataType when response is received
|
||||||
|
// (for those transports that can give text or xml responses)
|
||||||
|
function determineDataType( s , ct , text , xml ) {
|
||||||
|
|
||||||
|
var contents = s.contents,
|
||||||
|
type,
|
||||||
|
regexp,
|
||||||
|
dataTypes = s.dataTypes,
|
||||||
|
transportDataType = dataTypes[0],
|
||||||
|
response;
|
||||||
|
|
||||||
|
// Auto (xml, json, script or text determined given headers)
|
||||||
|
if ( transportDataType === "*" ) {
|
||||||
|
|
||||||
|
for ( type in contents ) {
|
||||||
|
if ( ( regexp = contents[ type ] ) && regexp.test( ct ) ) {
|
||||||
|
transportDataType = dataTypes[0] = type;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// xml and parsed as such
|
||||||
|
if ( transportDataType === "xml" &&
|
||||||
|
xml &&
|
||||||
|
xml.documentElement /* #4958 */ ) {
|
||||||
|
|
||||||
|
response = xml;
|
||||||
|
|
||||||
|
// Text response was provided
|
||||||
|
} else {
|
||||||
|
|
||||||
|
response = text;
|
||||||
|
|
||||||
|
// If it's not really text, defer to converters
|
||||||
|
if ( transportDataType !== "text" ) {
|
||||||
|
dataTypes.unshift( "text" );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create the request object; Microsoft failed to properly
|
* Create the request object; Microsoft failed to properly
|
||||||
* implement the XMLHttpRequest in IE7 (can't request local files),
|
* implement the XMLHttpRequest in IE7 (can't request local files),
|
||||||
|
@ -386,7 +978,7 @@ if ( window.ActiveXObject ) {
|
||||||
return new window.XMLHttpRequest();
|
return new window.XMLHttpRequest();
|
||||||
} catch( xhrError ) {}
|
} catch( xhrError ) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return new window.ActiveXObject("Microsoft.XMLHTTP");
|
return new window.ActiveXObject("Microsoft.XMLHTTP");
|
||||||
} catch( activeError ) {}
|
} catch( activeError ) {}
|
||||||
|
|
83
src/ajax/jsonp.js
Normal file
83
src/ajax/jsonp.js
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
(function( jQuery ) {
|
||||||
|
|
||||||
|
var jsc = jQuery.now(),
|
||||||
|
jsre = /(\=)(?:\?|%3F)(&|$)|()(?:\?\?|%3F%3F)()/i,
|
||||||
|
rquery_jsonp = /\?/;
|
||||||
|
|
||||||
|
// Default jsonp settings
|
||||||
|
jQuery.ajaxSetup({
|
||||||
|
jsonp: "callback",
|
||||||
|
jsonpCallback: function() {
|
||||||
|
return "jsonp" + jsc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normalize jsonp queries
|
||||||
|
// 1) put callback parameter in url or data
|
||||||
|
// 2) sneakily ensure transportDataType is always jsonp for jsonp requests
|
||||||
|
}).ajaxPrefilter("json jsonp", function(s, originalSettings) {
|
||||||
|
|
||||||
|
if ( s.dataTypes[ 0 ] === "jsonp" ||
|
||||||
|
originalSettings.jsonp ||
|
||||||
|
originalSettings.jsonpCallback ||
|
||||||
|
jsre.test(s.url) ||
|
||||||
|
typeof(s.data) === "string" && jsre.test(s.data) ) {
|
||||||
|
|
||||||
|
var jsonpCallback = s.jsonpCallback =
|
||||||
|
jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
|
||||||
|
url = s.url.replace(jsre, "$1" + jsonpCallback + "$2"),
|
||||||
|
data = s.url === url && typeof(s.data) === "string" ? s.data.replace(jsre, "$1" + jsonpCallback + "$2") : s.data;
|
||||||
|
|
||||||
|
if ( url === s.url && data === s.data ) {
|
||||||
|
url += (rquery_jsonp.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
s.url = url;
|
||||||
|
s.data = data;
|
||||||
|
s.dataTypes[ 0 ] = "jsonp";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bind transport to jsonp dataType
|
||||||
|
}).ajaxTransport("jsonp", function(s) {
|
||||||
|
|
||||||
|
// Put callback in place
|
||||||
|
var responseContainer,
|
||||||
|
jsonpCallback = s.jsonpCallback,
|
||||||
|
previous = window[ jsonpCallback ];
|
||||||
|
|
||||||
|
window [ jsonpCallback ] = function( response ) {
|
||||||
|
responseContainer = [response];
|
||||||
|
};
|
||||||
|
|
||||||
|
s.complete = [function() {
|
||||||
|
|
||||||
|
// Set callback back to previous value
|
||||||
|
window[ jsonpCallback ] = previous;
|
||||||
|
|
||||||
|
// Call if it was a function and we have a response
|
||||||
|
if ( previous) {
|
||||||
|
if ( responseContainer && jQuery.isFunction ( previous ) ) {
|
||||||
|
window[ jsonpCallback ] ( responseContainer[0] );
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// else, more memory leak avoidance
|
||||||
|
try{ delete window[ jsonpCallback ]; } catch(e){}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, s.complete ];
|
||||||
|
|
||||||
|
// Sneakily ensure this will be handled as json
|
||||||
|
s.dataTypes[ 0 ] = "json";
|
||||||
|
|
||||||
|
// Use data converter to retrieve json after script execution
|
||||||
|
s.converters["script json"] = function() {
|
||||||
|
if ( ! responseContainer ) {
|
||||||
|
jQuery.error( jsonpCallback + " was not called" );
|
||||||
|
}
|
||||||
|
return responseContainer[ 0 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Delegate to script transport
|
||||||
|
return "script";
|
||||||
|
});
|
||||||
|
|
||||||
|
})( jQuery );
|
|
@ -1,39 +1,38 @@
|
||||||
(function( jQuery ) {
|
(function( jQuery ) {
|
||||||
|
|
||||||
// Install text to script executor
|
// Install script dataType
|
||||||
jQuery.extend( true, jQuery.ajaxSettings , {
|
jQuery.ajaxSetup({
|
||||||
|
|
||||||
accepts: {
|
accepts: {
|
||||||
script: "text/javascript, application/javascript"
|
script: "text/javascript, application/javascript"
|
||||||
},
|
},
|
||||||
|
|
||||||
autoDataType: {
|
contents: {
|
||||||
script: /javascript/
|
script: /javascript/
|
||||||
},
|
},
|
||||||
|
|
||||||
dataConverters: {
|
converters: {
|
||||||
"text => script": jQuery.globalEval
|
"text script": jQuery.globalEval
|
||||||
}
|
}
|
||||||
} );
|
|
||||||
|
|
||||||
// Bind script tag hack transport
|
// Bind script tag hack transport
|
||||||
jQuery.xhr.bindTransport("script", function(s) {
|
}).ajaxTransport("script", function(s) {
|
||||||
|
|
||||||
// Handle cache special case
|
// Handle cache special case
|
||||||
if ( s.cache === undefined ) {
|
if ( s.cache === undefined ) {
|
||||||
s.cache = false;
|
s.cache = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This transport only deals with cross domain get requests
|
// This transport only deals with cross domain get requests
|
||||||
if ( s.crossDomain && s.async && ( s.type === "GET" || ! s.data ) ) {
|
if ( s.crossDomain && s.async && ( s.type === "GET" || ! s.data ) ) {
|
||||||
|
|
||||||
s.global = false;
|
s.global = false;
|
||||||
|
|
||||||
var script,
|
var script,
|
||||||
head = document.getElementsByTagName("head")[0] || document.documentElement;
|
head = document.getElementsByTagName("head")[0] || document.documentElement;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
||||||
send: function(_, callback) {
|
send: function(_, callback) {
|
||||||
|
|
||||||
script = document.createElement("script");
|
script = document.createElement("script");
|
||||||
|
@ -43,37 +42,39 @@ jQuery.xhr.bindTransport("script", function(s) {
|
||||||
if ( s.scriptCharset ) {
|
if ( s.scriptCharset ) {
|
||||||
script.charset = s.scriptCharset;
|
script.charset = s.scriptCharset;
|
||||||
}
|
}
|
||||||
|
|
||||||
script.src = s.url;
|
script.src = s.url;
|
||||||
|
|
||||||
// Attach handlers for all browsers
|
// Attach handlers for all browsers
|
||||||
script.onload = script.onreadystatechange = function(statusText) {
|
script.onload = script.onreadystatechange = function( _ , isAbort ) {
|
||||||
|
|
||||||
if ( (!script.readyState ||
|
if ( ! script.readyState || /loaded|complete/.test( script.readyState ) ) {
|
||||||
script.readyState === "loaded" || script.readyState === "complete") ) {
|
|
||||||
|
|
||||||
// Handle memory leak in IE
|
// Handle memory leak in IE
|
||||||
script.onload = script.onreadystatechange = null;
|
script.onload = script.onreadystatechange = null;
|
||||||
|
|
||||||
// Remove the script
|
// Remove the script
|
||||||
if ( head && script.parentNode ) {
|
if ( head && script.parentNode ) {
|
||||||
head.removeChild( script );
|
head.removeChild( script );
|
||||||
}
|
}
|
||||||
|
|
||||||
script = undefined;
|
// Dereference the script
|
||||||
|
script = 0;
|
||||||
// Callback & dereference
|
|
||||||
callback(statusText ? 0 : 200, statusText || "success");
|
// Callback if not abort
|
||||||
|
if ( ! isAbort ) {
|
||||||
|
callback( 200, "success" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
|
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
|
||||||
// This arises when a base node is used (#2709 and #4378).
|
// This arises when a base node is used (#2709 and #4378).
|
||||||
head.insertBefore( script, head.firstChild );
|
head.insertBefore( script, head.firstChild );
|
||||||
},
|
},
|
||||||
|
|
||||||
abort: function(statusText) {
|
abort: function() {
|
||||||
if ( script ) {
|
if ( script ) {
|
||||||
script.onload(statusText);
|
script.onload(0,1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
|
@ -1,29 +1,47 @@
|
||||||
(function( jQuery ) {
|
(function( jQuery ) {
|
||||||
|
|
||||||
var // Next fake timer id
|
var // Next active xhr id
|
||||||
xhrPollingId = jQuery.now(),
|
xhrId = jQuery.now(),
|
||||||
|
|
||||||
// Callbacks hashtable
|
// active xhrs
|
||||||
xhrs = {},
|
xhrs = {},
|
||||||
|
|
||||||
// #5280: see end of file
|
// #5280: see below
|
||||||
xhrUnloadAbortMarker = [];
|
xhrUnloadAbortInstalled;
|
||||||
|
|
||||||
|
|
||||||
|
jQuery.ajaxTransport( function( s , determineDataType ) {
|
||||||
|
|
||||||
|
|
||||||
jQuery.xhr.bindTransport( function( s , determineDataType ) {
|
|
||||||
|
|
||||||
// Cross domain only allowed if supported through XMLHttpRequest
|
// Cross domain only allowed if supported through XMLHttpRequest
|
||||||
if ( ! s.crossDomain || jQuery.support.cors ) {
|
if ( ! s.crossDomain || jQuery.support.cors ) {
|
||||||
|
|
||||||
var callback;
|
var callback;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
||||||
send: function(headers, complete) {
|
send: function(headers, complete) {
|
||||||
|
|
||||||
|
// #5280: we need to abort on unload or IE will keep connections alive
|
||||||
|
if ( ! xhrUnloadAbortInstalled ) {
|
||||||
|
|
||||||
|
xhrUnloadAbortInstalled = 1;
|
||||||
|
|
||||||
|
jQuery(window).bind( "unload" , function() {
|
||||||
|
|
||||||
|
// Abort all pending requests
|
||||||
|
jQuery.each(xhrs, function(_, xhr) {
|
||||||
|
if ( xhr.onreadystatechange ) {
|
||||||
|
xhr.onreadystatechange( 1 );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a new xhr
|
||||||
var xhr = s.xhr(),
|
var xhr = s.xhr(),
|
||||||
handle;
|
handle;
|
||||||
|
|
||||||
// Open the socket
|
// Open the socket
|
||||||
// Passing null username, generates a login popup on Opera (#2865)
|
// Passing null username, generates a login popup on Opera (#2865)
|
||||||
if ( s.username ) {
|
if ( s.username ) {
|
||||||
|
@ -31,24 +49,24 @@ jQuery.xhr.bindTransport( function( s , determineDataType ) {
|
||||||
} else {
|
} else {
|
||||||
xhr.open(s.type, s.url, s.async);
|
xhr.open(s.type, s.url, s.async);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Requested-With header
|
// Requested-With header
|
||||||
// Not set for crossDomain requests with no content
|
// Not set for crossDomain requests with no content
|
||||||
// (see why at http://trac.dojotoolkit.org/ticket/9486)
|
// (see why at http://trac.dojotoolkit.org/ticket/9486)
|
||||||
// Won't change header if already provided in beforeSend
|
// Won't change header if already provided
|
||||||
if ( ! ( s.crossDomain && ! s.hasContent ) && ! headers["x-requested-with"] ) {
|
if ( ! ( s.crossDomain && ! s.hasContent ) && ! headers["x-requested-with"] ) {
|
||||||
headers["x-requested-with"] = "XMLHttpRequest";
|
headers["x-requested-with"] = "XMLHttpRequest";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need an extra try/catch for cross domain requests in Firefox 3
|
// Need an extra try/catch for cross domain requests in Firefox 3
|
||||||
try {
|
try {
|
||||||
|
|
||||||
jQuery.each(headers, function(key,value) {
|
jQuery.each(headers, function(key,value) {
|
||||||
xhr.setRequestHeader(key,value);
|
xhr.setRequestHeader(key,value);
|
||||||
});
|
});
|
||||||
|
|
||||||
} catch(_) {}
|
} catch(_) {}
|
||||||
|
|
||||||
// Do send the request
|
// Do send the request
|
||||||
try {
|
try {
|
||||||
xhr.send( ( s.hasContent && s.data ) || null );
|
xhr.send( ( s.hasContent && s.data ) || null );
|
||||||
|
@ -56,55 +74,48 @@ jQuery.xhr.bindTransport( function( s , determineDataType ) {
|
||||||
complete(0, "error", "" + e);
|
complete(0, "error", "" + e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listener
|
// Listener
|
||||||
callback = function ( abortStatusText ) {
|
callback = function( _ , isAbort ) {
|
||||||
|
|
||||||
// Was never called and is aborted or complete
|
// Was never called and is aborted or complete
|
||||||
if ( callback && ( abortStatusText || xhr.readyState === 4 ) ) {
|
if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
|
||||||
|
|
||||||
// Do not listen anymore
|
// Only called once
|
||||||
|
callback = 0;
|
||||||
|
|
||||||
|
// Do not keep as active anymore
|
||||||
|
// and store back into pool
|
||||||
if (handle) {
|
if (handle) {
|
||||||
xhr.onreadystatechange = jQuery.noop;
|
xhr.onreadystatechange = jQuery.noop;
|
||||||
delete xhrs[ handle ];
|
delete xhrs[ handle ];
|
||||||
handle = undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
callback = 0;
|
// If it's an abort
|
||||||
|
if ( isAbort ) {
|
||||||
// Get info
|
|
||||||
var status, statusText, response, responseHeaders;
|
// Abort it manually if needed
|
||||||
|
|
||||||
if ( abortStatusText ) {
|
|
||||||
|
|
||||||
if ( xhr.readyState !== 4 ) {
|
if ( xhr.readyState !== 4 ) {
|
||||||
xhr.abort();
|
xhr.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stop here if unloadAbort
|
|
||||||
if ( abortStatusText === xhrUnloadAbortMarker ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = 0;
|
|
||||||
statusText = abortStatusText;
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
status = xhr.status;
|
// Get info
|
||||||
|
var status = xhr.status,
|
||||||
|
statusText,
|
||||||
|
response,
|
||||||
|
responseHeaders = xhr.getAllResponseHeaders();
|
||||||
|
|
||||||
try { // Firefox throws an exception when accessing statusText for faulty cross-domain requests
|
try { // Firefox throws an exception when accessing statusText for faulty cross-domain requests
|
||||||
|
|
||||||
statusText = xhr.statusText;
|
statusText = xhr.statusText;
|
||||||
|
|
||||||
} catch( e ) {
|
} catch( e ) {
|
||||||
|
|
||||||
statusText = ""; // We normalize with Webkit giving an empty statusText
|
statusText = ""; // We normalize with Webkit giving an empty statusText
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
responseHeaders = xhr.getAllResponseHeaders();
|
|
||||||
|
|
||||||
// Filter status for non standard behaviours
|
// Filter status for non standard behaviours
|
||||||
// (so many they seem to be the actual "standard")
|
// (so many they seem to be the actual "standard")
|
||||||
status =
|
status =
|
||||||
|
@ -129,63 +140,44 @@ jQuery.xhr.bindTransport( function( s , determineDataType ) {
|
||||||
:
|
:
|
||||||
status
|
status
|
||||||
);
|
);
|
||||||
|
|
||||||
// Guess response if needed & update datatype accordingly
|
// Guess response & update dataType accordingly
|
||||||
if ( status >= 200 && status < 300 ) {
|
response =
|
||||||
response =
|
determineDataType(
|
||||||
determineDataType(
|
s,
|
||||||
s,
|
xhr.getResponseHeader("content-type"),
|
||||||
xhr.getResponseHeader("content-type"),
|
xhr.responseText,
|
||||||
xhr.responseText,
|
xhr.responseXML );
|
||||||
xhr.responseXML );
|
|
||||||
}
|
// Call complete
|
||||||
|
complete(status,statusText,response,responseHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call complete
|
|
||||||
complete(status,statusText,response,responseHeaders);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// if we're in sync mode
|
// if we're in sync mode
|
||||||
// or it's in cache and has been retrieved directly (IE6 & IE7)
|
// or it's in cache and has been retrieved directly (IE6 & IE7)
|
||||||
// we need to manually fire the callback
|
// we need to manually fire the callback
|
||||||
if ( ! s.async || xhr.readyState === 4 ) {
|
if ( ! s.async || xhr.readyState === 4 ) {
|
||||||
|
|
||||||
callback();
|
callback();
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Listener is externalized to handle abort on unload
|
// Add to list of active xhrs
|
||||||
handle = xhrPollingId++;
|
handle = xhrId++;
|
||||||
xhrs[ handle ] = xhr;
|
xhrs[ handle ] = xhr;
|
||||||
xhr.onreadystatechange = function() {
|
xhr.onreadystatechange = callback;
|
||||||
callback();
|
}
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
abort: function(statusText) {
|
abort: function() {
|
||||||
if ( callback ) {
|
if ( callback ) {
|
||||||
callback(statusText);
|
callback(0,1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// #5280: we need to abort on unload or IE will keep connections alive
|
|
||||||
jQuery(window).bind( "unload" , function() {
|
|
||||||
|
|
||||||
// Abort all pending requests
|
|
||||||
jQuery.each(xhrs, function(_, xhr) {
|
|
||||||
if ( xhr.onreadystatechange ) {
|
|
||||||
xhr.onreadystatechange( xhrUnloadAbortMarker );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Resest polling structure to be safe
|
|
||||||
xhrs = {};
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
})( jQuery );
|
})( jQuery );
|
|
@ -182,7 +182,7 @@ jQuery.fn.extend({
|
||||||
var option = options[ i ];
|
var option = options[ i ];
|
||||||
|
|
||||||
// Don't return options that are disabled or in a disabled optgroup
|
// Don't return options that are disabled or in a disabled optgroup
|
||||||
if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
|
if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
|
||||||
(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
|
(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
|
||||||
|
|
||||||
// Get the specific value for the option
|
// Get the specific value for the option
|
||||||
|
|
268
src/core.js
268
src/core.js
|
@ -56,12 +56,12 @@ var jQuery = function( selector, context ) {
|
||||||
|
|
||||||
// For matching the engine and version of the browser
|
// For matching the engine and version of the browser
|
||||||
browserMatch,
|
browserMatch,
|
||||||
|
|
||||||
// Has the ready events already been bound?
|
// Has the ready events already been bound?
|
||||||
readyBound = false,
|
readyBound = false,
|
||||||
|
|
||||||
// The functions to execute on DOM ready
|
// The deferred used on DOM ready
|
||||||
readyList = [],
|
readyList,
|
||||||
|
|
||||||
// The ready event handler
|
// The ready event handler
|
||||||
DOMContentLoaded,
|
DOMContentLoaded,
|
||||||
|
@ -73,7 +73,7 @@ var jQuery = function( selector, context ) {
|
||||||
slice = Array.prototype.slice,
|
slice = Array.prototype.slice,
|
||||||
trim = String.prototype.trim,
|
trim = String.prototype.trim,
|
||||||
indexOf = Array.prototype.indexOf,
|
indexOf = Array.prototype.indexOf,
|
||||||
|
|
||||||
// [[Class]] -> type pairs
|
// [[Class]] -> type pairs
|
||||||
class2type = {};
|
class2type = {};
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ jQuery.fn = jQuery.prototype = {
|
||||||
this.length = 1;
|
this.length = 1;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The body element only exists once, optimize finding it
|
// The body element only exists once, optimize finding it
|
||||||
if ( selector === "body" && !context && document.body ) {
|
if ( selector === "body" && !context && document.body ) {
|
||||||
this.context = document;
|
this.context = document;
|
||||||
|
@ -129,11 +129,11 @@ jQuery.fn = jQuery.prototype = {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
|
ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
|
||||||
selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
|
selector = (ret.cacheable ? jQuery(ret.fragment).clone()[0] : ret.fragment).childNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
return jQuery.merge( this, selector );
|
return jQuery.merge( this, selector );
|
||||||
|
|
||||||
// HANDLE: $("#id")
|
// HANDLE: $("#id")
|
||||||
} else {
|
} else {
|
||||||
elem = document.getElementById( match[2] );
|
elem = document.getElementById( match[2] );
|
||||||
|
@ -226,7 +226,7 @@ jQuery.fn = jQuery.prototype = {
|
||||||
|
|
||||||
if ( jQuery.isArray( elems ) ) {
|
if ( jQuery.isArray( elems ) ) {
|
||||||
push.apply( ret, elems );
|
push.apply( ret, elems );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
jQuery.merge( ret, elems );
|
jQuery.merge( ret, elems );
|
||||||
}
|
}
|
||||||
|
@ -252,25 +252,15 @@ jQuery.fn = jQuery.prototype = {
|
||||||
each: function( callback, args ) {
|
each: function( callback, args ) {
|
||||||
return jQuery.each( this, callback, args );
|
return jQuery.each( this, callback, args );
|
||||||
},
|
},
|
||||||
|
|
||||||
ready: function( fn ) {
|
ready: function() {
|
||||||
// Attach the listeners
|
// Attach the listeners
|
||||||
jQuery.bindReady();
|
jQuery.bindReady();
|
||||||
|
|
||||||
// If the DOM is already ready
|
// Change ready & apply
|
||||||
if ( jQuery.isReady ) {
|
return ( jQuery.fn.ready = readyList.done ).apply( this , arguments );
|
||||||
// Execute the function immediately
|
|
||||||
fn.call( document, jQuery );
|
|
||||||
|
|
||||||
// Otherwise, remember the function for later
|
|
||||||
} else if ( readyList ) {
|
|
||||||
// Add the function to the wait list
|
|
||||||
readyList.push( fn );
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
eq: function( i ) {
|
eq: function( i ) {
|
||||||
return i === -1 ?
|
return i === -1 ?
|
||||||
this.slice( i ) :
|
this.slice( i ) :
|
||||||
|
@ -295,7 +285,7 @@ jQuery.fn = jQuery.prototype = {
|
||||||
return callback.call( elem, i, elem );
|
return callback.call( elem, i, elem );
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
end: function() {
|
end: function() {
|
||||||
return this.prevObject || jQuery(null);
|
return this.prevObject || jQuery(null);
|
||||||
},
|
},
|
||||||
|
@ -384,14 +374,14 @@ jQuery.extend({
|
||||||
|
|
||||||
return jQuery;
|
return jQuery;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Is the DOM ready to be used? Set to true once it occurs.
|
// Is the DOM ready to be used? Set to true once it occurs.
|
||||||
isReady: false,
|
isReady: false,
|
||||||
|
|
||||||
// A counter to track how many items to wait for before
|
// A counter to track how many items to wait for before
|
||||||
// the ready event fires. See #6781
|
// the ready event fires. See #6781
|
||||||
readyWait: 1,
|
readyWait: 1,
|
||||||
|
|
||||||
// Handle when the DOM is ready
|
// Handle when the DOM is ready
|
||||||
ready: function( wait ) {
|
ready: function( wait ) {
|
||||||
// A third-party is pushing the ready event forwards
|
// A third-party is pushing the ready event forwards
|
||||||
|
@ -415,27 +405,15 @@ jQuery.extend({
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are functions bound, to execute
|
// If there are functions bound, to execute
|
||||||
if ( readyList ) {
|
readyList.fire( document , [ jQuery ] );
|
||||||
// Execute all of them
|
|
||||||
var fn,
|
|
||||||
i = 0,
|
|
||||||
ready = readyList;
|
|
||||||
|
|
||||||
// Reset the list of functions
|
// Trigger any bound ready events
|
||||||
readyList = null;
|
if ( jQuery.fn.trigger ) {
|
||||||
|
jQuery( document ).trigger( "ready" ).unbind( "ready" );
|
||||||
while ( (fn = ready[ i++ ]) ) {
|
|
||||||
fn.call( document, jQuery );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trigger any bound ready events
|
|
||||||
if ( jQuery.fn.trigger ) {
|
|
||||||
jQuery( document ).trigger( "ready" ).unbind( "ready" );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
bindReady: function() {
|
bindReady: function() {
|
||||||
if ( readyBound ) {
|
if ( readyBound ) {
|
||||||
return;
|
return;
|
||||||
|
@ -454,7 +432,7 @@ jQuery.extend({
|
||||||
if ( document.addEventListener ) {
|
if ( document.addEventListener ) {
|
||||||
// Use the handy event callback
|
// Use the handy event callback
|
||||||
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
|
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
|
||||||
|
|
||||||
// A fallback to window.onload, that will always work
|
// A fallback to window.onload, that will always work
|
||||||
window.addEventListener( "load", jQuery.ready, false );
|
window.addEventListener( "load", jQuery.ready, false );
|
||||||
|
|
||||||
|
@ -463,7 +441,7 @@ jQuery.extend({
|
||||||
// ensure firing before onload,
|
// ensure firing before onload,
|
||||||
// maybe late but safe also for iframes
|
// maybe late but safe also for iframes
|
||||||
document.attachEvent("onreadystatechange", DOMContentLoaded);
|
document.attachEvent("onreadystatechange", DOMContentLoaded);
|
||||||
|
|
||||||
// A fallback to window.onload, that will always work
|
// A fallback to window.onload, that will always work
|
||||||
window.attachEvent( "onload", jQuery.ready );
|
window.attachEvent( "onload", jQuery.ready );
|
||||||
|
|
||||||
|
@ -514,20 +492,20 @@ jQuery.extend({
|
||||||
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
|
if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not own constructor property must be Object
|
// Not own constructor property must be Object
|
||||||
if ( obj.constructor &&
|
if ( obj.constructor &&
|
||||||
!hasOwn.call(obj, "constructor") &&
|
!hasOwn.call(obj, "constructor") &&
|
||||||
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
|
!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Own properties are enumerated firstly, so to speed up,
|
// Own properties are enumerated firstly, so to speed up,
|
||||||
// if last one is own, then all properties are own.
|
// if last one is own, then all properties are own.
|
||||||
|
|
||||||
var key;
|
var key;
|
||||||
for ( key in obj ) {}
|
for ( key in obj ) {}
|
||||||
|
|
||||||
return key === undefined || hasOwn.call( obj, key );
|
return key === undefined || hasOwn.call( obj, key );
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -537,11 +515,11 @@ jQuery.extend({
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
error: function( msg ) {
|
error: function( msg ) {
|
||||||
throw msg;
|
throw msg;
|
||||||
},
|
},
|
||||||
|
|
||||||
parseJSON: function( data ) {
|
parseJSON: function( data ) {
|
||||||
if ( typeof data !== "string" || !data ) {
|
if ( typeof data !== "string" || !data ) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -549,7 +527,7 @@ jQuery.extend({
|
||||||
|
|
||||||
// Make sure leading/trailing whitespace is removed (IE can't handle it)
|
// Make sure leading/trailing whitespace is removed (IE can't handle it)
|
||||||
data = jQuery.trim( data );
|
data = jQuery.trim( data );
|
||||||
|
|
||||||
// Make sure the incoming data is actual JSON
|
// Make sure the incoming data is actual JSON
|
||||||
// Logic borrowed from http://json.org/json2.js
|
// Logic borrowed from http://json.org/json2.js
|
||||||
if ( rvalidchars.test(data.replace(rvalidescape, "@")
|
if ( rvalidchars.test(data.replace(rvalidescape, "@")
|
||||||
|
@ -566,6 +544,28 @@ jQuery.extend({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Cross-browser xml parsing
|
||||||
|
// (xml & tmp used internally)
|
||||||
|
parseXML: function( data , xml , tmp ) {
|
||||||
|
|
||||||
|
if ( window.DOMParser ) { // Standard
|
||||||
|
tmp = new DOMParser();
|
||||||
|
xml = tmp.parseFromString( data , "text/xml" );
|
||||||
|
} else { // IE
|
||||||
|
xml = new ActiveXObject( "Microsoft.XMLDOM" );
|
||||||
|
xml.async = "false";
|
||||||
|
xml.loadXML( data );
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = xml.documentElement;
|
||||||
|
|
||||||
|
if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
|
||||||
|
jQuery.error( "Invalid XML: " + data );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xml;
|
||||||
|
},
|
||||||
|
|
||||||
noop: function() {},
|
noop: function() {},
|
||||||
|
|
||||||
// Evalulates a script in a global context
|
// Evalulates a script in a global context
|
||||||
|
@ -691,7 +691,7 @@ jQuery.extend({
|
||||||
for ( var l = second.length; j < l; j++ ) {
|
for ( var l = second.length; j < l; j++ ) {
|
||||||
first[ i++ ] = second[ j ];
|
first[ i++ ] = second[ j ];
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
while ( second[j] !== undefined ) {
|
while ( second[j] !== undefined ) {
|
||||||
first[ i++ ] = second[ j++ ];
|
first[ i++ ] = second[ j++ ];
|
||||||
|
@ -772,7 +772,7 @@ jQuery.extend({
|
||||||
// The value/s can be optionally by executed if its a function
|
// The value/s can be optionally by executed if its a function
|
||||||
access: function( elems, key, value, exec, fn, pass ) {
|
access: function( elems, key, value, exec, fn, pass ) {
|
||||||
var length = elems.length;
|
var length = elems.length;
|
||||||
|
|
||||||
// Setting many attributes
|
// Setting many attributes
|
||||||
if ( typeof key === "object" ) {
|
if ( typeof key === "object" ) {
|
||||||
for ( var k in key ) {
|
for ( var k in key ) {
|
||||||
|
@ -780,19 +780,19 @@ jQuery.extend({
|
||||||
}
|
}
|
||||||
return elems;
|
return elems;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setting one attribute
|
// Setting one attribute
|
||||||
if ( value !== undefined ) {
|
if ( value !== undefined ) {
|
||||||
// Optionally, function values get executed if exec is true
|
// Optionally, function values get executed if exec is true
|
||||||
exec = !pass && exec && jQuery.isFunction(value);
|
exec = !pass && exec && jQuery.isFunction(value);
|
||||||
|
|
||||||
for ( var i = 0; i < length; i++ ) {
|
for ( var i = 0; i < length; i++ ) {
|
||||||
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
|
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
|
||||||
}
|
}
|
||||||
|
|
||||||
return elems;
|
return elems;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Getting an attribute
|
// Getting an attribute
|
||||||
return length ? fn( elems[0], key ) : undefined;
|
return length ? fn( elems[0], key ) : undefined;
|
||||||
},
|
},
|
||||||
|
@ -801,6 +801,151 @@ jQuery.extend({
|
||||||
return (new Date()).getTime();
|
return (new Date()).getTime();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Create a simple deferred (one callbacks list)
|
||||||
|
_Deferred: function() {
|
||||||
|
|
||||||
|
var // callbacks list
|
||||||
|
callbacks = [],
|
||||||
|
// stored [ context , args ]
|
||||||
|
fired,
|
||||||
|
// to avoid firing when already doing so
|
||||||
|
firing,
|
||||||
|
// flag to know if the deferred has been cancelled
|
||||||
|
cancelled,
|
||||||
|
// the deferred itself
|
||||||
|
deferred = {
|
||||||
|
|
||||||
|
// done( f1, f2, ...)
|
||||||
|
done: function () {
|
||||||
|
|
||||||
|
if ( ! cancelled ) {
|
||||||
|
|
||||||
|
var args = arguments,
|
||||||
|
i,
|
||||||
|
length,
|
||||||
|
elem,
|
||||||
|
type,
|
||||||
|
_fired;
|
||||||
|
|
||||||
|
if ( fired ) {
|
||||||
|
_fired = fired;
|
||||||
|
fired = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( i = 0, length = args.length ; i < length ; i++ ) {
|
||||||
|
elem = args[ i ];
|
||||||
|
type = jQuery.type( elem );
|
||||||
|
if ( type === "array" ) {
|
||||||
|
deferred.done.apply( deferred , elem );
|
||||||
|
} else if ( type === "function" ) {
|
||||||
|
callbacks.push( elem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( _fired ) {
|
||||||
|
deferred.fire( _fired[ 0 ] , _fired[ 1 ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// resolve with given context and args
|
||||||
|
fire: function( context , args ) {
|
||||||
|
if ( ! cancelled && ! fired && ! firing ) {
|
||||||
|
|
||||||
|
firing = 1;
|
||||||
|
|
||||||
|
try {
|
||||||
|
while( callbacks[ 0 ] ) {
|
||||||
|
callbacks.shift().apply( context , args );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
fired = [ context , args ];
|
||||||
|
firing = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// resolve with this as context and given arguments
|
||||||
|
resolve: function() {
|
||||||
|
deferred.fire( jQuery.isFunction( this.promise ) ? this.promise() : this , arguments );
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Has this deferred been resolved?
|
||||||
|
isResolved: function() {
|
||||||
|
return !!( firing || fired );
|
||||||
|
},
|
||||||
|
|
||||||
|
// Cancel
|
||||||
|
cancel: function() {
|
||||||
|
cancelled = 1;
|
||||||
|
callbacks = [];
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return deferred;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Full fledged deferred (two callbacks list)
|
||||||
|
// Typical success/error system
|
||||||
|
Deferred: function( func ) {
|
||||||
|
|
||||||
|
var deferred = jQuery._Deferred(),
|
||||||
|
failDeferred = jQuery._Deferred();
|
||||||
|
|
||||||
|
// Add errorDeferred methods and redefine cancel
|
||||||
|
jQuery.extend( deferred , {
|
||||||
|
|
||||||
|
then: function( doneCallbacks , failCallbacks ) {
|
||||||
|
deferred.done( doneCallbacks ).fail( failCallbacks );
|
||||||
|
return this;
|
||||||
|
},
|
||||||
|
fail: failDeferred.done,
|
||||||
|
fireReject: failDeferred.fire,
|
||||||
|
reject: failDeferred.resolve,
|
||||||
|
isRejected: failDeferred.isResolved,
|
||||||
|
// Get a promise for this deferred
|
||||||
|
// If obj is provided, the promise aspect is added to the object
|
||||||
|
promise: function( obj ) {
|
||||||
|
obj = obj || {};
|
||||||
|
jQuery.each( "then done fail isResolved isRejected".split( " " ) , function( _ , method ) {
|
||||||
|
obj[ method ] = deferred[ method ];
|
||||||
|
});
|
||||||
|
obj.promise = function() {
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Make sure only one callback list will be used
|
||||||
|
deferred.then( failDeferred.cancel , deferred.cancel );
|
||||||
|
|
||||||
|
// Unexpose cancel
|
||||||
|
delete deferred.cancel;
|
||||||
|
|
||||||
|
// Call given func if any
|
||||||
|
if ( func ) {
|
||||||
|
func.call( deferred , deferred );
|
||||||
|
}
|
||||||
|
|
||||||
|
return deferred;
|
||||||
|
},
|
||||||
|
|
||||||
|
// Deferred helper
|
||||||
|
when: function( object ) {
|
||||||
|
object = object && jQuery.isFunction( object.promise ) ?
|
||||||
|
object :
|
||||||
|
jQuery.Deferred().resolve( object );
|
||||||
|
return object.promise();
|
||||||
|
},
|
||||||
|
|
||||||
// Use of jQuery.browser is frowned upon.
|
// Use of jQuery.browser is frowned upon.
|
||||||
// More details: http://docs.jquery.com/Utilities/jQuery.browser
|
// More details: http://docs.jquery.com/Utilities/jQuery.browser
|
||||||
uaMatch: function( ua ) {
|
uaMatch: function( ua ) {
|
||||||
|
@ -818,6 +963,9 @@ jQuery.extend({
|
||||||
browser: {}
|
browser: {}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Create readyList deferred
|
||||||
|
readyList = jQuery._Deferred();
|
||||||
|
|
||||||
// Populate the class2type map
|
// Populate the class2type map
|
||||||
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
|
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
|
||||||
class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
||||||
|
|
17
src/css.js
17
src/css.js
|
@ -12,9 +12,6 @@ var ralpha = /alpha\([^)]*\)/i,
|
||||||
cssHeight = [ "Top", "Bottom" ],
|
cssHeight = [ "Top", "Bottom" ],
|
||||||
curCSS,
|
curCSS,
|
||||||
|
|
||||||
getComputedStyle,
|
|
||||||
currentStyle,
|
|
||||||
|
|
||||||
fcamelCase = function( all, letter ) {
|
fcamelCase = function( all, letter ) {
|
||||||
return letter.toUpperCase();
|
return letter.toUpperCase();
|
||||||
};
|
};
|
||||||
|
@ -172,10 +169,6 @@ jQuery.each(["height", "width"], function( i, name ) {
|
||||||
if ( val <= 0 ) {
|
if ( val <= 0 ) {
|
||||||
val = curCSS( elem, name, name );
|
val = curCSS( elem, name, name );
|
||||||
|
|
||||||
if ( val === "0px" && currentStyle ) {
|
|
||||||
val = currentStyle( elem, name, name );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( val != null ) {
|
if ( val != null ) {
|
||||||
// Should return "auto" instead of 0, use 0 for
|
// Should return "auto" instead of 0, use 0 for
|
||||||
// temporary backwards-compat
|
// temporary backwards-compat
|
||||||
|
@ -241,7 +234,7 @@ if ( !jQuery.support.opacity ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( document.defaultView && document.defaultView.getComputedStyle ) {
|
if ( document.defaultView && document.defaultView.getComputedStyle ) {
|
||||||
getComputedStyle = function( elem, newName, name ) {
|
curCSS = function( elem, newName, name ) {
|
||||||
var ret, defaultView, computedStyle;
|
var ret, defaultView, computedStyle;
|
||||||
|
|
||||||
name = name.replace( rupper, "-$1" ).toLowerCase();
|
name = name.replace( rupper, "-$1" ).toLowerCase();
|
||||||
|
@ -259,10 +252,8 @@ if ( document.defaultView && document.defaultView.getComputedStyle ) {
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
}
|
} else if ( document.documentElement.currentStyle ) {
|
||||||
|
curCSS = function( elem, name ) {
|
||||||
if ( document.documentElement.currentStyle ) {
|
|
||||||
currentStyle = function( elem, name ) {
|
|
||||||
var left, rsLeft,
|
var left, rsLeft,
|
||||||
ret = elem.currentStyle && elem.currentStyle[ name ],
|
ret = elem.currentStyle && elem.currentStyle[ name ],
|
||||||
style = elem.style;
|
style = elem.style;
|
||||||
|
@ -291,8 +282,6 @@ if ( document.documentElement.currentStyle ) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
curCSS = getComputedStyle || currentStyle;
|
|
||||||
|
|
||||||
function getWH( elem, name, extra ) {
|
function getWH( elem, name, extra ) {
|
||||||
var which = name === "width" ? cssWidth : cssHeight,
|
var which = name === "width" ? cssWidth : cssHeight,
|
||||||
val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
|
val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
|
||||||
|
|
15
src/data.js
15
src/data.js
|
@ -9,8 +9,9 @@ jQuery.extend({
|
||||||
// Please use with caution
|
// Please use with caution
|
||||||
uuid: 0,
|
uuid: 0,
|
||||||
|
|
||||||
// Unique for each copy of jQuery on the page
|
// Unique for each copy of jQuery on the page
|
||||||
expando: "jQuery" + jQuery.now(),
|
// Non-digits removed to match rinlinejQuery
|
||||||
|
expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
|
||||||
|
|
||||||
// The following elements throw uncatchable exceptions if you
|
// The following elements throw uncatchable exceptions if you
|
||||||
// attempt to add expando properties to them.
|
// attempt to add expando properties to them.
|
||||||
|
@ -21,6 +22,14 @@ jQuery.extend({
|
||||||
"applet": true
|
"applet": true
|
||||||
},
|
},
|
||||||
|
|
||||||
|
hasData: function( elem ) {
|
||||||
|
if ( elem.nodeType ) {
|
||||||
|
elem = jQuery.cache[ elem[jQuery.expando] ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return !!elem && !jQuery.isEmptyObject(elem);
|
||||||
|
},
|
||||||
|
|
||||||
data: function( elem, name, data ) {
|
data: function( elem, name, data ) {
|
||||||
if ( !jQuery.acceptData( elem ) ) {
|
if ( !jQuery.acceptData( elem ) ) {
|
||||||
return;
|
return;
|
||||||
|
@ -144,7 +153,7 @@ jQuery.fn.extend({
|
||||||
var attr = this[0].attributes, name;
|
var attr = this[0].attributes, name;
|
||||||
for ( var i = 0, l = attr.length; i < l; i++ ) {
|
for ( var i = 0, l = attr.length; i < l; i++ ) {
|
||||||
name = attr[i].name;
|
name = attr[i].name;
|
||||||
|
|
||||||
if ( name.indexOf( "data-" ) === 0 ) {
|
if ( name.indexOf( "data-" ) === 0 ) {
|
||||||
name = name.substr( 5 );
|
name = name.substr( 5 );
|
||||||
dataAttr( this[0], name, data[ name ] );
|
dataAttr( this[0], name, data[ name ] );
|
||||||
|
|
|
@ -25,7 +25,7 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
|
||||||
if ( !elem ) {
|
if ( !elem ) {
|
||||||
return size == null ? null : this;
|
return size == null ? null : this;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( jQuery.isFunction( size ) ) {
|
if ( jQuery.isFunction( size ) ) {
|
||||||
return this.each(function( i ) {
|
return this.each(function( i ) {
|
||||||
var self = jQuery( this );
|
var self = jQuery( this );
|
||||||
|
|
4
src/effects.js
vendored
4
src/effects.js
vendored
|
@ -61,7 +61,7 @@ jQuery.fn.extend({
|
||||||
} else {
|
} else {
|
||||||
for ( var i = 0, j = this.length; i < j; i++ ) {
|
for ( var i = 0, j = this.length; i < j; i++ ) {
|
||||||
var display = jQuery.css( this[i], "display" );
|
var display = jQuery.css( this[i], "display" );
|
||||||
|
|
||||||
if ( display !== "none" && !jQuery.data( this[i], "olddisplay" ) ) {
|
if ( display !== "none" && !jQuery.data( this[i], "olddisplay" ) ) {
|
||||||
jQuery.data( this[i], "olddisplay", display );
|
jQuery.data( this[i], "olddisplay", display );
|
||||||
}
|
}
|
||||||
|
@ -337,7 +337,7 @@ jQuery.fx.prototype = {
|
||||||
}
|
}
|
||||||
|
|
||||||
var r = parseFloat( jQuery.css( this.elem, this.prop ) );
|
var r = parseFloat( jQuery.css( this.elem, this.prop ) );
|
||||||
return r && r > -10000 ? r : 0;
|
return r || 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Start an animation from one number to another
|
// Start an animation from one number to another
|
||||||
|
|
75
src/event.js
75
src/event.js
|
@ -63,7 +63,7 @@ jQuery.event = {
|
||||||
var eventKey = elem.nodeType ? "events" : "__events__",
|
var eventKey = elem.nodeType ? "events" : "__events__",
|
||||||
events = elemData[ eventKey ],
|
events = elemData[ eventKey ],
|
||||||
eventHandle = elemData.handle;
|
eventHandle = elemData.handle;
|
||||||
|
|
||||||
if ( typeof events === "function" ) {
|
if ( typeof events === "function" ) {
|
||||||
// On plain objects events is a fn that holds the the data
|
// On plain objects events is a fn that holds the the data
|
||||||
// which prevents this data from being JSON serialized
|
// which prevents this data from being JSON serialized
|
||||||
|
@ -143,9 +143,9 @@ jQuery.event = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( special.add ) {
|
if ( special.add ) {
|
||||||
special.add.call( elem, handleObj );
|
special.add.call( elem, handleObj );
|
||||||
|
|
||||||
if ( !handleObj.handler.guid ) {
|
if ( !handleObj.handler.guid ) {
|
||||||
handleObj.handler.guid = handler.guid;
|
handleObj.handler.guid = handler.guid;
|
||||||
|
@ -184,7 +184,7 @@ jQuery.event = {
|
||||||
if ( !elemData || !events ) {
|
if ( !elemData || !events ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( typeof events === "function" ) {
|
if ( typeof events === "function" ) {
|
||||||
elemData = events;
|
elemData = events;
|
||||||
events = events.events;
|
events = events.events;
|
||||||
|
@ -222,7 +222,7 @@ jQuery.event = {
|
||||||
namespaces = type.split(".");
|
namespaces = type.split(".");
|
||||||
type = namespaces.shift();
|
type = namespaces.shift();
|
||||||
|
|
||||||
namespace = new RegExp("(^|\\.)" +
|
namespace = new RegExp("(^|\\.)" +
|
||||||
jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
|
jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,7 +384,7 @@ jQuery.event = {
|
||||||
isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
|
isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
|
||||||
special = jQuery.event.special[ targetType ] || {};
|
special = jQuery.event.special[ targetType ] || {};
|
||||||
|
|
||||||
if ( (!special._default || special._default.call( elem, event ) === false) &&
|
if ( (!special._default || special._default.call( elem, event ) === false) &&
|
||||||
!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
|
!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -454,7 +454,7 @@ jQuery.event = {
|
||||||
event.handler = handleObj.handler;
|
event.handler = handleObj.handler;
|
||||||
event.data = handleObj.data;
|
event.data = handleObj.data;
|
||||||
event.handleObj = handleObj;
|
event.handleObj = handleObj;
|
||||||
|
|
||||||
var ret = handleObj.handler.apply( this, args );
|
var ret = handleObj.handler.apply( this, args );
|
||||||
|
|
||||||
if ( ret !== undefined ) {
|
if ( ret !== undefined ) {
|
||||||
|
@ -553,7 +553,7 @@ jQuery.event = {
|
||||||
add: function( handleObj ) {
|
add: function( handleObj ) {
|
||||||
jQuery.event.add( this,
|
jQuery.event.add( this,
|
||||||
liveConvert( handleObj.origType, handleObj.selector ),
|
liveConvert( handleObj.origType, handleObj.selector ),
|
||||||
jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
|
jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
|
||||||
},
|
},
|
||||||
|
|
||||||
remove: function( handleObj ) {
|
remove: function( handleObj ) {
|
||||||
|
@ -583,7 +583,7 @@ jQuery.removeEvent = document.removeEventListener ?
|
||||||
if ( elem.removeEventListener ) {
|
if ( elem.removeEventListener ) {
|
||||||
elem.removeEventListener( type, handle, false );
|
elem.removeEventListener( type, handle, false );
|
||||||
}
|
}
|
||||||
} :
|
} :
|
||||||
function( elem, type, handle ) {
|
function( elem, type, handle ) {
|
||||||
if ( elem.detachEvent ) {
|
if ( elem.detachEvent ) {
|
||||||
elem.detachEvent( "on" + type, handle );
|
elem.detachEvent( "on" + type, handle );
|
||||||
|
@ -600,6 +600,12 @@ jQuery.Event = function( src ) {
|
||||||
if ( src && src.type ) {
|
if ( src && src.type ) {
|
||||||
this.originalEvent = src;
|
this.originalEvent = src;
|
||||||
this.type = src.type;
|
this.type = src.type;
|
||||||
|
|
||||||
|
// Events bubbling up the document may have been marked as prevented
|
||||||
|
// by a handler lower down the tree; reflect the correct value.
|
||||||
|
this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
|
||||||
|
src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
|
||||||
|
|
||||||
// Event type
|
// Event type
|
||||||
} else {
|
} else {
|
||||||
this.type = src;
|
this.type = src;
|
||||||
|
@ -630,7 +636,7 @@ jQuery.Event.prototype = {
|
||||||
if ( !e ) {
|
if ( !e ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if preventDefault exists run it on the original event
|
// if preventDefault exists run it on the original event
|
||||||
if ( e.preventDefault ) {
|
if ( e.preventDefault ) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -726,7 +732,7 @@ if ( !jQuery.support.submitBubbles ) {
|
||||||
return trigger( "submit", this, arguments );
|
return trigger( "submit", this, arguments );
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
|
jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
|
||||||
var elem = e.target,
|
var elem = e.target,
|
||||||
type = elem.type;
|
type = elem.type;
|
||||||
|
@ -788,7 +794,7 @@ if ( !jQuery.support.changeBubbles ) {
|
||||||
if ( e.type !== "focusout" || elem.type !== "radio" ) {
|
if ( e.type !== "focusout" || elem.type !== "radio" ) {
|
||||||
jQuery.data( elem, "_change_data", val );
|
jQuery.data( elem, "_change_data", val );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( data === undefined || val === data ) {
|
if ( data === undefined || val === data ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -802,7 +808,7 @@ if ( !jQuery.support.changeBubbles ) {
|
||||||
|
|
||||||
jQuery.event.special.change = {
|
jQuery.event.special.change = {
|
||||||
filters: {
|
filters: {
|
||||||
focusout: testChange,
|
focusout: testChange,
|
||||||
|
|
||||||
beforedeactivate: testChange,
|
beforedeactivate: testChange,
|
||||||
|
|
||||||
|
@ -873,15 +879,15 @@ if ( document.addEventListener ) {
|
||||||
if ( focusCounts[fix]++ === 0 ) {
|
if ( focusCounts[fix]++ === 0 ) {
|
||||||
document.addEventListener( orig, handler, true );
|
document.addEventListener( orig, handler, true );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
teardown: function() {
|
teardown: function() {
|
||||||
if ( --focusCounts[fix] === 0 ) {
|
if ( --focusCounts[fix] === 0 ) {
|
||||||
document.removeEventListener( orig, handler, true );
|
document.removeEventListener( orig, handler, true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function handler( e ) {
|
function handler( e ) {
|
||||||
e = jQuery.event.fix( e );
|
e = jQuery.event.fix( e );
|
||||||
e.type = fix;
|
e.type = fix;
|
||||||
return jQuery.event.trigger( e, null, e.target );
|
return jQuery.event.trigger( e, null, e.target );
|
||||||
|
@ -898,7 +904,7 @@ jQuery.each(["bind", "one"], function( i, name ) {
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( jQuery.isFunction( data ) || data === false ) {
|
if ( jQuery.isFunction( data ) || data === false ) {
|
||||||
fn = data;
|
fn = data;
|
||||||
data = undefined;
|
data = undefined;
|
||||||
|
@ -938,20 +944,20 @@ jQuery.fn.extend({
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
|
|
||||||
delegate: function( selector, types, data, fn ) {
|
delegate: function( selector, types, data, fn ) {
|
||||||
return this.live( types, data, fn, selector );
|
return this.live( types, data, fn, selector );
|
||||||
},
|
},
|
||||||
|
|
||||||
undelegate: function( selector, types, fn ) {
|
undelegate: function( selector, types, fn ) {
|
||||||
if ( arguments.length === 0 ) {
|
if ( arguments.length === 0 ) {
|
||||||
return this.unbind( "live" );
|
return this.unbind( "live" );
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return this.die( types, null, fn, selector );
|
return this.die( types, null, fn, selector );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
trigger: function( type, data ) {
|
trigger: function( type, data ) {
|
||||||
return this.each(function() {
|
return this.each(function() {
|
||||||
jQuery.event.trigger( type, data, this );
|
jQuery.event.trigger( type, data, this );
|
||||||
|
@ -1008,12 +1014,12 @@ jQuery.each(["live", "die"], function( i, name ) {
|
||||||
var type, i = 0, match, namespaces, preType,
|
var type, i = 0, match, namespaces, preType,
|
||||||
selector = origSelector || this.selector,
|
selector = origSelector || this.selector,
|
||||||
context = origSelector ? this : jQuery( this.context );
|
context = origSelector ? this : jQuery( this.context );
|
||||||
|
|
||||||
if ( typeof types === "object" && !types.preventDefault ) {
|
if ( typeof types === "object" && !types.preventDefault ) {
|
||||||
for ( var key in types ) {
|
for ( var key in types ) {
|
||||||
context[ name ]( key, data, types[key], selector );
|
context[ name ]( key, data, types[key], selector );
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1060,7 +1066,7 @@ jQuery.each(["live", "die"], function( i, name ) {
|
||||||
context.unbind( "live." + liveConvert( type, selector ), fn );
|
context.unbind( "live." + liveConvert( type, selector ), fn );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -1079,7 +1085,7 @@ function liveHandler( event ) {
|
||||||
if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
|
if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( event.namespace ) {
|
if ( event.namespace ) {
|
||||||
namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
|
namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
|
||||||
}
|
}
|
||||||
|
@ -1177,21 +1183,4 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Prevent memory leaks in IE
|
|
||||||
// Window isn't included so as not to unbind existing unload events
|
|
||||||
// More info:
|
|
||||||
// - http://isaacschlueter.com/2006/10/msie-memory-leaks/
|
|
||||||
if ( window.attachEvent && !window.addEventListener ) {
|
|
||||||
jQuery(window).bind("unload", function() {
|
|
||||||
for ( var id in jQuery.cache ) {
|
|
||||||
if ( jQuery.cache[ id ].handle ) {
|
|
||||||
// Try/Catch is to handle iframes being unloaded, see #4280
|
|
||||||
try {
|
|
||||||
jQuery.event.remove( jQuery.cache[ id ].handle.elem );
|
|
||||||
} catch(e) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
})( jQuery );
|
})( jQuery );
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
* Copyright 2010, The Dojo Foundation
|
* Copyright 2010, The Dojo Foundation
|
||||||
* Released under the MIT, BSD, and GPL Licenses.
|
* Released under the MIT, BSD, and GPL Licenses.
|
||||||
*
|
*
|
||||||
* Date:
|
* Date: @DATE
|
||||||
*/
|
*/
|
||||||
(function( window, undefined ) {
|
(function( window, undefined ) {
|
||||||
|
|
||||||
|
|
|
@ -370,14 +370,18 @@ function root( elem, cur ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function cloneCopyEvent(orig, ret) {
|
function cloneCopyEvent(orig, ret) {
|
||||||
var i = 0;
|
ret.each(function (nodeIndex) {
|
||||||
|
if ( this.nodeType !== 1 || !jQuery.hasData(orig[nodeIndex]) ) {
|
||||||
ret.each(function() {
|
|
||||||
if ( this.nodeType !== 1 || this.nodeName !== (orig[i] && orig[i].nodeName) ) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var oldData = jQuery.data( orig[i++] ),
|
// XXX remove for 1.5 RC or merge back in if there is actually a reason for this check that has been
|
||||||
|
// unexposed by unit tests
|
||||||
|
if ( this.nodeName !== (orig[nodeIndex] && orig[nodeIndex].nodeName) ) {
|
||||||
|
throw "Cloned data mismatch";
|
||||||
|
}
|
||||||
|
|
||||||
|
var oldData = jQuery.data( orig[nodeIndex] ),
|
||||||
curData = jQuery.data( this, oldData ),
|
curData = jQuery.data( this, oldData ),
|
||||||
events = oldData && oldData.events;
|
events = oldData && oldData.events;
|
||||||
|
|
||||||
|
@ -386,8 +390,8 @@ function cloneCopyEvent(orig, ret) {
|
||||||
curData.events = {};
|
curData.events = {};
|
||||||
|
|
||||||
for ( var type in events ) {
|
for ( var type in events ) {
|
||||||
for ( var handler in events[ type ] ) {
|
for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
|
||||||
jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
|
jQuery.event.add( this, type, events[ type ][ i ], events[ type ][ i ].data );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -416,15 +420,29 @@ function cloneFixAttributes(src, dest) {
|
||||||
if ( nodeName === "object" ) {
|
if ( nodeName === "object" ) {
|
||||||
dest.outerHTML = src.outerHTML;
|
dest.outerHTML = src.outerHTML;
|
||||||
|
|
||||||
// IE6-8 fails to persist the checked state of a cloned checkbox
|
} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
|
||||||
// or radio button
|
// IE6-8 fails to persist the checked state of a cloned checkbox
|
||||||
} else if ( nodeName === "input" && src.checked ) {
|
// or radio button. Worse, IE6-7 fail to give the cloned element
|
||||||
dest.defaultChecked = dest.checked = src.checked;
|
// a checked appearance if the defaultChecked value isn't also set
|
||||||
|
if ( src.checked ) {
|
||||||
|
dest.defaultChecked = dest.checked = src.checked;
|
||||||
|
}
|
||||||
|
|
||||||
|
// IE6-7 get confused and end up setting the value of a cloned
|
||||||
|
// checkbox/radio button to an empty string instead of "on"
|
||||||
|
if ( dest.value !== src.value ) {
|
||||||
|
dest.value = src.value;
|
||||||
|
}
|
||||||
|
|
||||||
// IE6-8 fails to return the selected option to the default selected
|
// IE6-8 fails to return the selected option to the default selected
|
||||||
// state when cloning options
|
// state when cloning options
|
||||||
} else if ( nodeName === "option" ) {
|
} else if ( nodeName === "option" ) {
|
||||||
dest.selected = src.defaultSelected;
|
dest.selected = src.defaultSelected;
|
||||||
|
|
||||||
|
// IE6-8 fails to set the defaultValue to the correct value when
|
||||||
|
// cloning other types of input fields
|
||||||
|
} else if ( nodeName === "input" || nodeName === "textarea" ) {
|
||||||
|
dest.defaultValue = src.defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event data gets referenced instead of copied if the expando
|
// Event data gets referenced instead of copied if the expando
|
||||||
|
@ -436,12 +454,12 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
|
||||||
var fragment, cacheable, cacheresults,
|
var fragment, cacheable, cacheresults,
|
||||||
doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
|
doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
|
||||||
|
|
||||||
// Only cache "small" (1/2 KB) strings that are associated with the main document
|
// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
|
||||||
// Cloning options loses the selected state, so don't cache them
|
// Cloning options loses the selected state, so don't cache them
|
||||||
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
|
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
|
||||||
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
|
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
|
||||||
if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
|
if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
|
||||||
!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
|
args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
|
||||||
|
|
||||||
cacheable = true;
|
cacheable = true;
|
||||||
cacheresults = jQuery.fragments[ args[0] ];
|
cacheresults = jQuery.fragments[ args[0] ];
|
||||||
|
@ -613,6 +631,11 @@ jQuery.extend({
|
||||||
jQuery.removeEvent( elem, type, data.handle );
|
jQuery.removeEvent( elem, type, data.handle );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Null the DOM reference to avoid IE6/7/8 leak (#7054)
|
||||||
|
if ( data.handle ) {
|
||||||
|
data.handle.elem = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( deleteExpando ) {
|
if ( deleteExpando ) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
|
||||||
jQuery.fn.offset = function( options ) {
|
jQuery.fn.offset = function( options ) {
|
||||||
var elem = this[0], box;
|
var elem = this[0], box;
|
||||||
|
|
||||||
if ( options ) {
|
if ( options ) {
|
||||||
return this.each(function( i ) {
|
return this.each(function( i ) {
|
||||||
jQuery.offset.setOffset( this, options, i );
|
jQuery.offset.setOffset( this, options, i );
|
||||||
});
|
});
|
||||||
|
@ -49,7 +49,7 @@ if ( "getBoundingClientRect" in document.documentElement ) {
|
||||||
jQuery.fn.offset = function( options ) {
|
jQuery.fn.offset = function( options ) {
|
||||||
var elem = this[0];
|
var elem = this[0];
|
||||||
|
|
||||||
if ( options ) {
|
if ( options ) {
|
||||||
return this.each(function( i ) {
|
return this.each(function( i ) {
|
||||||
jQuery.offset.setOffset( this, options, i );
|
jQuery.offset.setOffset( this, options, i );
|
||||||
});
|
});
|
||||||
|
@ -168,7 +168,7 @@ jQuery.offset = {
|
||||||
|
|
||||||
return { top: top, left: left };
|
return { top: top, left: left };
|
||||||
},
|
},
|
||||||
|
|
||||||
setOffset: function( elem, options, i ) {
|
setOffset: function( elem, options, i ) {
|
||||||
var position = jQuery.css( elem, "position" );
|
var position = jQuery.css( elem, "position" );
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ jQuery.offset = {
|
||||||
if (options.left != null) {
|
if (options.left != null) {
|
||||||
props.left = (options.left - curOffset.left) + curLeft;
|
props.left = (options.left - curOffset.left) + curLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( "using" in options ) {
|
if ( "using" in options ) {
|
||||||
options.using.call( elem, props );
|
options.using.call( elem, props );
|
||||||
} else {
|
} else {
|
||||||
|
@ -262,7 +262,7 @@ jQuery.each( ["Left", "Top"], function( i, name ) {
|
||||||
|
|
||||||
jQuery.fn[ method ] = function(val) {
|
jQuery.fn[ method ] = function(val) {
|
||||||
var elem = this[0], win;
|
var elem = this[0], win;
|
||||||
|
|
||||||
if ( !elem ) {
|
if ( !elem ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -147,7 +147,7 @@
|
||||||
jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
|
jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.innerHTML = "<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";
|
div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
|
||||||
var tds = div.getElementsByTagName("td");
|
var tds = div.getElementsByTagName("td");
|
||||||
|
|
||||||
// Check if table cells still have offsetWidth/Height when they are set
|
// Check if table cells still have offsetWidth/Height when they are set
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
(function( jQuery ) {
|
|
||||||
|
|
||||||
var jsc = jQuery.now(),
|
|
||||||
jsre = /\=\?(&|$)/,
|
|
||||||
rquery_jsonp = /\?/;
|
|
||||||
|
|
||||||
// Default jsonp callback name
|
|
||||||
jQuery.ajaxSettings.jsonpCallback = function() {
|
|
||||||
return "jsonp" + jsc++;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Normalize jsonp queries
|
|
||||||
// 1) put callback parameter in url or data
|
|
||||||
// 2) ensure transportDataType is json
|
|
||||||
// 3) ensure options jsonp is always provided so that jsonp requests are always
|
|
||||||
// json request with the jsonp option set
|
|
||||||
jQuery.xhr.prefilter( function(s) {
|
|
||||||
|
|
||||||
var transportDataType = s.dataTypes[0];
|
|
||||||
|
|
||||||
if ( s.jsonp ||
|
|
||||||
transportDataType === "jsonp" ||
|
|
||||||
transportDataType === "json" && ( jsre.test(s.url) || typeof(s.data) === "string" && jsre.test(s.data) ) ) {
|
|
||||||
|
|
||||||
var jsonp = s.jsonp = s.jsonp || "callback",
|
|
||||||
jsonpCallback = s.jsonpCallback =
|
|
||||||
jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
|
|
||||||
url = s.url.replace(jsre, "=" + jsonpCallback + "$1"),
|
|
||||||
data = s.url == url && typeof(s.data) === "string" ? s.data.replace(jsre, "=" + jsonpCallback + "$1") : s.data;
|
|
||||||
|
|
||||||
if ( url == s.url && data == s.data ) {
|
|
||||||
url = url += (rquery_jsonp.test( url ) ? "&" : "?") + jsonp + "=" + jsonpCallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
s.url = url;
|
|
||||||
s.data = data;
|
|
||||||
|
|
||||||
s.dataTypes[0] = "json";
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// Bind transport to json dataType
|
|
||||||
jQuery.xhr.bindTransport("json", function(s) {
|
|
||||||
|
|
||||||
if ( s.jsonp ) {
|
|
||||||
|
|
||||||
// Put callback in place
|
|
||||||
var responseContainer,
|
|
||||||
jsonpCallback = s.jsonpCallback,
|
|
||||||
previous = window[ jsonpCallback ];
|
|
||||||
|
|
||||||
window [ jsonpCallback ] = function( response ) {
|
|
||||||
responseContainer = [response];
|
|
||||||
};
|
|
||||||
|
|
||||||
s.complete = [function() {
|
|
||||||
|
|
||||||
// Set callback back to previous value
|
|
||||||
window[ jsonpCallback ] = previous;
|
|
||||||
|
|
||||||
// Call if it was a function and we have a response
|
|
||||||
if ( previous) {
|
|
||||||
if ( responseContainer && jQuery.isFunction ( previous ) ) {
|
|
||||||
window[ jsonpCallback ] ( responseContainer[0] );
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// else, more memory leak avoidance
|
|
||||||
try{ delete window[ jsonpCallback ]; } catch(e){}
|
|
||||||
}
|
|
||||||
|
|
||||||
}, s.complete ];
|
|
||||||
|
|
||||||
// Use data converter to retrieve json after script execution
|
|
||||||
s.dataConverters["script => json"] = function() {
|
|
||||||
if ( ! responseContainer ) {
|
|
||||||
jQuery.error("Callback '" + jsonpCallback + "' was not called");
|
|
||||||
}
|
|
||||||
return responseContainer[ 0 ];
|
|
||||||
};
|
|
||||||
|
|
||||||
// Delegate to script transport
|
|
||||||
return "script";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
})( jQuery );
|
|
|
@ -51,7 +51,7 @@ jQuery.fn.extend({
|
||||||
filter: function( selector ) {
|
filter: function( selector ) {
|
||||||
return this.pushStack( winnow(this, selector, true), "filter", selector );
|
return this.pushStack( winnow(this, selector, true), "filter", selector );
|
||||||
},
|
},
|
||||||
|
|
||||||
is: function( selector ) {
|
is: function( selector ) {
|
||||||
return !!selector && jQuery.filter( selector, this ).length > 0;
|
return !!selector && jQuery.filter( selector, this ).length > 0;
|
||||||
},
|
},
|
||||||
|
@ -69,7 +69,7 @@ jQuery.fn.extend({
|
||||||
selector = selectors[i];
|
selector = selectors[i];
|
||||||
|
|
||||||
if ( !matches[selector] ) {
|
if ( !matches[selector] ) {
|
||||||
matches[selector] = jQuery.expr.match.POS.test( selector ) ?
|
matches[selector] = jQuery.expr.match.POS.test( selector ) ?
|
||||||
jQuery( selector, context || this.context ) :
|
jQuery( selector, context || this.context ) :
|
||||||
selector;
|
selector;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ jQuery.fn.extend({
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pos = POS.test( selectors ) ?
|
var pos = POS.test( selectors ) ?
|
||||||
jQuery( selectors, context || this.context ) : null;
|
jQuery( selectors, context || this.context ) : null;
|
||||||
|
|
||||||
for ( i = 0, l = this.length; i < l; i++ ) {
|
for ( i = 0, l = this.length; i < l; i++ ) {
|
||||||
|
@ -113,10 +113,10 @@ jQuery.fn.extend({
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = ret.length > 1 ? jQuery.unique(ret) : ret;
|
ret = ret.length > 1 ? jQuery.unique(ret) : ret;
|
||||||
|
|
||||||
return this.pushStack( ret, "closest", selectors );
|
return this.pushStack( ret, "closest", selectors );
|
||||||
},
|
},
|
||||||
|
|
||||||
// Determine the position of an element within
|
// Determine the position of an element within
|
||||||
// the matched set of elements
|
// the matched set of elements
|
||||||
index: function( elem ) {
|
index: function( elem ) {
|
||||||
|
@ -197,7 +197,7 @@ jQuery.each({
|
||||||
}, function( name, fn ) {
|
}, function( name, fn ) {
|
||||||
jQuery.fn[ name ] = function( until, selector ) {
|
jQuery.fn[ name ] = function( until, selector ) {
|
||||||
var ret = jQuery.map( this, fn, until );
|
var ret = jQuery.map( this, fn, until );
|
||||||
|
|
||||||
if ( !runtil.test( name ) ) {
|
if ( !runtil.test( name ) ) {
|
||||||
selector = until;
|
selector = until;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +226,7 @@ jQuery.extend({
|
||||||
jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
|
jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
|
||||||
jQuery.find.matches(expr, elems);
|
jQuery.find.matches(expr, elems);
|
||||||
},
|
},
|
||||||
|
|
||||||
dir: function( elem, dir, until ) {
|
dir: function( elem, dir, until ) {
|
||||||
var matched = [],
|
var matched = [],
|
||||||
cur = elem[ dir ];
|
cur = elem[ dir ];
|
||||||
|
|
909
src/xhr.js
909
src/xhr.js
|
@ -1,909 +0,0 @@
|
||||||
(function( jQuery ) {
|
|
||||||
|
|
||||||
var rquery_xhr = /\?/,
|
|
||||||
rhash = /#.*$/,
|
|
||||||
rheaders = /^(.*?):\s*(.*?)\r?$/mg, // IE leaves an \r character at EOL
|
|
||||||
rnoContent = /^(?:GET|HEAD)$/,
|
|
||||||
rts = /([?&])_=[^&]*/,
|
|
||||||
rurl = /^(\w+:)?\/\/([^\/?#]+)/,
|
|
||||||
|
|
||||||
sliceFunc = Array.prototype.slice,
|
|
||||||
|
|
||||||
isFunction = jQuery.isFunction;
|
|
||||||
|
|
||||||
// Creates a jQuery xhr object
|
|
||||||
jQuery.xhr = function( _native ) {
|
|
||||||
|
|
||||||
if ( _native ) {
|
|
||||||
return jQuery.ajaxSettings.xhr();
|
|
||||||
}
|
|
||||||
|
|
||||||
function reset(force) {
|
|
||||||
|
|
||||||
// We only need to reset if we went through the init phase
|
|
||||||
// (with the exception of object creation)
|
|
||||||
if ( force || internal ) {
|
|
||||||
|
|
||||||
// Reset callbacks lists
|
|
||||||
callbacksLists = {
|
|
||||||
success: createCBList(),
|
|
||||||
error: createCBList(),
|
|
||||||
complete: createCBList()
|
|
||||||
};
|
|
||||||
|
|
||||||
// Reset private variables
|
|
||||||
requestHeaders = {};
|
|
||||||
responseHeadersString = responseHeaders = internal = done = timeoutTimer = s = undefined;
|
|
||||||
|
|
||||||
// Reset state
|
|
||||||
xhr.readyState = 0;
|
|
||||||
sendFlag = 0;
|
|
||||||
|
|
||||||
// Remove responseX fields
|
|
||||||
for ( var name in xhr ) {
|
|
||||||
if ( /^response/.test(name) ) {
|
|
||||||
delete xhr[name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function init() {
|
|
||||||
|
|
||||||
var // Options extraction
|
|
||||||
|
|
||||||
// Remove hash character (#7531: first for string promotion)
|
|
||||||
url = s.url = ( "" + s.url ).replace( rhash , "" ),
|
|
||||||
|
|
||||||
// Uppercase the type
|
|
||||||
type = s.type = s.type.toUpperCase(),
|
|
||||||
|
|
||||||
// Determine if request has content
|
|
||||||
hasContent = s.hasContent = ! rnoContent.test( type ),
|
|
||||||
|
|
||||||
// Extract dataTypes list
|
|
||||||
dataType = s.dataType,
|
|
||||||
dataTypes = s.dataTypes = dataType ? jQuery.trim(dataType).toLowerCase().split(/\s+/) : ["*"],
|
|
||||||
|
|
||||||
// Determine if a cross-domain request is in order
|
|
||||||
parts = rurl.exec( url.toLowerCase() ),
|
|
||||||
loc = location,
|
|
||||||
crossDomain = s.crossDomain = !!( parts && ( parts[1] && parts[1] != loc.protocol || parts[2] != loc.host ) ),
|
|
||||||
|
|
||||||
// Get other options locally
|
|
||||||
data = s.data,
|
|
||||||
originalContentType = s.contentType,
|
|
||||||
prefilters = s.prefilters,
|
|
||||||
accepts = s.accepts,
|
|
||||||
headers = s.headers,
|
|
||||||
|
|
||||||
// Other Variables
|
|
||||||
transportDataType,
|
|
||||||
i;
|
|
||||||
|
|
||||||
// Convert data if not already a string
|
|
||||||
if ( data && s.processData && typeof data != "string" ) {
|
|
||||||
data = s.data = jQuery.param( data , s.traditional );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply option prefilters
|
|
||||||
for (i in prefilters) {
|
|
||||||
prefilters[i](s);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get internal
|
|
||||||
internal = selectTransport( s );
|
|
||||||
|
|
||||||
// Re-actualize url & data
|
|
||||||
url = s.url;
|
|
||||||
data = s.data;
|
|
||||||
|
|
||||||
// If internal was found
|
|
||||||
if ( internal ) {
|
|
||||||
|
|
||||||
// Get transportDataType
|
|
||||||
transportDataType = dataTypes[0];
|
|
||||||
|
|
||||||
// More options handling for requests with no content
|
|
||||||
if ( ! hasContent ) {
|
|
||||||
|
|
||||||
// If data is available, append data to url
|
|
||||||
if ( data ) {
|
|
||||||
url += (rquery_xhr.test(url) ? "&" : "?") + data;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add anti-cache in url if needed
|
|
||||||
if ( s.cache === false ) {
|
|
||||||
|
|
||||||
var ts = jQuery.now(),
|
|
||||||
// try replacing _= if it is there
|
|
||||||
ret = url.replace(rts, "$1_=" + ts );
|
|
||||||
|
|
||||||
// if nothing was replaced, add timestamp to the end
|
|
||||||
url = ret + ((ret == url) ? (rquery_xhr.test(url) ? "&" : "?") + "_=" + ts : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
s.url = url;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the correct header, if data is being sent
|
|
||||||
if ( ( data && hasContent ) || originalContentType ) {
|
|
||||||
requestHeaders["content-type"] = s.contentType;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
|
||||||
if ( s.ifModified ) {
|
|
||||||
if ( jQuery_lastModified[url] ) {
|
|
||||||
requestHeaders["if-modified-since"] = jQuery_lastModified[url];
|
|
||||||
}
|
|
||||||
if ( jQuery_etag[url] ) {
|
|
||||||
requestHeaders["if-none-match"] = jQuery_etag[url];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the Accepts header for the server, depending on the dataType
|
|
||||||
requestHeaders.accept = transportDataType && accepts[ transportDataType ] ?
|
|
||||||
accepts[ transportDataType ] + ( transportDataType !== "*" ? ", */*; q=0.01" : "" ) :
|
|
||||||
accepts[ "*" ];
|
|
||||||
|
|
||||||
// Check for headers option
|
|
||||||
for ( i in headers ) {
|
|
||||||
requestHeaders[ i.toLowerCase() ] = headers[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
callbackContext = s.context || s;
|
|
||||||
globalEventContext = s.context ? jQuery(s.context) : jQuery.event;
|
|
||||||
|
|
||||||
for ( i in callbacksLists ) {
|
|
||||||
callbacksLists[i].bind(s[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Watch for a new set of requests
|
|
||||||
if ( s.global && jQuery.active++ === 0 ) {
|
|
||||||
jQuery.event.trigger( "ajaxStart" );
|
|
||||||
}
|
|
||||||
|
|
||||||
done = whenDone;
|
|
||||||
}
|
|
||||||
|
|
||||||
function whenDone(status, statusText, response, headers) {
|
|
||||||
|
|
||||||
// Called once
|
|
||||||
done = undefined;
|
|
||||||
|
|
||||||
// Reset sendFlag
|
|
||||||
sendFlag = 0;
|
|
||||||
|
|
||||||
// Cache response headers
|
|
||||||
responseHeadersString = headers || "";
|
|
||||||
|
|
||||||
// Clear timeout if it exists
|
|
||||||
if ( timeoutTimer ) {
|
|
||||||
clearTimeout(timeoutTimer);
|
|
||||||
}
|
|
||||||
|
|
||||||
var // Reference url
|
|
||||||
url = s.url,
|
|
||||||
// and ifModified status
|
|
||||||
ifModified = s.ifModified,
|
|
||||||
|
|
||||||
// Is it a success?
|
|
||||||
isSuccess = 0,
|
|
||||||
// Stored success
|
|
||||||
success,
|
|
||||||
// Stored error
|
|
||||||
error = statusText;
|
|
||||||
|
|
||||||
// If not timeout, force a jQuery-compliant status text
|
|
||||||
if ( statusText != "timeout" ) {
|
|
||||||
statusText = ( status >= 200 && status < 300 ) ?
|
|
||||||
"success" :
|
|
||||||
( status === 304 ? "notmodified" : "error" );
|
|
||||||
}
|
|
||||||
|
|
||||||
// If successful, handle type chaining
|
|
||||||
if ( statusText === "success" || statusText === "notmodified" ) {
|
|
||||||
|
|
||||||
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
|
|
||||||
if ( ifModified ) {
|
|
||||||
var lastModified = xhr.getResponseHeader("Last-Modified"),
|
|
||||||
etag = xhr.getResponseHeader("Etag");
|
|
||||||
|
|
||||||
if (lastModified) {
|
|
||||||
jQuery_lastModified[url] = lastModified;
|
|
||||||
}
|
|
||||||
if (etag) {
|
|
||||||
jQuery_etag[url] = etag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ifModified && statusText === "notmodified" ) {
|
|
||||||
|
|
||||||
success = null;
|
|
||||||
isSuccess = 1;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Chain data conversions and determine the final value
|
|
||||||
// (if an exception is thrown in the process, it'll be notified as an error)
|
|
||||||
try {
|
|
||||||
|
|
||||||
function checkData(data) {
|
|
||||||
if ( data !== undefined ) {
|
|
||||||
var testFunction = s.dataCheckers[srcDataType];
|
|
||||||
if ( isFunction( testFunction ) ) {
|
|
||||||
testFunction(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function convertData (data) {
|
|
||||||
var conversionFunction = dataConverters[srcDataType+" => "+destDataType] ||
|
|
||||||
dataConverters["* => "+destDataType],
|
|
||||||
noFunction = ! isFunction( conversionFunction );
|
|
||||||
if ( noFunction ) {
|
|
||||||
if ( srcDataType != "text" && destDataType != "text" ) {
|
|
||||||
// We try to put text inbetween
|
|
||||||
var first = dataConverters[srcDataType+" => text"] ||
|
|
||||||
dataConverters["* => text"],
|
|
||||||
second = dataConverters["text => "+destDataType] ||
|
|
||||||
dataConverters["* => "+destDataType],
|
|
||||||
areFunctions = isFunction( first ) && isFunction( second );
|
|
||||||
if ( areFunctions ) {
|
|
||||||
conversionFunction = function (data) {
|
|
||||||
return second( first ( data ) );
|
|
||||||
};
|
|
||||||
}
|
|
||||||
noFunction = ! areFunctions;
|
|
||||||
}
|
|
||||||
if ( noFunction ) {
|
|
||||||
jQuery.error( "no data converter between " + srcDataType + " and " + destDataType );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return conversionFunction(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
var dataTypes = s.dataTypes,
|
|
||||||
i,
|
|
||||||
length,
|
|
||||||
data = response,
|
|
||||||
dataConverters = s.dataConverters,
|
|
||||||
srcDataType,
|
|
||||||
destDataType,
|
|
||||||
responseTypes = s.xhrResponseFields;
|
|
||||||
|
|
||||||
for ( i = 0, length = dataTypes.length ; i < length ; i++ ) {
|
|
||||||
|
|
||||||
destDataType = dataTypes[i];
|
|
||||||
|
|
||||||
if ( !srcDataType ) { // First time
|
|
||||||
|
|
||||||
// Copy type
|
|
||||||
srcDataType = destDataType;
|
|
||||||
// Check
|
|
||||||
checkData(data);
|
|
||||||
// Apply dataFilter
|
|
||||||
if ( isFunction( s.dataFilter ) ) {
|
|
||||||
data = s.dataFilter(data, s.dataType);
|
|
||||||
// Recheck data
|
|
||||||
checkData(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else { // Subsequent times
|
|
||||||
|
|
||||||
// handle auto
|
|
||||||
// JULIAN: for reasons unknown to me === doesn't work here
|
|
||||||
if (destDataType == "*") {
|
|
||||||
|
|
||||||
destDataType = srcDataType;
|
|
||||||
|
|
||||||
} else if ( srcDataType != destDataType ) {
|
|
||||||
|
|
||||||
// Convert
|
|
||||||
data = convertData(data);
|
|
||||||
// Copy type & check
|
|
||||||
srcDataType = destDataType;
|
|
||||||
checkData(data);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy response into the xhr if it hasn't been already
|
|
||||||
var responseDataType,
|
|
||||||
responseType = responseTypes[srcDataType];
|
|
||||||
|
|
||||||
if ( responseType ) {
|
|
||||||
|
|
||||||
responseDataType = srcDataType;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
responseType = responseTypes[ responseDataType = "text" ];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( responseType !== 1 ) {
|
|
||||||
xhr[ "response" + responseType ] = data;
|
|
||||||
responseTypes[ responseType ] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// We have a real success
|
|
||||||
success = data;
|
|
||||||
isSuccess = 1;
|
|
||||||
|
|
||||||
} catch(e) {
|
|
||||||
|
|
||||||
statusText = "parsererror";
|
|
||||||
error = "" + e;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else { // if not success, mark it as an error
|
|
||||||
|
|
||||||
error = error || statusText;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set data for the fake xhr object
|
|
||||||
xhr.status = status;
|
|
||||||
xhr.statusText = statusText;
|
|
||||||
|
|
||||||
// Keep local copies of vars in case callbacks re-use the xhr
|
|
||||||
var _s = s,
|
|
||||||
_callbacksLists = callbacksLists,
|
|
||||||
_callbackContext = callbackContext,
|
|
||||||
_globalEventContext = globalEventContext;
|
|
||||||
|
|
||||||
// Set state if the xhr hasn't been re-used
|
|
||||||
function _setState( value ) {
|
|
||||||
if ( xhr.readyState && s === _s ) {
|
|
||||||
setState( value );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Really completed?
|
|
||||||
if ( status && s.async ) {
|
|
||||||
setState( 2 );
|
|
||||||
_setState( 3 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// We're done
|
|
||||||
_setState( 4 );
|
|
||||||
|
|
||||||
// Success
|
|
||||||
_callbacksLists.success.fire( isSuccess , _callbackContext , success, statusText, xhr);
|
|
||||||
if ( isSuccess && _s.global ) {
|
|
||||||
_globalEventContext.trigger( "ajaxSuccess", [xhr, _s, success] );
|
|
||||||
}
|
|
||||||
// Error
|
|
||||||
_callbacksLists.error.fire( ! isSuccess , _callbackContext , xhr, statusText, error);
|
|
||||||
if ( !isSuccess && _s.global ) {
|
|
||||||
_globalEventContext.trigger( "ajaxError", [xhr, _s, error] );
|
|
||||||
}
|
|
||||||
// Complete
|
|
||||||
_callbacksLists.complete.fire( 1 , _callbackContext, xhr, statusText);
|
|
||||||
if ( _s.global ) {
|
|
||||||
_globalEventContext.trigger( "ajaxComplete", [xhr, _s] );
|
|
||||||
// Handle the global AJAX counter
|
|
||||||
if ( ! --jQuery.active ) {
|
|
||||||
jQuery.event.trigger( "ajaxStop" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ready state control
|
|
||||||
function checkState( expected , test ) {
|
|
||||||
if ( expected !== true && ( expected === false || test === false || xhr.readyState !== expected ) ) {
|
|
||||||
jQuery.error("INVALID_STATE_ERR");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ready state change
|
|
||||||
function setState( value ) {
|
|
||||||
xhr.readyState = value;
|
|
||||||
if ( isFunction( xhr.onreadystatechange ) ) {
|
|
||||||
xhr.onreadystatechange();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var // jQuery lists
|
|
||||||
jQuery_lastModified = jQuery.lastModified,
|
|
||||||
jQuery_etag = jQuery.etag,
|
|
||||||
// Options object
|
|
||||||
s,
|
|
||||||
// Callback stuff
|
|
||||||
callbackContext,
|
|
||||||
globalEventContext,
|
|
||||||
callbacksLists,
|
|
||||||
// Headers (they are sent all at once)
|
|
||||||
requestHeaders,
|
|
||||||
// Response headers
|
|
||||||
responseHeadersString,
|
|
||||||
responseHeaders,
|
|
||||||
// Done callback
|
|
||||||
done,
|
|
||||||
// transport
|
|
||||||
internal,
|
|
||||||
// timeout handle
|
|
||||||
timeoutTimer,
|
|
||||||
// The send flag
|
|
||||||
sendFlag,
|
|
||||||
// Fake xhr
|
|
||||||
xhr = {
|
|
||||||
// state
|
|
||||||
readyState: 0,
|
|
||||||
|
|
||||||
// Callback
|
|
||||||
onreadystatechange: null,
|
|
||||||
|
|
||||||
// Open
|
|
||||||
open: function(type, url, async, username, password) {
|
|
||||||
|
|
||||||
xhr.abort();
|
|
||||||
reset();
|
|
||||||
|
|
||||||
s = {
|
|
||||||
type: type,
|
|
||||||
url: url,
|
|
||||||
async: async,
|
|
||||||
username: username,
|
|
||||||
password: password
|
|
||||||
};
|
|
||||||
|
|
||||||
setState(1);
|
|
||||||
|
|
||||||
return xhr;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Send
|
|
||||||
send: function(data, moreOptions) {
|
|
||||||
|
|
||||||
checkState(1 , !sendFlag);
|
|
||||||
|
|
||||||
s.data = data;
|
|
||||||
|
|
||||||
s = jQuery.extend( true,
|
|
||||||
{},
|
|
||||||
jQuery.ajaxSettings,
|
|
||||||
s,
|
|
||||||
moreOptions || ( moreOptions === false ? { global: false } : {} ) );
|
|
||||||
|
|
||||||
if ( moreOptions ) {
|
|
||||||
// We force the original context
|
|
||||||
// (plain objects used as context get extended)
|
|
||||||
s.context = moreOptions.context;
|
|
||||||
}
|
|
||||||
|
|
||||||
init();
|
|
||||||
|
|
||||||
// If not internal, abort
|
|
||||||
if ( ! internal ) {
|
|
||||||
done( 0 , "transport not found" );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow custom headers/mimetypes and early abort
|
|
||||||
if ( s.beforeSend ) {
|
|
||||||
|
|
||||||
var _s = s;
|
|
||||||
|
|
||||||
if ( s.beforeSend.call(callbackContext, xhr, s) === false || ! xhr.readyState || _s !== s ) {
|
|
||||||
|
|
||||||
// Abort if not done
|
|
||||||
if ( xhr.readyState && _s === s ) {
|
|
||||||
xhr.abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle the global AJAX counter
|
|
||||||
if ( _s.global && ! --jQuery.active ) {
|
|
||||||
jQuery.event.trigger( "ajaxStop" );
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sendFlag = 1;
|
|
||||||
|
|
||||||
// Send global event
|
|
||||||
if ( s.global ) {
|
|
||||||
globalEventContext.trigger("ajaxSend", [xhr, s]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timeout
|
|
||||||
if ( s.async && s.timeout > 0 ) {
|
|
||||||
timeoutTimer = setTimeout(function(){
|
|
||||||
xhr.abort("timeout");
|
|
||||||
}, s.timeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( s.async ) {
|
|
||||||
setState(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
internal.send(requestHeaders, done);
|
|
||||||
return xhr;
|
|
||||||
|
|
||||||
} catch (e) {
|
|
||||||
|
|
||||||
if ( done ) {
|
|
||||||
|
|
||||||
done(0, "error", "" + e);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
jQuery.error(e);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Caches the header
|
|
||||||
setRequestHeader: function(name,value) {
|
|
||||||
checkState(1, !sendFlag);
|
|
||||||
requestHeaders[ name.toLowerCase() ] = value;
|
|
||||||
return xhr;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Raw string
|
|
||||||
getAllResponseHeaders: function() {
|
|
||||||
return xhr.readyState <= 1 ? "" : responseHeadersString;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Builds headers hashtable if needed
|
|
||||||
getResponseHeader: function( key ) {
|
|
||||||
|
|
||||||
if ( xhr.readyState <= 1 ) {
|
|
||||||
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( responseHeaders === undefined ) {
|
|
||||||
|
|
||||||
responseHeaders = {};
|
|
||||||
|
|
||||||
if ( typeof responseHeadersString === "string" ) {
|
|
||||||
|
|
||||||
var match;
|
|
||||||
|
|
||||||
while( ( match = rheaders.exec( responseHeadersString ) ) ) {
|
|
||||||
responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return responseHeaders[ key.toLowerCase() ];
|
|
||||||
},
|
|
||||||
|
|
||||||
// Cancel the request
|
|
||||||
abort: function(statusText) {
|
|
||||||
if (internal) {
|
|
||||||
internal.abort( statusText || "abort" );
|
|
||||||
}
|
|
||||||
xhr.readyState = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Init data (so that we can bind callbacks early
|
|
||||||
reset(1);
|
|
||||||
|
|
||||||
// Install callbacks related methods
|
|
||||||
jQuery.each(callbacksLists, function(name) {
|
|
||||||
var list;
|
|
||||||
xhr[name] = function() {
|
|
||||||
list = callbacksLists[name];
|
|
||||||
if ( list ) {
|
|
||||||
list.bind.apply(list, arguments );
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// Return the xhr emulation
|
|
||||||
return xhr;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a callback list
|
|
||||||
function createCBList() {
|
|
||||||
|
|
||||||
var functors = [],
|
|
||||||
autoFire = 0,
|
|
||||||
fireArgs,
|
|
||||||
list = {
|
|
||||||
|
|
||||||
fire: function( flag , context ) {
|
|
||||||
|
|
||||||
// Save info for later bindings
|
|
||||||
fireArgs = arguments;
|
|
||||||
|
|
||||||
// Remove autoFire to keep bindings in order
|
|
||||||
autoFire = 0;
|
|
||||||
|
|
||||||
var args = sliceFunc.call( fireArgs , 2 );
|
|
||||||
|
|
||||||
// Execute callbacks
|
|
||||||
while ( flag && functors.length ) {
|
|
||||||
flag = functors.shift().apply( context , args ) !== false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean if asked to stop
|
|
||||||
if ( ! flag ) {
|
|
||||||
clean();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set autoFire
|
|
||||||
autoFire = 1;
|
|
||||||
},
|
|
||||||
|
|
||||||
bind: function() {
|
|
||||||
|
|
||||||
var args = arguments,
|
|
||||||
i = 0,
|
|
||||||
length = args.length,
|
|
||||||
func;
|
|
||||||
|
|
||||||
for ( ; i < length ; i++ ) {
|
|
||||||
|
|
||||||
func = args[ i ];
|
|
||||||
|
|
||||||
if ( jQuery.isArray(func) ) {
|
|
||||||
|
|
||||||
list.bind.apply( list , func );
|
|
||||||
|
|
||||||
} else if ( isFunction(func) ) {
|
|
||||||
|
|
||||||
// Add if not already in
|
|
||||||
if ( ! pos( func ) ) {
|
|
||||||
functors.push( func );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( autoFire ) {
|
|
||||||
list.fire.apply( list , fireArgs );
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
unbind: function() {
|
|
||||||
|
|
||||||
var i = 0,
|
|
||||||
args = arguments,
|
|
||||||
length = args.length,
|
|
||||||
func,
|
|
||||||
position;
|
|
||||||
|
|
||||||
if ( length ) {
|
|
||||||
|
|
||||||
for( ; i < length ; i++ ) {
|
|
||||||
func = args[i];
|
|
||||||
if ( jQuery.isArray(func) ) {
|
|
||||||
list.unbind.apply(list,func);
|
|
||||||
} else if ( isFunction(func) ) {
|
|
||||||
position = pos(func);
|
|
||||||
if ( position ) {
|
|
||||||
functors.splice(position-1,1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
functors = [];
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get the index of the functor in the list (1-based)
|
|
||||||
function pos( func ) {
|
|
||||||
for (var i = 0, length = functors.length; i < length && functors[i] !== func; i++) {
|
|
||||||
}
|
|
||||||
return i < length ? ( i + 1 ) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean the object
|
|
||||||
function clean() {
|
|
||||||
// Empty callbacks list
|
|
||||||
functors = [];
|
|
||||||
// Inhibit methods
|
|
||||||
for (var i in list) {
|
|
||||||
list[i] = jQuery.noop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
jQuery.extend(jQuery.xhr, {
|
|
||||||
|
|
||||||
// Add new prefilter
|
|
||||||
prefilter: function (functor) {
|
|
||||||
if ( isFunction(functor) ) {
|
|
||||||
jQuery.ajaxSettings.prefilters.push( functor );
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Bind a transport to one or more dataTypes
|
|
||||||
bindTransport: function () {
|
|
||||||
|
|
||||||
var args = arguments,
|
|
||||||
i,
|
|
||||||
start = 0,
|
|
||||||
length = args.length,
|
|
||||||
dataTypes = [ "*" ],
|
|
||||||
functors = [],
|
|
||||||
functor,
|
|
||||||
first,
|
|
||||||
append,
|
|
||||||
list,
|
|
||||||
transports = jQuery.ajaxSettings.transports;
|
|
||||||
|
|
||||||
if ( length ) {
|
|
||||||
|
|
||||||
if ( ! isFunction( args[ 0 ] ) ) {
|
|
||||||
|
|
||||||
dataTypes = args[ 0 ].toLowerCase().split(/\s+/);
|
|
||||||
start = 1;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( dataTypes.length && start < length ) {
|
|
||||||
|
|
||||||
for ( i = start; i < length; i++ ) {
|
|
||||||
functor = args[i];
|
|
||||||
if ( isFunction(functor) ) {
|
|
||||||
functors.push( functor );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( functors.length ) {
|
|
||||||
|
|
||||||
jQuery.each ( dataTypes, function( _ , dataType ) {
|
|
||||||
|
|
||||||
first = /^\+/.test( dataType );
|
|
||||||
|
|
||||||
if (first) {
|
|
||||||
dataType = dataType.substr(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( dataType !== "" ) {
|
|
||||||
|
|
||||||
append = Array.prototype[ first ? "unshift" : "push" ];
|
|
||||||
|
|
||||||
list = transports[ dataType ];
|
|
||||||
|
|
||||||
jQuery.each ( functors, function( _ , functor ) {
|
|
||||||
|
|
||||||
if ( ! list ) {
|
|
||||||
|
|
||||||
list = transports[ dataType ] = [ functor ];
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
append.call( list , functor );
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// Select a transport given options
|
|
||||||
function selectTransport( s ) {
|
|
||||||
|
|
||||||
var dataTypes = s.dataTypes,
|
|
||||||
transportDataType,
|
|
||||||
transportsList,
|
|
||||||
transport,
|
|
||||||
i,
|
|
||||||
length,
|
|
||||||
checked = {},
|
|
||||||
flag;
|
|
||||||
|
|
||||||
function initSearch( dataType ) {
|
|
||||||
|
|
||||||
flag = transportDataType !== dataType && ! checked[ dataType ];
|
|
||||||
|
|
||||||
if ( flag ) {
|
|
||||||
|
|
||||||
checked[ dataType ] = 1;
|
|
||||||
transportDataType = dataType;
|
|
||||||
transportsList = s.transports[ dataType ];
|
|
||||||
i = -1;
|
|
||||||
length = transportsList ? transportsList.length : 0 ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
initSearch( dataTypes[ 0 ] );
|
|
||||||
|
|
||||||
for ( i = 0 ; ! transport && i <= length ; i++ ) {
|
|
||||||
|
|
||||||
if ( i === length ) {
|
|
||||||
|
|
||||||
initSearch( "*" );
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
transport = transportsList[ i ]( s , determineDataType );
|
|
||||||
|
|
||||||
// If we got redirected to another dataType
|
|
||||||
// Search there (if not in progress or already tried)
|
|
||||||
if ( typeof( transport ) === "string" &&
|
|
||||||
initSearch( transport ) ) {
|
|
||||||
|
|
||||||
dataTypes.unshift( transport );
|
|
||||||
transport = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return transport;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Utility function that handles dataType when response is received
|
|
||||||
// (for those transports that can give text or xml responses)
|
|
||||||
function determineDataType( s , ct , text , xml ) {
|
|
||||||
|
|
||||||
var autoDataType = s.autoDataType,
|
|
||||||
type,
|
|
||||||
regexp,
|
|
||||||
dataTypes = s.dataTypes,
|
|
||||||
transportDataType = dataTypes[0],
|
|
||||||
response;
|
|
||||||
|
|
||||||
// Auto (xml, json, script or text determined given headers)
|
|
||||||
if ( transportDataType === "*" ) {
|
|
||||||
|
|
||||||
for ( type in autoDataType ) {
|
|
||||||
if ( ( regexp = autoDataType[ type ] ) && regexp.test( ct ) ) {
|
|
||||||
transportDataType = dataTypes[0] = type;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// xml and parsed as such
|
|
||||||
if ( transportDataType === "xml" &&
|
|
||||||
xml &&
|
|
||||||
xml.documentElement /* #4958 */ ) {
|
|
||||||
|
|
||||||
response = xml;
|
|
||||||
|
|
||||||
// Text response was provided
|
|
||||||
} else {
|
|
||||||
|
|
||||||
response = text;
|
|
||||||
|
|
||||||
// If it's not really text, defer to dataConverters
|
|
||||||
if ( transportDataType !== "text" ) {
|
|
||||||
dataTypes.unshift( "text" );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
})( jQuery );
|
|
5
test/data/errorWithText.php
Normal file
5
test/data/errorWithText.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
header("HTTP/1.0 400 Bad Request");
|
||||||
|
|
||||||
|
echo "plain text message";
|
|
@ -4,17 +4,13 @@ header( "Sample-Header: Hello World" );
|
||||||
|
|
||||||
$headers = array();
|
$headers = array();
|
||||||
|
|
||||||
foreach( $_SERVER as $key => $value ) {
|
foreach( $_SERVER as $key => $value ) {
|
||||||
|
|
||||||
if ( substr( $key , 0 , 5 ) == "HTTP_" ) {
|
|
||||||
|
|
||||||
$key = str_replace( "_" , "-" , substr( $key , 5) );
|
|
||||||
$headers[ $key ] = $value;
|
|
||||||
|
|
||||||
}
|
$key = str_replace( "_" , "-" , substr( $key , 0 , 5 ) == "HTTP_" ? substr( $key , 5 ) : $key );
|
||||||
|
$headers[ $key ] = $value;
|
||||||
}
|
|
||||||
|
}
|
||||||
|
|
||||||
foreach( explode( "_" , $_GET[ "keys" ] ) as $key ) {
|
foreach( explode( "_" , $_GET[ "keys" ] ) as $key ) {
|
||||||
echo "$key: " . $headers[ strtoupper( $key ) ] . "\n";
|
echo "$key: " . @$headers[ strtoupper( $key ) ] . "\n";
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
<?php
|
<?php
|
||||||
error_reporting(0);
|
error_reporting(0);
|
||||||
$callback = $_REQUEST['callback'];
|
$callback = $_REQUEST['callback'];
|
||||||
|
if ( ! $callback ) {
|
||||||
|
$callback = explode("?",end(explode("/",$_SERVER['REQUEST_URI'])));
|
||||||
|
$callback = $callback[0];
|
||||||
|
}
|
||||||
$json = $_REQUEST['json'];
|
$json = $_REQUEST['json'];
|
||||||
if($json) {
|
if($json) {
|
||||||
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
|
echo $callback . '([ {"name": "John", "age": 21}, {"name": "Peter", "age": 25 } ])';
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<div id="post">
|
<div id="post">
|
||||||
<?php
|
<?php
|
||||||
foreach( $_POST as $key=>$value )
|
foreach( $_POST as $key=>$value )
|
||||||
echo "<b id='$key'>$value</b>";
|
echo "<b id='$key'>$value</b>";
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
<div id="get">
|
<div id="get">
|
||||||
<?php
|
<?php
|
||||||
foreach( $_GET as $key=>$value )
|
foreach( $_GET as $key=>$value )
|
||||||
echo "<b id='$key'>$value</b>";
|
echo "<b id='$key'>$value</b>";
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
|
@ -206,7 +206,7 @@
|
||||||
$(document).bind("focusin", function() {
|
$(document).bind("focusin", function() {
|
||||||
jQuery("#boundFocus").blink();
|
jQuery("#boundFocus").blink();
|
||||||
});
|
});
|
||||||
|
|
||||||
$(document).bind("focusout", function() {
|
$(document).bind("focusout", function() {
|
||||||
jQuery("#boundBlur").blink();
|
jQuery("#boundBlur").blink();
|
||||||
});
|
});
|
||||||
|
@ -229,14 +229,14 @@
|
||||||
$(document).bind("change", function(){
|
$(document).bind("change", function(){
|
||||||
jQuery("#boundChange").blink();
|
jQuery("#boundChange").blink();
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#text_submit").addSubmitTest("#textSubmit", true);
|
$("#text_submit").addSubmitTest("#textSubmit", true);
|
||||||
$("#password_submit").addSubmitTest("#passwordSubmit", true);
|
$("#password_submit").addSubmitTest("#passwordSubmit", true);
|
||||||
$("#submit_submit").addSubmitTest("#submitSubmit", true);
|
$("#submit_submit").addSubmitTest("#submitSubmit", true);
|
||||||
$(document).bind("submit", function(){
|
$(document).bind("submit", function(){
|
||||||
jQuery("#boundSubmit").blink();
|
jQuery("#boundSubmit").blink();
|
||||||
});
|
});
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -20,10 +20,9 @@
|
||||||
<script src="../src/manipulation.js"></script>
|
<script src="../src/manipulation.js"></script>
|
||||||
<script src="../src/css.js"></script>
|
<script src="../src/css.js"></script>
|
||||||
<script src="../src/ajax.js"></script>
|
<script src="../src/ajax.js"></script>
|
||||||
<script src="../src/xhr.js"></script>
|
<script src="../src/ajax/jsonp.js"></script>
|
||||||
<script src="../src/transports/jsonp.js"></script>
|
<script src="../src/ajax/script.js"></script>
|
||||||
<script src="../src/transports/script.js"></script>
|
<script src="../src/ajax/xhr.js"></script>
|
||||||
<script src="../src/transports/xhr.js"></script>
|
|
||||||
<script src="../src/effects.js"></script>
|
<script src="../src/effects.js"></script>
|
||||||
<script src="../src/offset.js"></script>
|
<script src="../src/offset.js"></script>
|
||||||
<script src="../src/dimensions.js"></script>
|
<script src="../src/dimensions.js"></script>
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
$suite = file_get_contents('index.html');
|
$suite = file_get_contents('index.html');
|
||||||
echo str_replace( '<!-- Includes -->', $includes, $suite );
|
echo str_replace( '<!-- Includes -->', $includes, $suite );
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
<h1 id="header">jQuery Test Suite</h1>
|
<h1 id="header">jQuery Test Suite</h1>
|
||||||
<h2 id="banner" class="fail"></h2>
|
<h2 id="banner" class="fail"></h2>
|
||||||
<h2 id="userAgent">Choose other libraries to include</h2>
|
<h2 id="userAgent">Choose other libraries to include</h2>
|
||||||
|
|
||||||
<form class="otherlibs" action="" method="post">
|
<form class="otherlibs" action="" method="post">
|
||||||
<?php
|
<?php
|
||||||
$libs = scandir('otherlibs');
|
$libs = scandir('otherlibs');
|
||||||
|
|
|
@ -70,44 +70,6 @@ test("jQuery.ajax() - success callbacks - (url, options) syntax", function() {
|
||||||
}, 13);
|
}, 13);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.ajax() - success/error callbacks (remote)", function() {
|
|
||||||
|
|
||||||
var supports = jQuery.support.cors;
|
|
||||||
|
|
||||||
expect( supports ? 9 : 6 );
|
|
||||||
|
|
||||||
jQuery.ajaxSetup({ timeout: 0 });
|
|
||||||
|
|
||||||
stop();
|
|
||||||
|
|
||||||
setTimeout(function(){
|
|
||||||
jQuery('#foo').ajaxStart(function(){
|
|
||||||
ok( true, "ajaxStart" );
|
|
||||||
}).ajaxStop(function(){
|
|
||||||
ok( true, "ajaxStop" );
|
|
||||||
start();
|
|
||||||
}).ajaxSend(function(){
|
|
||||||
ok( supports , "ajaxSend" );
|
|
||||||
}).ajaxComplete(function(){
|
|
||||||
ok( true, "ajaxComplete" );
|
|
||||||
}).ajaxError(function(){
|
|
||||||
ok( ! supports, "ajaxError" );
|
|
||||||
}).ajaxSuccess(function(){
|
|
||||||
ok( supports, "ajaxSuccess" );
|
|
||||||
});
|
|
||||||
|
|
||||||
jQuery.ajax({
|
|
||||||
// JULIAN TODO: Get an url especially for jQuery
|
|
||||||
url: "http://rockstarapps.com/test.php",
|
|
||||||
dataType: "text",
|
|
||||||
beforeSend: function(){ ok(supports, "beforeSend"); },
|
|
||||||
success: function( val ){ ok(supports, "success"); ok(supports && val.length, "data received"); },
|
|
||||||
error: function(_ , a , b ){ ok(!supports, "error"); },
|
|
||||||
complete: function(){ ok(true, "complete"); }
|
|
||||||
});
|
|
||||||
}, 13);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("jQuery.ajax() - success callbacks (late binding)", function() {
|
test("jQuery.ajax() - success callbacks (late binding)", function() {
|
||||||
expect( 8 );
|
expect( 8 );
|
||||||
|
|
||||||
|
@ -173,7 +135,7 @@ test("jQuery.ajax() - success callbacks (oncomplete binding)", function() {
|
||||||
.error(function(){ ok(false, "error"); })
|
.error(function(){ ok(false, "error"); })
|
||||||
.complete(function(){ start(); });
|
.complete(function(){ start(); });
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}, 13);
|
}, 13);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -211,7 +173,7 @@ test("jQuery.ajax() - success callbacks (very late binding)", function() {
|
||||||
.complete(function(){ start(); });
|
.complete(function(){ start(); });
|
||||||
},100);
|
},100);
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
}, 13);
|
}, 13);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -221,7 +183,7 @@ test("jQuery.ajax() - success callbacks (order)", function() {
|
||||||
jQuery.ajaxSetup({ timeout: 0 });
|
jQuery.ajaxSetup({ timeout: 0 });
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
var testString = "";
|
var testString = "";
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
|
@ -278,12 +240,52 @@ test("jQuery.ajax() - error callbacks", function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("jQuery.ajax() - responseText on error", function() {
|
||||||
|
|
||||||
|
expect( 1 );
|
||||||
|
|
||||||
|
stop();
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: url("data/errorWithText.php"),
|
||||||
|
error: function(xhr) {
|
||||||
|
strictEqual( xhr.responseText , "plain text message" , "Test jXHR.responseText is filled for HTTP errors" );
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test(".ajax() - retry with jQuery.ajax( this )", function() {
|
||||||
|
|
||||||
|
expect( 1 );
|
||||||
|
|
||||||
|
stop();
|
||||||
|
|
||||||
|
var firstTime = 1;
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: url("data/errorWithText.php"),
|
||||||
|
error: function() {
|
||||||
|
if ( firstTime ) {
|
||||||
|
firstTime = 0;
|
||||||
|
jQuery.ajax( this );
|
||||||
|
} else {
|
||||||
|
ok( true , "Test retrying with jQuery.ajax(this) works" );
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
test(".ajax() - headers" , function() {
|
test(".ajax() - headers" , function() {
|
||||||
|
|
||||||
expect( 2 );
|
expect( 2 );
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
var requestHeaders = {
|
var requestHeaders = {
|
||||||
siMPle: "value",
|
siMPle: "value",
|
||||||
"SometHing-elsE": "other value",
|
"SometHing-elsE": "other value",
|
||||||
|
@ -291,11 +293,11 @@ test(".ajax() - headers" , function() {
|
||||||
},
|
},
|
||||||
list = [],
|
list = [],
|
||||||
i;
|
i;
|
||||||
|
|
||||||
for( i in requestHeaders ) {
|
for( i in requestHeaders ) {
|
||||||
list.push( i );
|
list.push( i );
|
||||||
}
|
}
|
||||||
|
|
||||||
jQuery.ajax(url("data/headers.php?keys="+list.join( "_" ) ), {
|
jQuery.ajax(url("data/headers.php?keys="+list.join( "_" ) ), {
|
||||||
headers: requestHeaders,
|
headers: requestHeaders,
|
||||||
success: function( data , _ , xhr ) {
|
success: function( data , _ , xhr ) {
|
||||||
|
@ -304,19 +306,77 @@ test(".ajax() - headers" , function() {
|
||||||
tmp.push( i , ": " , requestHeaders[ i ] , "\n" );
|
tmp.push( i , ": " , requestHeaders[ i ] , "\n" );
|
||||||
}
|
}
|
||||||
tmp = tmp.join( "" );
|
tmp = tmp.join( "" );
|
||||||
|
|
||||||
equals( data , tmp , "Headers were sent" );
|
equals( data , tmp , "Headers were sent" );
|
||||||
equals( xhr.getResponseHeader( "Sample-Header" ) , "Hello World" , "Sample header received" );
|
equals( xhr.getResponseHeader( "Sample-Header" ) , "Hello World" , "Sample header received" );
|
||||||
start();
|
start();
|
||||||
},
|
},
|
||||||
error: function(){ ok(false, "error"); }
|
error: function(){ ok(false, "error"); }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
test(".ajax() - Accept header" , function() {
|
||||||
|
|
||||||
|
expect( 1 );
|
||||||
|
|
||||||
|
stop();
|
||||||
|
|
||||||
|
jQuery.ajax(url("data/headers.php?keys=accept"), {
|
||||||
|
headers: {
|
||||||
|
Accept: "very wrong accept value"
|
||||||
|
},
|
||||||
|
beforeSend: function( xhr ) {
|
||||||
|
xhr.setRequestHeader( "Accept", "*/*" );
|
||||||
|
},
|
||||||
|
success: function( data ) {
|
||||||
|
strictEqual( data , "accept: */*\n" , "Test Accept header is set to last value provided" );
|
||||||
|
start();
|
||||||
|
},
|
||||||
|
error: function(){ ok(false, "error"); }
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
test(".ajax() - contentType" , function() {
|
||||||
|
|
||||||
|
expect( 2 );
|
||||||
|
|
||||||
|
stop();
|
||||||
|
|
||||||
|
var count = 2;
|
||||||
|
|
||||||
|
function restart() {
|
||||||
|
if ( ! --count ) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.ajax(url("data/headers.php?keys=content-type" ), {
|
||||||
|
contentType: "test",
|
||||||
|
success: function( data ) {
|
||||||
|
strictEqual( data , "content-type: test\n" , "Test content-type is sent when options.contentType is set" );
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
restart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax(url("data/headers.php?keys=content-type" ), {
|
||||||
|
contentType: false,
|
||||||
|
success: function( data ) {
|
||||||
|
strictEqual( data , "content-type: \n" , "Test content-type is not sent when options.contentType===false" );
|
||||||
|
},
|
||||||
|
complete: function() {
|
||||||
|
restart();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test(".ajax() - hash", function() {
|
test(".ajax() - hash", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: "data/name.html#foo",
|
url: "data/name.html#foo",
|
||||||
beforeSend: function( xhr, settings ) {
|
beforeSend: function( xhr, settings ) {
|
||||||
|
@ -324,7 +384,7 @@ test(".ajax() - hash", function() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: "data/name.html?abc#foo",
|
url: "data/name.html?abc#foo",
|
||||||
beforeSend: function( xhr, settings ) {
|
beforeSend: function( xhr, settings ) {
|
||||||
|
@ -332,7 +392,7 @@ test(".ajax() - hash", function() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: "data/name.html?abc#foo",
|
url: "data/name.html?abc#foo",
|
||||||
data: { "test": 123 },
|
data: { "test": 123 },
|
||||||
|
@ -343,10 +403,57 @@ test(".ajax() - hash", function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("jQuery ajax - cross-domain detection", function() {
|
||||||
|
|
||||||
|
expect( 4 );
|
||||||
|
|
||||||
|
var loc = document.location,
|
||||||
|
otherPort = loc.port === 666 ? 667 : 666,
|
||||||
|
otherProtocol = loc.protocol === "http:" ? "https:" : "http:";
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
dataType: "jsonp",
|
||||||
|
url: otherProtocol + "//" + loc.host,
|
||||||
|
beforeSend: function( _ , s ) {
|
||||||
|
ok( s.crossDomain , "Test different protocols are detected as cross-domain" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
dataType: "jsonp",
|
||||||
|
url: loc.protocol + '//somewebsitethatdoesnotexist-656329477541.com:' + ( loc.port || 80 ),
|
||||||
|
beforeSend: function( _ , s ) {
|
||||||
|
ok( s.crossDomain , "Test different hostnames are detected as cross-domain" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
dataType: "jsonp",
|
||||||
|
url: loc.protocol + "//" + loc.hostname + ":" + otherPort,
|
||||||
|
beforeSend: function( _ , s ) {
|
||||||
|
ok( s.crossDomain , "Test different ports are detected as cross-domain" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
dataType: "jsonp",
|
||||||
|
url: loc.protocol + "//" + loc.host,
|
||||||
|
crossDomain: true,
|
||||||
|
beforeSend: function( _ , s ) {
|
||||||
|
ok( s.crossDomain , "Test forced crossDomain is detected as cross-domain" );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
test(".ajax() - 304", function() {
|
test(".ajax() - 304", function() {
|
||||||
expect( 1 );
|
expect( 1 );
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url("data/notmodified.php"),
|
url: url("data/notmodified.php"),
|
||||||
success: function(){ ok(true, "304 ok"); },
|
success: function(){ ok(true, "304 ok"); },
|
||||||
|
@ -409,142 +516,12 @@ test("jQuery.ajax() - abort", function() {
|
||||||
equals( xhr.readyState, 0, "XHR readyState indicates successful abortion" );
|
equals( xhr.readyState, 0, "XHR readyState indicates successful abortion" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.ajax() - readyState (success)", function() {
|
|
||||||
expect( 1 );
|
|
||||||
|
|
||||||
jQuery.ajaxSetup({ timeout: 0 });
|
|
||||||
|
|
||||||
stop();
|
|
||||||
|
|
||||||
var control = "";
|
|
||||||
|
|
||||||
setTimeout(function(){
|
|
||||||
jQuery.ajax({
|
|
||||||
url: url("data/name.html"),
|
|
||||||
beforeSend: function( xhr ) {
|
|
||||||
xhr.onreadystatechange = function() {
|
|
||||||
control += xhr.readyState;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
complete: function(){
|
|
||||||
setTimeout( function() {
|
|
||||||
equals( control , "1234" , "onreadystatechange was properly called" );
|
|
||||||
}, 13 );
|
|
||||||
start();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, 13);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("jQuery.ajax() - readyState (abort)", function() {
|
|
||||||
expect( 2 );
|
|
||||||
|
|
||||||
jQuery.ajaxSetup({ timeout: 0 });
|
|
||||||
|
|
||||||
stop();
|
|
||||||
|
|
||||||
var control = "";
|
|
||||||
|
|
||||||
setTimeout(function(){
|
|
||||||
|
|
||||||
jQuery.ajaxSetup({ timeout: 500 });
|
|
||||||
|
|
||||||
jQuery.ajax({
|
|
||||||
url: url("data/name.php?wait=5"),
|
|
||||||
beforeSend: function( xhr ) {
|
|
||||||
xhr.onreadystatechange = function() {
|
|
||||||
control += xhr.readyState;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
complete: function( xhr ){
|
|
||||||
setTimeout( function() {
|
|
||||||
equals( control , "14" , "onreadystatechange was properly called" );
|
|
||||||
equals( xhr.readyState, 0 , "readyState is 0" );
|
|
||||||
}, 13 );
|
|
||||||
start();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, 13);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("jQuery.xhr() - reuse", function() {
|
|
||||||
expect( 15 );
|
|
||||||
|
|
||||||
jQuery.ajaxSetup({ timeout: 0 });
|
|
||||||
|
|
||||||
stop();
|
|
||||||
|
|
||||||
var number = 0;
|
|
||||||
|
|
||||||
setTimeout(function(){
|
|
||||||
jQuery('#foo').ajaxStart(function(){
|
|
||||||
ok( true, "ajaxStart" );
|
|
||||||
}).ajaxStop(function(){
|
|
||||||
ok( true, "ajaxStop" );
|
|
||||||
start();
|
|
||||||
}).ajaxSend(function(){
|
|
||||||
number++;
|
|
||||||
ok( true, "ajaxSend (" + number +")" );
|
|
||||||
}).ajaxComplete(function(){
|
|
||||||
ok( true, "ajaxComplete (" + number +")" );
|
|
||||||
}).ajaxError(function(){
|
|
||||||
ok( false, "ajaxError (" + number +")" );
|
|
||||||
}).ajaxSuccess(function(){
|
|
||||||
ok( true, "ajaxSuccess (" + number +")" );
|
|
||||||
});
|
|
||||||
|
|
||||||
jQuery.ajax({
|
|
||||||
url: url("data/name.html"),
|
|
||||||
beforeSend: function(){ ok(true, "beforeSend (1)"); },
|
|
||||||
success: function( _1 , _2 , xhr ){
|
|
||||||
ok(true, "success (1)");
|
|
||||||
xhr.complete(function() {
|
|
||||||
ok(true, "complete (1bis)");
|
|
||||||
});
|
|
||||||
xhr.open( "GET", url("data/name.html") );
|
|
||||||
xhr.success( function(){ ok(true, "beforeSend (2)"); } )
|
|
||||||
xhr.send( null, {
|
|
||||||
success: function(){ ok(true, "success (2)"); },
|
|
||||||
error: function(){ ok(false, "error (2)"); },
|
|
||||||
complete: function(){ ok(true, "complete (2)"); }
|
|
||||||
} );
|
|
||||||
},
|
|
||||||
error: function(){ ok(false, "error (1)"); },
|
|
||||||
complete: function(){ ok(true, "complete (1)"); }
|
|
||||||
});
|
|
||||||
}, 13);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("jQuery.xhr() - early binding", function() {
|
|
||||||
expect( 2 );
|
|
||||||
|
|
||||||
jQuery.ajaxSetup({ timeout: 0 });
|
|
||||||
|
|
||||||
stop();
|
|
||||||
|
|
||||||
jQuery.xhr()
|
|
||||||
.success( function(){ ok(true, "success"); } )
|
|
||||||
.error( function(){ ok(false, "error"); } )
|
|
||||||
.complete( function(){ ok(true, "complete"); start(); } )
|
|
||||||
.open( "GET", url("data/name.html") )
|
|
||||||
.send();
|
|
||||||
});
|
|
||||||
|
|
||||||
test("jQuery.xhr() - get native implementation", function() {
|
|
||||||
|
|
||||||
var xhr = jQuery.xhr(true);
|
|
||||||
|
|
||||||
ok( xhr.readyState !== undefined , "implements XMLHttpRequest" );
|
|
||||||
ok( ! jQuery.isFunction( xhr.success ) , "is not jQuery's abstraction" );
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
test("Ajax events with context", function() {
|
test("Ajax events with context", function() {
|
||||||
expect(14);
|
expect(14);
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
var context = document.createElement("div");
|
var context = document.createElement("div");
|
||||||
|
|
||||||
function event(e){
|
function event(e){
|
||||||
equals( this, context, e.type );
|
equals( this, context, e.type );
|
||||||
}
|
}
|
||||||
|
@ -560,7 +537,7 @@ test("Ajax events with context", function() {
|
||||||
equals( typeof this.url, "string", "context is settings on callback " + msg );
|
equals( typeof this.url, "string", "context is settings on callback " + msg );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
jQuery('#foo').add(context)
|
jQuery('#foo').add(context)
|
||||||
.ajaxSend(event)
|
.ajaxSend(event)
|
||||||
.ajaxComplete(event)
|
.ajaxComplete(event)
|
||||||
|
@ -606,7 +583,7 @@ test("jQuery.ajax context modification", function() {
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
var obj = {}
|
var obj = {};
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url("data/name.html"),
|
url: url("data/name.html"),
|
||||||
|
@ -653,34 +630,6 @@ test("jQuery.ajax() - disabled globals", function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.xhr() - disabled globals through xhr.send(data , false)", function() {
|
|
||||||
expect( 2 );
|
|
||||||
stop();
|
|
||||||
|
|
||||||
jQuery('#foo').ajaxStart(function(){
|
|
||||||
ok( false, "ajaxStart" );
|
|
||||||
}).ajaxStop(function(){
|
|
||||||
ok( false, "ajaxStop" );
|
|
||||||
}).ajaxSend(function(){
|
|
||||||
ok( false, "ajaxSend" );
|
|
||||||
}).ajaxComplete(function(){
|
|
||||||
ok( false, "ajaxComplete" );
|
|
||||||
}).ajaxError(function(){
|
|
||||||
ok( false, "ajaxError" );
|
|
||||||
}).ajaxSuccess(function(){
|
|
||||||
ok( false, "ajaxSuccess" );
|
|
||||||
});
|
|
||||||
|
|
||||||
jQuery.xhr()
|
|
||||||
.success(function(){ ok(true, "success"); })
|
|
||||||
.error(function(){ ok(false, "error"); })
|
|
||||||
.complete(function(){
|
|
||||||
ok(true, "complete");
|
|
||||||
setTimeout(function(){ start(); }, 13);
|
|
||||||
})
|
|
||||||
.open("GET", url("data/name.html")).send(undefined, false);
|
|
||||||
});
|
|
||||||
|
|
||||||
test("jQuery.ajax - xml: non-namespace elements inside namespaced elements", function() {
|
test("jQuery.ajax - xml: non-namespace elements inside namespaced elements", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
stop();
|
stop();
|
||||||
|
@ -707,6 +656,10 @@ test("jQuery.ajax - xml: non-namespace elements inside namespaced elements (over
|
||||||
equals( jQuery("jsconf", resp).length, 1, 'jsconf in responseXML' );
|
equals( jQuery("jsconf", resp).length, 1, 'jsconf in responseXML' );
|
||||||
equals( jQuery("thing", resp).length, 2, 'things in responseXML' );
|
equals( jQuery("thing", resp).length, 2, 'things in responseXML' );
|
||||||
start();
|
start();
|
||||||
|
},
|
||||||
|
error: function(_1,_2,error) {
|
||||||
|
ok( false, error );
|
||||||
|
start();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -721,7 +674,7 @@ test("jQuery.ajax - HEAD requests", function() {
|
||||||
success: function(data, status, xhr){
|
success: function(data, status, xhr){
|
||||||
var h = xhr.getAllResponseHeaders();
|
var h = xhr.getAllResponseHeaders();
|
||||||
ok( /Date/i.test(h), 'No Date in HEAD response' );
|
ok( /Date/i.test(h), 'No Date in HEAD response' );
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url("data/name.html"),
|
url: url("data/name.html"),
|
||||||
data: { whip_it: "good" },
|
data: { whip_it: "good" },
|
||||||
|
@ -842,20 +795,20 @@ test("serialize()", function() {
|
||||||
'Check input serialization as query string');
|
'Check input serialization as query string');
|
||||||
|
|
||||||
equals( jQuery('#testForm').serialize(),
|
equals( jQuery('#testForm').serialize(),
|
||||||
'T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
|
'T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
|
||||||
'Check form serialization as query string');
|
'Check form serialization as query string');
|
||||||
|
|
||||||
equals( jQuery('#testForm :input').serialize(),
|
equals( jQuery('#testForm :input').serialize(),
|
||||||
'T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
|
'T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=',
|
||||||
'Check input serialization as query string');
|
'Check input serialization as query string');
|
||||||
|
|
||||||
equals( jQuery('#form, #testForm').serialize(),
|
equals( jQuery('#form, #testForm').serialize(),
|
||||||
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
|
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&select5=3&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
|
||||||
'Multiple form serialization as query string');
|
'Multiple form serialization as query string');
|
||||||
|
|
||||||
/* Temporarily disabled. Opera 10 has problems with form serialization.
|
/* Temporarily disabled. Opera 10 has problems with form serialization.
|
||||||
equals( jQuery('#form, #testForm :input').serialize(),
|
equals( jQuery('#form, #testForm :input').serialize(),
|
||||||
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&T3=%3F%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
|
"action=Test&radio2=on&check=on&hidden=&foo%5Bbar%5D=&name=name&search=search&email=dave%40jquery.com&number=43&select1=&select2=3&select3=1&select3=2&T3=%3F%0D%0AZ&H1=x&H2=&PWD=&T1=&T2=YES&My+Name=me&S1=abc&S3=YES&S4=",
|
||||||
'Mixed form/input serialization as query string');
|
'Mixed form/input serialization as query string');
|
||||||
*/
|
*/
|
||||||
jQuery("#html5email, #html5number").remove();
|
jQuery("#html5email, #html5number").remove();
|
||||||
|
@ -863,9 +816,9 @@ test("serialize()", function() {
|
||||||
|
|
||||||
test("jQuery.param()", function() {
|
test("jQuery.param()", function() {
|
||||||
expect(22);
|
expect(22);
|
||||||
|
|
||||||
equals( !jQuery.ajaxSettings.traditional, true, "traditional flag, falsy by default" );
|
equals( !jQuery.ajaxSettings.traditional, true, "traditional flag, falsy by default" );
|
||||||
|
|
||||||
var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
|
var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
|
||||||
equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );
|
equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );
|
||||||
|
|
||||||
|
@ -880,13 +833,13 @@ test("jQuery.param()", function() {
|
||||||
|
|
||||||
params = {foo: { bar: 'baz', beep: 42, quux: 'All your base are belong to us' } };
|
params = {foo: { bar: 'baz', beep: 42, quux: 'All your base are belong to us' } };
|
||||||
equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );
|
equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );
|
||||||
|
|
||||||
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
||||||
equals( decodeURIComponent( jQuery.param(params) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=undefined&i[]=10&i[]=11&j=true&k=false&l[]=undefined&l[]=0&m=cowboy+hat?", "huge structure" );
|
equals( decodeURIComponent( jQuery.param(params) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=undefined&i[]=10&i[]=11&j=true&k=false&l[]=undefined&l[]=0&m=cowboy+hat?", "huge structure" );
|
||||||
|
|
||||||
params = { a: [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { b: [ 7, [ 8, 9 ], [ { c: 10, d: 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { e: { f: { g: [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] };
|
params = { a: [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { b: [ 7, [ 8, 9 ], [ { c: 10, d: 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { e: { f: { g: [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] };
|
||||||
equals( decodeURIComponent( jQuery.param(params) ), "a[]=0&a[1][]=1&a[1][]=2&a[2][]=3&a[2][1][]=4&a[2][1][]=5&a[2][2][]=6&a[3][b][]=7&a[3][b][1][]=8&a[3][b][1][]=9&a[3][b][2][0][c]=10&a[3][b][2][0][d]=11&a[3][b][3][0][]=12&a[3][b][4][0][0][]=13&a[3][b][5][e][f][g][]=14&a[3][b][5][e][f][g][1][]=15&a[3][b][]=16&a[]=17", "nested arrays" );
|
equals( decodeURIComponent( jQuery.param(params) ), "a[]=0&a[1][]=1&a[1][]=2&a[2][]=3&a[2][1][]=4&a[2][1][]=5&a[2][2][]=6&a[3][b][]=7&a[3][b][1][]=8&a[3][b][1][]=9&a[3][b][2][0][c]=10&a[3][b][2][0][d]=11&a[3][b][3][0][]=12&a[3][b][4][0][0][]=13&a[3][b][5][e][f][g][]=14&a[3][b][5][e][f][g][1][]=15&a[3][b][]=16&a[]=17", "nested arrays" );
|
||||||
|
|
||||||
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
||||||
equals( jQuery.param(params,true), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=undefined&l=0&m=cowboy+hat%3F", "huge structure, forced traditional" );
|
equals( jQuery.param(params,true), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=undefined&l=0&m=cowboy+hat%3F", "huge structure, forced traditional" );
|
||||||
|
|
||||||
|
@ -898,7 +851,7 @@ test("jQuery.param()", function() {
|
||||||
equals( jQuery.param({"foo": {"bar": {}} }), "foo%5Bbar%5D=", "Empty object param" );
|
equals( jQuery.param({"foo": {"bar": {}} }), "foo%5Bbar%5D=", "Empty object param" );
|
||||||
|
|
||||||
jQuery.ajaxSetup({ traditional: true });
|
jQuery.ajaxSetup({ traditional: true });
|
||||||
|
|
||||||
var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
|
var params = {foo:"bar", baz:42, quux:"All your base are belong to us"};
|
||||||
equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );
|
equals( jQuery.param(params), "foo=bar&baz=42&quux=All+your+base+are+belong+to+us", "simple" );
|
||||||
|
|
||||||
|
@ -913,16 +866,16 @@ test("jQuery.param()", function() {
|
||||||
|
|
||||||
params = {"foo[bar]":"baz", "foo[beep]":42, "foo[quux]":"All your base are belong to us"};
|
params = {"foo[bar]":"baz", "foo[beep]":42, "foo[quux]":"All your base are belong to us"};
|
||||||
equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );
|
equals( jQuery.param(params), "foo%5Bbar%5D=baz&foo%5Bbeep%5D=42&foo%5Bquux%5D=All+your+base+are+belong+to+us", "even more arrays" );
|
||||||
|
|
||||||
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
||||||
equals( jQuery.param(params), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=undefined&l=0&m=cowboy+hat%3F", "huge structure" );
|
equals( jQuery.param(params), "a=1&a=2&b=%5Bobject+Object%5D&i=10&i=11&j=true&k=false&l=undefined&l=0&m=cowboy+hat%3F", "huge structure" );
|
||||||
|
|
||||||
params = { a: [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { b: [ 7, [ 8, 9 ], [ { c: 10, d: 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { e: { f: { g: [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] };
|
params = { a: [ 0, [ 1, 2 ], [ 3, [ 4, 5 ], [ 6 ] ], { b: [ 7, [ 8, 9 ], [ { c: 10, d: 11 } ], [ [ 12 ] ], [ [ [ 13 ] ] ], { e: { f: { g: [ 14, [ 15 ] ] } } }, 16 ] }, 17 ] };
|
||||||
equals( jQuery.param(params), "a=0&a=1%2C2&a=3%2C4%2C5%2C6&a=%5Bobject+Object%5D&a=17", "nested arrays (not possible when jQuery.param.traditional == true)" );
|
equals( jQuery.param(params), "a=0&a=1%2C2&a=3%2C4%2C5%2C6&a=%5Bobject+Object%5D&a=17", "nested arrays (not possible when jQuery.param.traditional == true)" );
|
||||||
|
|
||||||
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
params = { a:[1,2], b:{ c:3, d:[4,5], e:{ x:[6], y:7, z:[8,9] }, f:true, g:false, h:undefined }, i:[10,11], j:true, k:false, l:[undefined,0], m:"cowboy hat?" };
|
||||||
equals( decodeURIComponent( jQuery.param(params,false) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=undefined&i[]=10&i[]=11&j=true&k=false&l[]=undefined&l[]=0&m=cowboy+hat?", "huge structure, forced not traditional" );
|
equals( decodeURIComponent( jQuery.param(params,false) ), "a[]=1&a[]=2&b[c]=3&b[d][]=4&b[d][]=5&b[e][x][]=6&b[e][y]=7&b[e][z][]=8&b[e][z][]=9&b[f]=true&b[g]=false&b[h]=undefined&i[]=10&i[]=11&j=true&k=false&l[]=undefined&l[]=0&m=cowboy+hat?", "huge structure, forced not traditional" );
|
||||||
|
|
||||||
params = { param1: null };
|
params = { param1: null };
|
||||||
equals( jQuery.param(params,false), "param1=null", "Make sure that null params aren't traversed." );
|
equals( jQuery.param(params,false), "param1=null", "Make sure that null params aren't traversed." );
|
||||||
});
|
});
|
||||||
|
@ -971,7 +924,7 @@ test("pass-through request object", function() {
|
||||||
|
|
||||||
test("ajax cache", function () {
|
test("ajax cache", function () {
|
||||||
expect(18);
|
expect(18);
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
var count = 0;
|
var count = 0;
|
||||||
|
@ -1094,6 +1047,18 @@ test("load(String, Function) - check file with only a script tag", function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("load(String, Function) - dataFilter in ajaxSettings", function() {
|
||||||
|
expect(2);
|
||||||
|
stop();
|
||||||
|
jQuery.ajaxSetup({ dataFilter: function() { return "Hello World"; } });
|
||||||
|
var div = jQuery("<div/>").load(url("data/name.html"), function(responseText) {
|
||||||
|
strictEqual( div.html(), "Hello World" , "Test div was filled with filtered data" );
|
||||||
|
strictEqual( responseText, "Hello World" , "Test callback receives filtered data" );
|
||||||
|
jQuery.ajaxSetup({ dataFilter: 0 });
|
||||||
|
start();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test("load(String, Object, Function)", function() {
|
test("load(String, Object, Function)", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
stop();
|
stop();
|
||||||
|
@ -1150,10 +1115,10 @@ test("jQuery.getScript(String, Function) - no callback", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.ajax() - JSONP, Local", function() {
|
test("jQuery.ajax() - JSONP, Local", function() {
|
||||||
expect(9);
|
expect(14);
|
||||||
|
|
||||||
var count = 0;
|
var count = 0;
|
||||||
function plus(){ if ( ++count == 9 ) start(); }
|
function plus(){ if ( ++count == 14 ) start(); }
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
|
@ -1197,6 +1162,75 @@ test("jQuery.ajax() - JSONP, Local", function() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php?callback=??",
|
||||||
|
dataType: "jsonp",
|
||||||
|
success: function(data){
|
||||||
|
ok( data.data, "JSON results returned (GET, url context-free callback)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, url context-free callback)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php",
|
||||||
|
dataType: "jsonp",
|
||||||
|
data: "callback=??",
|
||||||
|
success: function(data){
|
||||||
|
ok( data.data, "JSON results returned (GET, data context-free callback)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, data context-free callback)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php/??",
|
||||||
|
dataType: "jsonp",
|
||||||
|
success: function(data){
|
||||||
|
ok( data.data, "JSON results returned (GET, REST-like)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, REST-like)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php/???json=1",
|
||||||
|
dataType: "jsonp",
|
||||||
|
success: function(data){
|
||||||
|
strictEqual( jQuery.type(data), "array", "JSON results returned (GET, REST-like with param)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, REST-like with param)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax({
|
||||||
|
url: "data/jsonp.php",
|
||||||
|
dataType: "jsonp",
|
||||||
|
data: {
|
||||||
|
callback: "?"
|
||||||
|
},
|
||||||
|
success: function(data){
|
||||||
|
ok( data.data, "JSON results returned (GET, processed data callback)" );
|
||||||
|
plus();
|
||||||
|
},
|
||||||
|
error: function(data){
|
||||||
|
ok( false, "Ajax error JSON (GET, processed data callback)" );
|
||||||
|
plus();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: "data/jsonp.php",
|
url: "data/jsonp.php",
|
||||||
dataType: "jsonp",
|
dataType: "jsonp",
|
||||||
|
@ -1384,7 +1418,7 @@ test("jQuery.ajax() - script, Remote with POST", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
|
|
||||||
var base = window.location.href.replace(/[^\/]*$/, "");
|
var base = window.location.href.replace(/[^\/]*$/, "");
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
|
@ -1482,12 +1516,12 @@ test("jQuery.ajax() - json by content-type disabled with options", function() {
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url("data/json.php"),
|
url: url("data/json.php"),
|
||||||
data: { header: "json", json: "array" },
|
data: { header: "json", json: "array" },
|
||||||
autoDataType: {
|
contents: {
|
||||||
json: false
|
json: false
|
||||||
},
|
},
|
||||||
success: function( text ) {
|
success: function( text ) {
|
||||||
equals( typeof text , "string" , "json wasn't auto-determined" );
|
equals( typeof text , "string" , "json wasn't auto-determined" );
|
||||||
var json = this.dataConverters["text => json"]( text );
|
var json = jQuery.parseJSON( text );
|
||||||
ok( json.length >= 2, "Check length");
|
ok( json.length >= 2, "Check length");
|
||||||
equals( json[0].name, 'John', 'Check JSON: first, name' );
|
equals( json[0].name, 'John', 'Check JSON: first, name' );
|
||||||
equals( json[0].age, 21, 'Check JSON: first, age' );
|
equals( json[0].age, 21, 'Check JSON: first, age' );
|
||||||
|
@ -1525,7 +1559,7 @@ test("jQuery.getJSON(String, Function) - JSON object", function() {
|
||||||
|
|
||||||
test("jQuery.getJSON - Using Native JSON", function() {
|
test("jQuery.getJSON - Using Native JSON", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
|
|
||||||
var old = window.JSON;
|
var old = window.JSON;
|
||||||
JSON = {
|
JSON = {
|
||||||
parse: function(str){
|
parse: function(str){
|
||||||
|
@ -1714,7 +1748,7 @@ test("data option: evaluate function values (#2806)", function() {
|
||||||
equals( result, "key=value" );
|
equals( result, "key=value" );
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("data option: empty bodies for non-GET requests", function() {
|
test("data option: empty bodies for non-GET requests", function() {
|
||||||
|
@ -1727,7 +1761,7 @@ test("data option: empty bodies for non-GET requests", function() {
|
||||||
equals( result, "" );
|
equals( result, "" );
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.ajax - If-Modified-Since support", function() {
|
test("jQuery.ajax - If-Modified-Since support", function() {
|
||||||
|
@ -1740,19 +1774,19 @@ test("jQuery.ajax - If-Modified-Since support", function() {
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url,
|
url: url,
|
||||||
ifModified: true,
|
ifModified: true,
|
||||||
success: function(data, status) {
|
success: function(data, status) {
|
||||||
equals(status, "success");
|
equals(status, "success");
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url,
|
url: url,
|
||||||
ifModified: true,
|
ifModified: true,
|
||||||
success: function(data, status) {
|
success: function(data, status) {
|
||||||
if ( data === "FAIL" ) {
|
if ( data === "FAIL" ) {
|
||||||
ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
|
ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
|
||||||
ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
|
ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
|
||||||
} else {
|
} else {
|
||||||
equals(status, "notmodified");
|
equals(status, "notmodified");
|
||||||
ok(data == null, "response body should be empty")
|
ok(data == null, "response body should be empty");
|
||||||
}
|
}
|
||||||
start();
|
start();
|
||||||
},
|
},
|
||||||
|
@ -1787,19 +1821,19 @@ test("jQuery.ajax - Etag support", function() {
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url,
|
url: url,
|
||||||
ifModified: true,
|
ifModified: true,
|
||||||
success: function(data, status) {
|
success: function(data, status) {
|
||||||
equals(status, "success");
|
equals(status, "success");
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url,
|
url: url,
|
||||||
ifModified: true,
|
ifModified: true,
|
||||||
success: function(data, status) {
|
success: function(data, status) {
|
||||||
if ( data === "FAIL" ) {
|
if ( data === "FAIL" ) {
|
||||||
ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
|
ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
|
||||||
ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
|
ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
|
||||||
} else {
|
} else {
|
||||||
equals(status, "notmodified");
|
equals(status, "notmodified");
|
||||||
ok(data == null, "response body should be empty")
|
ok(data == null, "response body should be empty");
|
||||||
}
|
}
|
||||||
start();
|
start();
|
||||||
},
|
},
|
||||||
|
@ -1826,38 +1860,44 @@ test("jQuery.ajax - Etag support", function() {
|
||||||
test("jQuery ajax - failing cross-domain", function() {
|
test("jQuery ajax - failing cross-domain", function() {
|
||||||
|
|
||||||
expect( 2 );
|
expect( 2 );
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
var i = 2;
|
var i = 2;
|
||||||
|
|
||||||
jQuery.ajax({
|
if ( jQuery.ajax({
|
||||||
url: 'http://somewebsitethatdoesnotexist.com',
|
url: 'http://somewebsitethatdoesnotexist-67864863574657654.com',
|
||||||
success: function(){ ok( false , "success" ); },
|
success: function(){ ok( false , "success" ); },
|
||||||
error: function(xhr,_,e){ ok( true , "file not found: " + xhr.status + " => " + e ); },
|
error: function(xhr,_,e){ ok( true , "file not found: " + xhr.status + " => " + e ); },
|
||||||
complete: function() { if ( ! --i ) start(); }
|
complete: function() { if ( ! --i ) start(); }
|
||||||
});
|
}) === false ) {
|
||||||
|
ok( true , "no transport" );
|
||||||
jQuery.ajax({
|
if ( ! --i ) start();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( jQuery.ajax({
|
||||||
url: 'http://www.google.com',
|
url: 'http://www.google.com',
|
||||||
success: function(){ ok( false , "success" ); },
|
success: function(){ ok( false , "success" ); },
|
||||||
error: function(xhr,_,e){ ok( true , "access denied: " + xhr.status + " => " + e ); },
|
error: function(xhr,_,e){ ok( true , "access denied: " + xhr.status + " => " + e ); },
|
||||||
complete: function() { if ( ! --i ) start(); }
|
complete: function() { if ( ! --i ) start(); }
|
||||||
});
|
}) === false ) {
|
||||||
|
ok( true , "no transport" );
|
||||||
|
if ( ! --i ) start();
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery ajax - atom+xml", function() {
|
test("jQuery ajax - atom+xml", function() {
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
jQuery.ajax({
|
jQuery.ajax({
|
||||||
url: url( 'data/atom+xml.php' ),
|
url: url( 'data/atom+xml.php' ),
|
||||||
success: function(){ ok( true , "success" ); },
|
success: function(){ ok( true , "success" ); },
|
||||||
error: function(){ ok( false , "error" ); },
|
error: function(){ ok( false , "error" ); },
|
||||||
complete: function() { start(); }
|
complete: function() { start(); }
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.ajax - active counter", function() {
|
test("jQuery.ajax - active counter", function() {
|
||||||
|
@ -1875,6 +1915,76 @@ test( "jQuery.ajax - Location object as url (#7531)", 1, function () {
|
||||||
ok( success, "document.location did not generate exception" );
|
ok( success, "document.location did not generate exception" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test( "jQuery.ajax - statusCode" , function() {
|
||||||
|
|
||||||
|
var count = 10;
|
||||||
|
|
||||||
|
expect( 16 );
|
||||||
|
stop();
|
||||||
|
|
||||||
|
function countComplete() {
|
||||||
|
if ( ! --count ) {
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function createStatusCodes( name , isSuccess ) {
|
||||||
|
name = "Test " + name + " " + ( isSuccess ? "success" : "error" );
|
||||||
|
return {
|
||||||
|
200: function() {
|
||||||
|
ok( isSuccess , name );
|
||||||
|
},
|
||||||
|
404: function() {
|
||||||
|
ok( ! isSuccess , name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery.each( {
|
||||||
|
"data/name.html": true,
|
||||||
|
"data/someFileThatDoesNotExist.html": false
|
||||||
|
} , function( uri , isSuccess ) {
|
||||||
|
|
||||||
|
jQuery.ajax( url( uri ) , {
|
||||||
|
statusCode: createStatusCodes( "in options" , isSuccess ),
|
||||||
|
complete: countComplete
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax( url( uri ) , {
|
||||||
|
complete: countComplete
|
||||||
|
}).statusCode( createStatusCodes( "immediately with method" , isSuccess ) );
|
||||||
|
|
||||||
|
jQuery.ajax( url( uri ) , {
|
||||||
|
complete: function(jXHR) {
|
||||||
|
jXHR.statusCode( createStatusCodes( "on complete" , isSuccess ) );
|
||||||
|
countComplete();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax( url( uri ) , {
|
||||||
|
complete: function(jXHR) {
|
||||||
|
setTimeout( function() {
|
||||||
|
jXHR.statusCode( createStatusCodes( "very late binding" , isSuccess ) );
|
||||||
|
countComplete();
|
||||||
|
} , 100 );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.ajax( url( uri ) , {
|
||||||
|
statusCode: createStatusCodes( "all (options)" , isSuccess ),
|
||||||
|
complete: function(jXHR) {
|
||||||
|
jXHR.statusCode( createStatusCodes( "all (on complete)" , isSuccess ) );
|
||||||
|
setTimeout( function() {
|
||||||
|
jXHR.statusCode( createStatusCodes( "all (very late binding)" , isSuccess ) );
|
||||||
|
countComplete();
|
||||||
|
} , 100 );
|
||||||
|
}
|
||||||
|
}).statusCode( createStatusCodes( "all (immediately with method)" , isSuccess ) );
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//}
|
//}
|
|
@ -4,13 +4,13 @@ var bareObj = function(value) { return value; };
|
||||||
var functionReturningObj = function(value) { return (function() { return value; }); };
|
var functionReturningObj = function(value) { return (function() { return value; }); };
|
||||||
|
|
||||||
test("jQuery.props: itegrity test", function() {
|
test("jQuery.props: itegrity test", function() {
|
||||||
|
|
||||||
expect(1);
|
expect(1);
|
||||||
|
|
||||||
// This must be maintained and equal jQuery.props
|
// This must be maintained and equal jQuery.props
|
||||||
// Ensure that accidental or erroneous property
|
// Ensure that accidental or erroneous property
|
||||||
// overwrites don't occur
|
// overwrites don't occur
|
||||||
// This is simply for better code coverage and future proofing.
|
// This is simply for better code coverage and future proofing.
|
||||||
var propsShouldBe = {
|
var propsShouldBe = {
|
||||||
"for": "htmlFor",
|
"for": "htmlFor",
|
||||||
"class": "className",
|
"class": "className",
|
||||||
|
@ -23,7 +23,7 @@ test("jQuery.props: itegrity test", function() {
|
||||||
usemap: "useMap",
|
usemap: "useMap",
|
||||||
frameborder: "frameBorder"
|
frameborder: "frameBorder"
|
||||||
};
|
};
|
||||||
|
|
||||||
same(propsShouldBe, jQuery.props, "jQuery.props passes integrity check");
|
same(propsShouldBe, jQuery.props, "jQuery.props passes integrity check");
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -33,7 +33,7 @@ test("attr(String)", function() {
|
||||||
|
|
||||||
// This one sometimes fails randomly ?!
|
// This one sometimes fails randomly ?!
|
||||||
equals( jQuery('#text1').attr('value'), "Test", 'Check for value attribute' );
|
equals( jQuery('#text1').attr('value'), "Test", 'Check for value attribute' );
|
||||||
|
|
||||||
equals( jQuery('#text1').attr('value', "Test2").attr('defaultValue'), "Test", 'Check for defaultValue attribute' );
|
equals( jQuery('#text1').attr('value', "Test2").attr('defaultValue'), "Test", 'Check for defaultValue attribute' );
|
||||||
equals( jQuery('#text1').attr('type'), "text", 'Check for type attribute' );
|
equals( jQuery('#text1').attr('type'), "text", 'Check for type attribute' );
|
||||||
equals( jQuery('#radio1').attr('type'), "radio", 'Check for type attribute' );
|
equals( jQuery('#radio1').attr('type'), "radio", 'Check for type attribute' );
|
||||||
|
@ -255,30 +255,30 @@ test("attr(String, Object)", function() {
|
||||||
|
|
||||||
test("attr(jquery_method)", function(){
|
test("attr(jquery_method)", function(){
|
||||||
expect(7);
|
expect(7);
|
||||||
|
|
||||||
var $elem = jQuery("<div />"),
|
var $elem = jQuery("<div />"),
|
||||||
elem = $elem[0];
|
elem = $elem[0];
|
||||||
|
|
||||||
// one at a time
|
// one at a time
|
||||||
$elem.attr({'html': 'foo'}, true);
|
$elem.attr({'html': 'foo'}, true);
|
||||||
equals( elem.innerHTML, 'foo', 'attr(html)');
|
equals( elem.innerHTML, 'foo', 'attr(html)');
|
||||||
|
|
||||||
$elem.attr({'text': 'bar'}, true);
|
$elem.attr({'text': 'bar'}, true);
|
||||||
equals( elem.innerHTML, 'bar', 'attr(text)');
|
equals( elem.innerHTML, 'bar', 'attr(text)');
|
||||||
|
|
||||||
$elem.attr({'css': {color:'red'}}, true);
|
$elem.attr({'css': {color:'red'}}, true);
|
||||||
ok( /^(#ff0000|red)$/i.test(elem.style.color), 'attr(css)');
|
ok( /^(#ff0000|red)$/i.test(elem.style.color), 'attr(css)');
|
||||||
|
|
||||||
$elem.attr({'height': 10}, true);
|
$elem.attr({'height': 10}, true);
|
||||||
equals( elem.style.height, '10px', 'attr(height)');
|
equals( elem.style.height, '10px', 'attr(height)');
|
||||||
|
|
||||||
// Multiple attributes
|
// Multiple attributes
|
||||||
|
|
||||||
$elem.attr({
|
$elem.attr({
|
||||||
width:10,
|
width:10,
|
||||||
css:{ paddingLeft:1, paddingRight:1 }
|
css:{ paddingLeft:1, paddingRight:1 }
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
equals( elem.style.width, '10px', 'attr({...})');
|
equals( elem.style.width, '10px', 'attr({...})');
|
||||||
equals( elem.style.paddingLeft, '1px', 'attr({...})');
|
equals( elem.style.paddingLeft, '1px', 'attr({...})');
|
||||||
equals( elem.style.paddingRight, '1px', 'attr({...})');
|
equals( elem.style.paddingRight, '1px', 'attr({...})');
|
||||||
|
@ -491,7 +491,7 @@ test( "val(Array of Numbers) (Bug #7123)", function() {
|
||||||
ok( elements[1].checked, "Second element was checked" );
|
ok( elements[1].checked, "Second element was checked" );
|
||||||
ok( !elements[2].checked, "Third element was unchecked" );
|
ok( !elements[2].checked, "Third element was unchecked" );
|
||||||
ok( !elements[3].checked, "Fourth element remained unchecked" );
|
ok( !elements[3].checked, "Fourth element remained unchecked" );
|
||||||
|
|
||||||
elements.remove();
|
elements.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -672,7 +672,7 @@ test("removeClass(Function) with incoming value", function() {
|
||||||
|
|
||||||
ok( !$divs.is('.test'), "Remove Class" );
|
ok( !$divs.is('.test'), "Remove Class" );
|
||||||
|
|
||||||
QUnit.reset();
|
QUnit.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
var testToggleClass = function(valueObj) {
|
var testToggleClass = function(valueObj) {
|
||||||
|
@ -740,21 +740,21 @@ test("toggleClass(Fucntion[, boolean]) with incoming value", function() {
|
||||||
|
|
||||||
var e = jQuery("#firstp"), old = e.attr("class");
|
var e = jQuery("#firstp"), old = e.attr("class");
|
||||||
ok( !e.is(".test"), "Assert class not present" );
|
ok( !e.is(".test"), "Assert class not present" );
|
||||||
|
|
||||||
e.toggleClass(function(i, val) {
|
e.toggleClass(function(i, val) {
|
||||||
equals( val, old, "Make sure the incoming value is correct." );
|
equals( val, old, "Make sure the incoming value is correct." );
|
||||||
return "test";
|
return "test";
|
||||||
});
|
});
|
||||||
ok( e.is(".test"), "Assert class present" );
|
ok( e.is(".test"), "Assert class present" );
|
||||||
|
|
||||||
old = e.attr("class");
|
old = e.attr("class");
|
||||||
|
|
||||||
e.toggleClass(function(i, val) {
|
e.toggleClass(function(i, val) {
|
||||||
equals( val, old, "Make sure the incoming value is correct." );
|
equals( val, old, "Make sure the incoming value is correct." );
|
||||||
return "test";
|
return "test";
|
||||||
});
|
});
|
||||||
ok( !e.is(".test"), "Assert class not present" );
|
ok( !e.is(".test"), "Assert class not present" );
|
||||||
|
|
||||||
old = e.attr("class");
|
old = e.attr("class");
|
||||||
|
|
||||||
// class name with a boolean
|
// class name with a boolean
|
||||||
|
@ -764,18 +764,18 @@ test("toggleClass(Fucntion[, boolean]) with incoming value", function() {
|
||||||
return "test";
|
return "test";
|
||||||
}, false );
|
}, false );
|
||||||
ok( !e.is(".test"), "Assert class not present" );
|
ok( !e.is(".test"), "Assert class not present" );
|
||||||
|
|
||||||
old = e.attr("class");
|
old = e.attr("class");
|
||||||
|
|
||||||
e.toggleClass(function(i, val, state) {
|
e.toggleClass(function(i, val, state) {
|
||||||
equals( val, old, "Make sure the incoming value is correct." );
|
equals( val, old, "Make sure the incoming value is correct." );
|
||||||
equals( state, true, "Make sure that the state is passed in." );
|
equals( state, true, "Make sure that the state is passed in." );
|
||||||
return "test";
|
return "test";
|
||||||
}, true );
|
}, true );
|
||||||
ok( e.is(".test"), "Assert class present" );
|
ok( e.is(".test"), "Assert class present" );
|
||||||
|
|
||||||
old = e.attr("class");
|
old = e.attr("class");
|
||||||
|
|
||||||
e.toggleClass(function(i, val, state) {
|
e.toggleClass(function(i, val, state) {
|
||||||
equals( val, old, "Make sure the incoming value is correct." );
|
equals( val, old, "Make sure the incoming value is correct." );
|
||||||
equals( state, false, "Make sure that the state is passed in." );
|
equals( state, false, "Make sure that the state is passed in." );
|
||||||
|
@ -790,25 +790,25 @@ test("toggleClass(Fucntion[, boolean]) with incoming value", function() {
|
||||||
|
|
||||||
test("addClass, removeClass, hasClass", function() {
|
test("addClass, removeClass, hasClass", function() {
|
||||||
expect(17);
|
expect(17);
|
||||||
|
|
||||||
var jq = jQuery("<p>Hi</p>"), x = jq[0];
|
var jq = jQuery("<p>Hi</p>"), x = jq[0];
|
||||||
|
|
||||||
jq.addClass("hi");
|
jq.addClass("hi");
|
||||||
equals( x.className, "hi", "Check single added class" );
|
equals( x.className, "hi", "Check single added class" );
|
||||||
|
|
||||||
jq.addClass("foo bar");
|
jq.addClass("foo bar");
|
||||||
equals( x.className, "hi foo bar", "Check more added classes" );
|
equals( x.className, "hi foo bar", "Check more added classes" );
|
||||||
|
|
||||||
jq.removeClass();
|
jq.removeClass();
|
||||||
equals( x.className, "", "Remove all classes" );
|
equals( x.className, "", "Remove all classes" );
|
||||||
|
|
||||||
jq.addClass("hi foo bar");
|
jq.addClass("hi foo bar");
|
||||||
jq.removeClass("foo");
|
jq.removeClass("foo");
|
||||||
equals( x.className, "hi bar", "Check removal of one class" );
|
equals( x.className, "hi bar", "Check removal of one class" );
|
||||||
|
|
||||||
ok( jq.hasClass("hi"), "Check has1" );
|
ok( jq.hasClass("hi"), "Check has1" );
|
||||||
ok( jq.hasClass("bar"), "Check has2" );
|
ok( jq.hasClass("bar"), "Check has2" );
|
||||||
|
|
||||||
var jq = jQuery("<p class='class1\nclass2\tcla.ss3\n\rclass4'></p>");
|
var jq = jQuery("<p class='class1\nclass2\tcla.ss3\n\rclass4'></p>");
|
||||||
ok( jq.hasClass("class1"), "Check hasClass with line feed" );
|
ok( jq.hasClass("class1"), "Check hasClass with line feed" );
|
||||||
ok( jq.is(".class1"), "Check is with line feed" );
|
ok( jq.is(".class1"), "Check is with line feed" );
|
||||||
|
@ -817,7 +817,7 @@ test("addClass, removeClass, hasClass", function() {
|
||||||
ok( jq.hasClass("cla.ss3"), "Check hasClass with dot" );
|
ok( jq.hasClass("cla.ss3"), "Check hasClass with dot" );
|
||||||
ok( jq.hasClass("class4"), "Check hasClass with carriage return" );
|
ok( jq.hasClass("class4"), "Check hasClass with carriage return" );
|
||||||
ok( jq.is(".class4"), "Check is with carriage return" );
|
ok( jq.is(".class4"), "Check is with carriage return" );
|
||||||
|
|
||||||
jq.removeClass("class2");
|
jq.removeClass("class2");
|
||||||
ok( jq.hasClass("class2")==false, "Check the class has been properly removed" );
|
ok( jq.hasClass("class2")==false, "Check the class has been properly removed" );
|
||||||
jq.removeClass("cla");
|
jq.removeClass("cla");
|
||||||
|
|
|
@ -12,7 +12,7 @@ test("Basic requirements", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery()", function() {
|
test("jQuery()", function() {
|
||||||
expect(23);
|
expect(24);
|
||||||
|
|
||||||
// Basic constructor's behavior
|
// Basic constructor's behavior
|
||||||
|
|
||||||
|
@ -84,6 +84,11 @@ test("jQuery()", function() {
|
||||||
|
|
||||||
exec = true;
|
exec = true;
|
||||||
elem.click();
|
elem.click();
|
||||||
|
|
||||||
|
for ( var i = 0; i < 3; ++i ) {
|
||||||
|
elem = jQuery("<input type='text' value='TEST' />");
|
||||||
|
}
|
||||||
|
equals( elem[0].defaultValue, "TEST", "Ensure cached nodes are cloned properly (Bug #6655)" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("selector state", function() {
|
test("selector state", function() {
|
||||||
|
@ -151,7 +156,7 @@ test("selector state", function() {
|
||||||
test = jQuery("#main").eq(0);
|
test = jQuery("#main").eq(0);
|
||||||
equals( test.selector, "#main.slice(0,1)", "#main eq Selector" );
|
equals( test.selector, "#main.slice(0,1)", "#main eq Selector" );
|
||||||
equals( test.context, document, "#main eq Context" );
|
equals( test.context, document, "#main eq Context" );
|
||||||
|
|
||||||
var d = "<div />";
|
var d = "<div />";
|
||||||
equals(
|
equals(
|
||||||
jQuery(d).appendTo(jQuery(d)).selector,
|
jQuery(d).appendTo(jQuery(d)).selector,
|
||||||
|
@ -253,38 +258,38 @@ test("isPlainObject", function() {
|
||||||
|
|
||||||
// The use case that we want to match
|
// The use case that we want to match
|
||||||
ok(jQuery.isPlainObject({}), "{}");
|
ok(jQuery.isPlainObject({}), "{}");
|
||||||
|
|
||||||
// Not objects shouldn't be matched
|
// Not objects shouldn't be matched
|
||||||
ok(!jQuery.isPlainObject(""), "string");
|
ok(!jQuery.isPlainObject(""), "string");
|
||||||
ok(!jQuery.isPlainObject(0) && !jQuery.isPlainObject(1), "number");
|
ok(!jQuery.isPlainObject(0) && !jQuery.isPlainObject(1), "number");
|
||||||
ok(!jQuery.isPlainObject(true) && !jQuery.isPlainObject(false), "boolean");
|
ok(!jQuery.isPlainObject(true) && !jQuery.isPlainObject(false), "boolean");
|
||||||
ok(!jQuery.isPlainObject(null), "null");
|
ok(!jQuery.isPlainObject(null), "null");
|
||||||
ok(!jQuery.isPlainObject(undefined), "undefined");
|
ok(!jQuery.isPlainObject(undefined), "undefined");
|
||||||
|
|
||||||
// Arrays shouldn't be matched
|
// Arrays shouldn't be matched
|
||||||
ok(!jQuery.isPlainObject([]), "array");
|
ok(!jQuery.isPlainObject([]), "array");
|
||||||
|
|
||||||
// Instantiated objects shouldn't be matched
|
// Instantiated objects shouldn't be matched
|
||||||
ok(!jQuery.isPlainObject(new Date), "new Date");
|
ok(!jQuery.isPlainObject(new Date), "new Date");
|
||||||
|
|
||||||
var fn = function(){};
|
var fn = function(){};
|
||||||
|
|
||||||
// Functions shouldn't be matched
|
// Functions shouldn't be matched
|
||||||
ok(!jQuery.isPlainObject(fn), "fn");
|
ok(!jQuery.isPlainObject(fn), "fn");
|
||||||
|
|
||||||
// Again, instantiated objects shouldn't be matched
|
// Again, instantiated objects shouldn't be matched
|
||||||
ok(!jQuery.isPlainObject(new fn), "new fn (no methods)");
|
ok(!jQuery.isPlainObject(new fn), "new fn (no methods)");
|
||||||
|
|
||||||
// Makes the function a little more realistic
|
// Makes the function a little more realistic
|
||||||
// (and harder to detect, incidentally)
|
// (and harder to detect, incidentally)
|
||||||
fn.prototype = {someMethod: function(){}};
|
fn.prototype = {someMethod: function(){}};
|
||||||
|
|
||||||
// Again, instantiated objects shouldn't be matched
|
// Again, instantiated objects shouldn't be matched
|
||||||
ok(!jQuery.isPlainObject(new fn), "new fn");
|
ok(!jQuery.isPlainObject(new fn), "new fn");
|
||||||
|
|
||||||
// DOM Element
|
// DOM Element
|
||||||
ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element");
|
ok(!jQuery.isPlainObject(document.createElement("div")), "DOM Element");
|
||||||
|
|
||||||
// Window
|
// Window
|
||||||
ok(!jQuery.isPlainObject(window), "window");
|
ok(!jQuery.isPlainObject(window), "window");
|
||||||
|
|
||||||
|
@ -298,7 +303,7 @@ test("isPlainObject", function() {
|
||||||
document.body.removeChild( iframe );
|
document.body.removeChild( iframe );
|
||||||
start();
|
start();
|
||||||
};
|
};
|
||||||
|
|
||||||
var doc = iframe.contentDocument || iframe.contentWindow.document;
|
var doc = iframe.contentDocument || iframe.contentWindow.document;
|
||||||
doc.open();
|
doc.open();
|
||||||
doc.write("<body onload='window.parent.iframeDone(Object);'>");
|
doc.write("<body onload='window.parent.iframeDone(Object);'>");
|
||||||
|
@ -659,7 +664,7 @@ test("jQuery.merge()", function() {
|
||||||
|
|
||||||
// Fixed at [5998], #3641
|
// Fixed at [5998], #3641
|
||||||
same( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)");
|
same( parse([-2,-1], [0,1,2]), [-2,-1,0,1,2], "Second array including a zero (falsy)");
|
||||||
|
|
||||||
// After fixing #5527
|
// After fixing #5527
|
||||||
same( parse([], [null, undefined]), [null, undefined], "Second array including null and undefined values");
|
same( parse([], [null, undefined]), [null, undefined], "Second array including null and undefined values");
|
||||||
same( parse({length:0}, [1,2]), {length:2, 0:1, 1:2}, "First array like");
|
same( parse({length:0}, [1,2]), {length:2, 0:1, 1:2}, "First array like");
|
||||||
|
@ -694,7 +699,7 @@ test("jQuery.extend(Object, Object)", function() {
|
||||||
equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" );
|
equals( deep1.foo2, document, "Make sure that a deep clone was not attempted on the document" );
|
||||||
|
|
||||||
ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" );
|
ok( jQuery.extend(true, {}, nestedarray).arr !== arr, "Deep extend of object must clone child array" );
|
||||||
|
|
||||||
// #5991
|
// #5991
|
||||||
ok( jQuery.isArray( jQuery.extend(true, { arr: {} }, nestedarray).arr ), "Cloned array heve to be an Array" );
|
ok( jQuery.isArray( jQuery.extend(true, { arr: {} }, nestedarray).arr ), "Cloned array heve to be an Array" );
|
||||||
ok( jQuery.isPlainObject( jQuery.extend(true, { arr: arr }, { arr: {} }).arr ), "Cloned object heve to be an plain object" );
|
ok( jQuery.isPlainObject( jQuery.extend(true, { arr: arr }, { arr: {} }).arr ), "Cloned object heve to be an plain object" );
|
||||||
|
@ -715,13 +720,13 @@ test("jQuery.extend(Object, Object)", function() {
|
||||||
empty = {};
|
empty = {};
|
||||||
jQuery.extend(true, empty, optionsWithCustomObject);
|
jQuery.extend(true, empty, optionsWithCustomObject);
|
||||||
ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" );
|
ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly (no methods)" );
|
||||||
|
|
||||||
// Makes the class a little more realistic
|
// Makes the class a little more realistic
|
||||||
myKlass.prototype = { someMethod: function(){} };
|
myKlass.prototype = { someMethod: function(){} };
|
||||||
empty = {};
|
empty = {};
|
||||||
jQuery.extend(true, empty, optionsWithCustomObject);
|
jQuery.extend(true, empty, optionsWithCustomObject);
|
||||||
ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly" );
|
ok( empty.foo && empty.foo.date === customObject, "Custom objects copy correctly" );
|
||||||
|
|
||||||
var ret = jQuery.extend(true, { foo: 4 }, { foo: new Number(5) } );
|
var ret = jQuery.extend(true, { foo: 4 }, { foo: new Number(5) } );
|
||||||
ok( ret.foo == 5, "Wrapped numbers copy correctly" );
|
ok( ret.foo == 5, "Wrapped numbers copy correctly" );
|
||||||
|
|
||||||
|
@ -849,10 +854,10 @@ test("jQuery.makeArray", function(){
|
||||||
|
|
||||||
test("jQuery.isEmptyObject", function(){
|
test("jQuery.isEmptyObject", function(){
|
||||||
expect(2);
|
expect(2);
|
||||||
|
|
||||||
equals(true, jQuery.isEmptyObject({}), "isEmptyObject on empty object literal" );
|
equals(true, jQuery.isEmptyObject({}), "isEmptyObject on empty object literal" );
|
||||||
equals(false, jQuery.isEmptyObject({a:1}), "isEmptyObject on non-empty object literal" );
|
equals(false, jQuery.isEmptyObject({a:1}), "isEmptyObject on non-empty object literal" );
|
||||||
|
|
||||||
// What about this ?
|
// What about this ?
|
||||||
// equals(true, jQuery.isEmptyObject(null), "isEmptyObject on null" );
|
// equals(true, jQuery.isEmptyObject(null), "isEmptyObject on null" );
|
||||||
});
|
});
|
||||||
|
@ -878,23 +883,23 @@ test("jQuery.proxy", function(){
|
||||||
|
|
||||||
test("jQuery.parseJSON", function(){
|
test("jQuery.parseJSON", function(){
|
||||||
expect(8);
|
expect(8);
|
||||||
|
|
||||||
equals( jQuery.parseJSON(), null, "Nothing in, null out." );
|
equals( jQuery.parseJSON(), null, "Nothing in, null out." );
|
||||||
equals( jQuery.parseJSON( null ), null, "Nothing in, null out." );
|
equals( jQuery.parseJSON( null ), null, "Nothing in, null out." );
|
||||||
equals( jQuery.parseJSON( "" ), null, "Nothing in, null out." );
|
equals( jQuery.parseJSON( "" ), null, "Nothing in, null out." );
|
||||||
|
|
||||||
same( jQuery.parseJSON("{}"), {}, "Plain object parsing." );
|
same( jQuery.parseJSON("{}"), {}, "Plain object parsing." );
|
||||||
same( jQuery.parseJSON('{"test":1}'), {"test":1}, "Plain object parsing." );
|
same( jQuery.parseJSON('{"test":1}'), {"test":1}, "Plain object parsing." );
|
||||||
|
|
||||||
same( jQuery.parseJSON('\n{"test":1}'), {"test":1}, "Make sure leading whitespaces are handled." );
|
same( jQuery.parseJSON('\n{"test":1}'), {"test":1}, "Make sure leading whitespaces are handled." );
|
||||||
|
|
||||||
try {
|
try {
|
||||||
jQuery.parseJSON("{a:1}");
|
jQuery.parseJSON("{a:1}");
|
||||||
ok( false, "Test malformed JSON string." );
|
ok( false, "Test malformed JSON string." );
|
||||||
} catch( e ) {
|
} catch( e ) {
|
||||||
ok( true, "Test malformed JSON string." );
|
ok( true, "Test malformed JSON string." );
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
jQuery.parseJSON("{'a':1}");
|
jQuery.parseJSON("{'a':1}");
|
||||||
ok( false, "Test malformed JSON string." );
|
ok( false, "Test malformed JSON string." );
|
||||||
|
@ -902,3 +907,159 @@ test("jQuery.parseJSON", function(){
|
||||||
ok( true, "Test malformed JSON string." );
|
ok( true, "Test malformed JSON string." );
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("jQuery._Deferred()", function() {
|
||||||
|
|
||||||
|
expect( 10 );
|
||||||
|
|
||||||
|
var deferred,
|
||||||
|
object,
|
||||||
|
test;
|
||||||
|
|
||||||
|
deferred = jQuery._Deferred();
|
||||||
|
|
||||||
|
test = false;
|
||||||
|
|
||||||
|
deferred.done( function( value ) {
|
||||||
|
equals( value , "value" , "Test pre-resolve callback" );
|
||||||
|
test = true;
|
||||||
|
} );
|
||||||
|
|
||||||
|
deferred.resolve( "value" );
|
||||||
|
|
||||||
|
ok( test , "Test pre-resolve callbacks called right away" );
|
||||||
|
|
||||||
|
test = false;
|
||||||
|
|
||||||
|
deferred.done( function( value ) {
|
||||||
|
equals( value , "value" , "Test post-resolve callback" );
|
||||||
|
test = true;
|
||||||
|
} );
|
||||||
|
|
||||||
|
ok( test , "Test post-resolve callbacks called right away" );
|
||||||
|
|
||||||
|
deferred.cancel();
|
||||||
|
|
||||||
|
test = true;
|
||||||
|
|
||||||
|
deferred.done( function() {
|
||||||
|
ok( false , "Cancel was ignored" );
|
||||||
|
test = false;
|
||||||
|
} );
|
||||||
|
|
||||||
|
ok( test , "Test cancel" );
|
||||||
|
|
||||||
|
deferred = jQuery._Deferred().resolve();
|
||||||
|
|
||||||
|
try {
|
||||||
|
deferred.done( function() {
|
||||||
|
throw "Error";
|
||||||
|
} , function() {
|
||||||
|
ok( true , "Test deferred do not cancel on exception" );
|
||||||
|
} );
|
||||||
|
} catch( e ) {
|
||||||
|
strictEqual( e , "Error" , "Test deferred propagates exceptions");
|
||||||
|
deferred.done();
|
||||||
|
}
|
||||||
|
|
||||||
|
test = "";
|
||||||
|
deferred = jQuery._Deferred().done( function() {
|
||||||
|
|
||||||
|
test += "A";
|
||||||
|
|
||||||
|
}, function() {
|
||||||
|
|
||||||
|
test += "B";
|
||||||
|
|
||||||
|
} ).resolve();
|
||||||
|
|
||||||
|
strictEqual( test , "AB" , "Test multiple done parameters" );
|
||||||
|
|
||||||
|
test = "";
|
||||||
|
|
||||||
|
deferred.done( function() {
|
||||||
|
|
||||||
|
deferred.done( function() {
|
||||||
|
|
||||||
|
test += "C";
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
test += "A";
|
||||||
|
|
||||||
|
}, function() {
|
||||||
|
|
||||||
|
test += "B";
|
||||||
|
} );
|
||||||
|
|
||||||
|
strictEqual( test , "ABC" , "Test done callbacks order" );
|
||||||
|
|
||||||
|
deferred = jQuery._Deferred();
|
||||||
|
|
||||||
|
deferred.fire( jQuery , [ document ] ).done( function( doc ) {
|
||||||
|
ok( this === jQuery && arguments.length === 1 && doc === document , "Test fire context & args" );
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("jQuery.Deferred()", function() {
|
||||||
|
|
||||||
|
expect( 4 );
|
||||||
|
|
||||||
|
jQuery.Deferred( function( defer ) {
|
||||||
|
strictEqual( this , defer , "Defer passed as this & first argument" );
|
||||||
|
this.resolve( "done" );
|
||||||
|
}).then( function( value ) {
|
||||||
|
strictEqual( value , "done" , "Passed function executed" );
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.Deferred().resolve().then( function() {
|
||||||
|
ok( true , "Success on resolve" );
|
||||||
|
}, function() {
|
||||||
|
ok( false , "Error on resolve" );
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery.Deferred().reject().then( function() {
|
||||||
|
ok( false , "Success on reject" );
|
||||||
|
}, function() {
|
||||||
|
ok( true , "Error on reject" );
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("jQuery.when()", function() {
|
||||||
|
|
||||||
|
expect( 21 );
|
||||||
|
|
||||||
|
// Some other objects
|
||||||
|
jQuery.each( {
|
||||||
|
|
||||||
|
"an empty string": "",
|
||||||
|
"a non-empty string": "some string",
|
||||||
|
"zero": 0,
|
||||||
|
"a number other than zero": 1,
|
||||||
|
"true": true,
|
||||||
|
"false": false,
|
||||||
|
"null": null,
|
||||||
|
"undefined": undefined,
|
||||||
|
"a plain object": {}
|
||||||
|
|
||||||
|
} , function( message , value ) {
|
||||||
|
|
||||||
|
ok( jQuery.isFunction( jQuery.when( value ).then( function( resolveValue ) {
|
||||||
|
strictEqual( resolveValue , value , "Test the promise was resolved with " + message );
|
||||||
|
} ).promise ) , "Test " + message + " triggers the creation of a new Promise" );
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
var cache, i;
|
||||||
|
|
||||||
|
for( i = 1 ; i < 4 ; i++ ) {
|
||||||
|
jQuery.when( cache || jQuery.Deferred( function() {
|
||||||
|
this.resolve( i );
|
||||||
|
}) ).then( function( value ) {
|
||||||
|
strictEqual( value , 1 , "Function executed" + ( i > 1 ? " only once" : "" ) );
|
||||||
|
cache = value;
|
||||||
|
}, function() {
|
||||||
|
ok( false , "Fail called" );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -178,24 +178,24 @@ if ( !jQuery.support.opacity ) {
|
||||||
|
|
||||||
test("css(String, Function)", function() {
|
test("css(String, Function)", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
|
|
||||||
var sizes = ["10px", "20px", "30px"];
|
var sizes = ["10px", "20px", "30px"];
|
||||||
|
|
||||||
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div>" +
|
"<div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div></div>")
|
"<div class='cssFunction'></div></div>")
|
||||||
.appendTo("body");
|
.appendTo("body");
|
||||||
|
|
||||||
var index = 0;
|
var index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").css("font-size", function() {
|
jQuery("#cssFunctionTest div").css("font-size", function() {
|
||||||
var size = sizes[index];
|
var size = sizes[index];
|
||||||
index++;
|
index++;
|
||||||
return size;
|
return size;
|
||||||
});
|
});
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").each(function() {
|
jQuery("#cssFunctionTest div").each(function() {
|
||||||
var computedSize = jQuery(this).css("font-size")
|
var computedSize = jQuery(this).css("font-size")
|
||||||
var expectedSize = sizes[index]
|
var expectedSize = sizes[index]
|
||||||
|
@ -208,24 +208,24 @@ test("css(String, Function)", function() {
|
||||||
|
|
||||||
test("css(String, Function) with incoming value", function() {
|
test("css(String, Function) with incoming value", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
|
|
||||||
var sizes = ["10px", "20px", "30px"];
|
var sizes = ["10px", "20px", "30px"];
|
||||||
|
|
||||||
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div>" +
|
"<div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div></div>")
|
"<div class='cssFunction'></div></div>")
|
||||||
.appendTo("body");
|
.appendTo("body");
|
||||||
|
|
||||||
var index = 0;
|
var index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").css("font-size", function() {
|
jQuery("#cssFunctionTest div").css("font-size", function() {
|
||||||
var size = sizes[index];
|
var size = sizes[index];
|
||||||
index++;
|
index++;
|
||||||
return size;
|
return size;
|
||||||
});
|
});
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").css("font-size", function(i, computedSize) {
|
jQuery("#cssFunctionTest div").css("font-size", function(i, computedSize) {
|
||||||
var expectedSize = sizes[index]
|
var expectedSize = sizes[index]
|
||||||
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
|
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
|
||||||
|
@ -238,61 +238,61 @@ test("css(String, Function) with incoming value", function() {
|
||||||
|
|
||||||
test("css(Object) where values are Functions", function() {
|
test("css(Object) where values are Functions", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
|
|
||||||
var sizes = ["10px", "20px", "30px"];
|
var sizes = ["10px", "20px", "30px"];
|
||||||
|
|
||||||
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div>" +
|
"<div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div></div>")
|
"<div class='cssFunction'></div></div>")
|
||||||
.appendTo("body");
|
.appendTo("body");
|
||||||
|
|
||||||
var index = 0;
|
var index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").css({fontSize: function() {
|
jQuery("#cssFunctionTest div").css({fontSize: function() {
|
||||||
var size = sizes[index];
|
var size = sizes[index];
|
||||||
index++;
|
index++;
|
||||||
return size;
|
return size;
|
||||||
}});
|
}});
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").each(function() {
|
jQuery("#cssFunctionTest div").each(function() {
|
||||||
var computedSize = jQuery(this).css("font-size")
|
var computedSize = jQuery(this).css("font-size")
|
||||||
var expectedSize = sizes[index]
|
var expectedSize = sizes[index]
|
||||||
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
|
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
|
||||||
index++;
|
index++;
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery("#cssFunctionTest").remove();
|
jQuery("#cssFunctionTest").remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
test("css(Object) where values are Functions with incoming values", function() {
|
test("css(Object) where values are Functions with incoming values", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
|
|
||||||
var sizes = ["10px", "20px", "30px"];
|
var sizes = ["10px", "20px", "30px"];
|
||||||
|
|
||||||
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
jQuery("<div id='cssFunctionTest'><div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div>" +
|
"<div class='cssFunction'></div>" +
|
||||||
"<div class='cssFunction'></div></div>")
|
"<div class='cssFunction'></div></div>")
|
||||||
.appendTo("body");
|
.appendTo("body");
|
||||||
|
|
||||||
var index = 0;
|
var index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").css({fontSize: function() {
|
jQuery("#cssFunctionTest div").css({fontSize: function() {
|
||||||
var size = sizes[index];
|
var size = sizes[index];
|
||||||
index++;
|
index++;
|
||||||
return size;
|
return size;
|
||||||
}});
|
}});
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
|
|
||||||
jQuery("#cssFunctionTest div").css({"font-size": function(i, computedSize) {
|
jQuery("#cssFunctionTest div").css({"font-size": function(i, computedSize) {
|
||||||
var expectedSize = sizes[index]
|
var expectedSize = sizes[index]
|
||||||
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
|
equals( computedSize, expectedSize, "Div #" + index + " should be " + expectedSize );
|
||||||
index++;
|
index++;
|
||||||
return computedSize;
|
return computedSize;
|
||||||
}});
|
}});
|
||||||
|
|
||||||
jQuery("#cssFunctionTest").remove();
|
jQuery("#cssFunctionTest").remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,21 @@ test("jQuery.data", function() {
|
||||||
ok( jQuery.data( window, "BAD" ), "Make sure that the value was set." );
|
ok( jQuery.data( window, "BAD" ), "Make sure that the value was set." );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("jQuery.hasData", function() {
|
||||||
|
expect(6);
|
||||||
|
|
||||||
|
function testData(obj) {
|
||||||
|
equals( jQuery.hasData(obj), false, "No data exists" );
|
||||||
|
jQuery.data( obj, "foo", "bar" );
|
||||||
|
equals( jQuery.hasData(obj), true, "Data exists" );
|
||||||
|
jQuery.removeData( obj, "foo" );
|
||||||
|
equals( jQuery.hasData(obj), false, "Data was removed" );
|
||||||
|
}
|
||||||
|
|
||||||
|
testData(document.createElement('div'));
|
||||||
|
testData({});
|
||||||
|
});
|
||||||
|
|
||||||
test(".data()", function() {
|
test(".data()", function() {
|
||||||
expect(5);
|
expect(5);
|
||||||
|
|
||||||
|
@ -180,7 +195,7 @@ test(".data(String) and .data(String, Object)", function() {
|
||||||
equals( $elem.data('emptyString','').data('emptyString'), '', "Empty strings are preserved");
|
equals( $elem.data('emptyString','').data('emptyString'), '', "Empty strings are preserved");
|
||||||
equals( $elem.data('false',false).data('false'), false, "false's are preserved");
|
equals( $elem.data('false',false).data('false'), false, "false's are preserved");
|
||||||
equals( $elem.data('exists'), true, "Existing data is returned" );
|
equals( $elem.data('exists'), true, "Existing data is returned" );
|
||||||
|
|
||||||
// Clean up
|
// Clean up
|
||||||
$elem.removeData();
|
$elem.removeData();
|
||||||
ok( jQuery.isEmptyObject( $elem[0] ), "removeData clears the object" );
|
ok( jQuery.isEmptyObject( $elem[0] ), "removeData clears the object" );
|
||||||
|
@ -191,7 +206,7 @@ test("data-* attributes", function() {
|
||||||
var div = jQuery("<div>"),
|
var div = jQuery("<div>"),
|
||||||
child = jQuery("<div data-myobj='old data' data-ignored=\"DOM\" data-other='test'></div>"),
|
child = jQuery("<div data-myobj='old data' data-ignored=\"DOM\" data-other='test'></div>"),
|
||||||
dummy = jQuery("<div data-myobj='old data' data-ignored=\"DOM\" data-other='test'></div>");
|
dummy = jQuery("<div data-myobj='old data' data-ignored=\"DOM\" data-other='test'></div>");
|
||||||
|
|
||||||
equals( div.data("attr"), undefined, "Check for non-existing data-attr attribute" );
|
equals( div.data("attr"), undefined, "Check for non-existing data-attr attribute" );
|
||||||
|
|
||||||
div.attr("data-attr", "exists");
|
div.attr("data-attr", "exists");
|
||||||
|
@ -199,10 +214,10 @@ test("data-* attributes", function() {
|
||||||
|
|
||||||
div.attr("data-attr", "exists2");
|
div.attr("data-attr", "exists2");
|
||||||
equals( div.data("attr"), "exists", "Check that updates to data- don't update .data()" );
|
equals( div.data("attr"), "exists", "Check that updates to data- don't update .data()" );
|
||||||
|
|
||||||
div.data("attr", "internal").attr("data-attr", "external");
|
div.data("attr", "internal").attr("data-attr", "external");
|
||||||
equals( div.data("attr"), "internal", "Check for .data('attr') precedence (internal > external data-* attribute)" );
|
equals( div.data("attr"), "internal", "Check for .data('attr') precedence (internal > external data-* attribute)" );
|
||||||
|
|
||||||
child.appendTo('#main');
|
child.appendTo('#main');
|
||||||
equals( child.data("myobj"), "old data", "Value accessed from data-* attribute");
|
equals( child.data("myobj"), "old data", "Value accessed from data-* attribute");
|
||||||
|
|
||||||
|
@ -249,7 +264,7 @@ test("data-* attributes", function() {
|
||||||
.attr("data-space", " ")
|
.attr("data-space", " ")
|
||||||
.attr("data-null", "null")
|
.attr("data-null", "null")
|
||||||
.attr("data-string", "test");
|
.attr("data-string", "test");
|
||||||
|
|
||||||
strictEqual( child.data('true'), true, "Primitive true read from attribute");
|
strictEqual( child.data('true'), true, "Primitive true read from attribute");
|
||||||
strictEqual( child.data('false'), false, "Primitive false read from attribute");
|
strictEqual( child.data('false'), false, "Primitive false read from attribute");
|
||||||
strictEqual( child.data('five'), 5, "Primitive number read from attribute");
|
strictEqual( child.data('five'), 5, "Primitive number read from attribute");
|
||||||
|
@ -265,7 +280,7 @@ test("data-* attributes", function() {
|
||||||
strictEqual( child.data('string'), "test", "Typical string read from attribute");
|
strictEqual( child.data('string'), "test", "Typical string read from attribute");
|
||||||
|
|
||||||
child.remove();
|
child.remove();
|
||||||
|
|
||||||
// tests from metadata plugin
|
// tests from metadata plugin
|
||||||
function testData(index, elem) {
|
function testData(index, elem) {
|
||||||
switch (index) {
|
switch (index) {
|
||||||
|
@ -289,10 +304,10 @@ test("data-* attributes", function() {
|
||||||
ok(false, ["Assertion failed on index ", index, ", with data ", data].join(''));
|
ok(false, ["Assertion failed on index ", index, ", with data ", data].join(''));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var metadata = '<ol><li class="test test2" data-foo="bar" data-bar="baz" data-arr="[1,2]">Some stuff</li><li class="test test2" data-test="bar" data-bar="baz">Some stuff</li><li class="test test2" data-zoooo="bar" data-bar=\'{"test":"baz"}\'>Some stuff</li><li class="test test2" data-number=true data-stuff="[2,8]">Some stuff</li></ol>',
|
var metadata = '<ol><li class="test test2" data-foo="bar" data-bar="baz" data-arr="[1,2]">Some stuff</li><li class="test test2" data-test="bar" data-bar="baz">Some stuff</li><li class="test test2" data-zoooo="bar" data-bar=\'{"test":"baz"}\'>Some stuff</li><li class="test test2" data-number=true data-stuff="[2,8]">Some stuff</li></ol>',
|
||||||
elem = jQuery(metadata).appendTo('#main');
|
elem = jQuery(metadata).appendTo('#main');
|
||||||
|
|
||||||
elem.find("li").each(testData);
|
elem.find("li").each(testData);
|
||||||
elem.remove();
|
elem.remove();
|
||||||
});
|
});
|
||||||
|
@ -305,12 +320,12 @@ test(".data(Object)", function() {
|
||||||
div.data({ "test": "in", "test2": "in2" });
|
div.data({ "test": "in", "test2": "in2" });
|
||||||
equals( div.data("test"), "in", "Verify setting an object in data" );
|
equals( div.data("test"), "in", "Verify setting an object in data" );
|
||||||
equals( div.data("test2"), "in2", "Verify setting an object in data" );
|
equals( div.data("test2"), "in2", "Verify setting an object in data" );
|
||||||
|
|
||||||
var obj = {test:"unset"},
|
var obj = {test:"unset"},
|
||||||
jqobj = jQuery(obj);
|
jqobj = jQuery(obj);
|
||||||
jqobj.data({ "test": "in", "test2": "in2" });
|
jqobj.data({ "test": "in", "test2": "in2" });
|
||||||
equals( obj.test, "in", "Verify setting an object on an object extends the object" );
|
equals( obj.test, "in", "Verify setting an object on an object extends the object" );
|
||||||
equals( obj.test2, "in2", "Verify setting an object on an object extends the object" );
|
equals( obj.test2, "in2", "Verify setting an object on an object extends the object" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.removeData", function() {
|
test("jQuery.removeData", function() {
|
||||||
|
@ -324,13 +339,13 @@ test("jQuery.removeData", function() {
|
||||||
jQuery.removeData( div );
|
jQuery.removeData( div );
|
||||||
ok( !jQuery.data(div, "test2"), "Make sure that the data property no longer exists." );
|
ok( !jQuery.data(div, "test2"), "Make sure that the data property no longer exists." );
|
||||||
ok( !div[ jQuery.expando ], "Make sure the expando no longer exists, as well." );
|
ok( !div[ jQuery.expando ], "Make sure the expando no longer exists, as well." );
|
||||||
|
|
||||||
var obj = {};
|
var obj = {};
|
||||||
jQuery.data(obj, "test", "testing");
|
jQuery.data(obj, "test", "testing");
|
||||||
equals( obj.test, "testing", "verify data on plain object");
|
equals( obj.test, "testing", "verify data on plain object");
|
||||||
jQuery.removeData(obj, "test");
|
jQuery.removeData(obj, "test");
|
||||||
equals( jQuery.data(obj, "test"), undefined, "Check removal of data on plain object" );
|
equals( jQuery.data(obj, "test"), undefined, "Check removal of data on plain object" );
|
||||||
equals( obj.test, undefined, "Check removal of data directly from plain object" );
|
equals( obj.test, undefined, "Check removal of data directly from plain object" );
|
||||||
|
|
||||||
jQuery.data( window, "BAD", true );
|
jQuery.data( window, "BAD", true );
|
||||||
jQuery.removeData( window, "BAD" );
|
jQuery.removeData( window, "BAD" );
|
||||||
|
|
|
@ -45,13 +45,13 @@ test("width() with function", function() {
|
||||||
|
|
||||||
test("width() with function args", function() {
|
test("width() with function args", function() {
|
||||||
expect( 2 );
|
expect( 2 );
|
||||||
|
|
||||||
var $div = jQuery("#nothiddendiv");
|
var $div = jQuery("#nothiddendiv");
|
||||||
$div.width( 30 ).width(function(i, width) {
|
$div.width( 30 ).width(function(i, width) {
|
||||||
equals( width, 30, "Make sure previous value is corrrect." );
|
equals( width, 30, "Make sure previous value is corrrect." );
|
||||||
return width + 1;
|
return width + 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
equals( $div.width(), 31, "Make sure value was modified correctly." );
|
equals( $div.width(), 31, "Make sure value was modified correctly." );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -92,13 +92,13 @@ test("height() with function", function() {
|
||||||
|
|
||||||
test("height() with function args", function() {
|
test("height() with function args", function() {
|
||||||
expect( 2 );
|
expect( 2 );
|
||||||
|
|
||||||
var $div = jQuery("#nothiddendiv");
|
var $div = jQuery("#nothiddendiv");
|
||||||
$div.height( 30 ).height(function(i, height) {
|
$div.height( 30 ).height(function(i, height) {
|
||||||
equals( height, 30, "Make sure previous value is corrrect." );
|
equals( height, 30, "Make sure previous value is corrrect." );
|
||||||
return height + 1;
|
return height + 1;
|
||||||
});
|
});
|
||||||
|
|
||||||
equals( $div.height(), 31, "Make sure value was modified correctly." );
|
equals( $div.height(), 31, "Make sure value was modified correctly." );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -112,13 +112,13 @@ test("innerWidth()", function() {
|
||||||
border: "2px solid #fff",
|
border: "2px solid #fff",
|
||||||
width: 30
|
width: 30
|
||||||
});
|
});
|
||||||
|
|
||||||
equals($div.innerWidth(), 30, "Test with margin and border");
|
equals($div.innerWidth(), 30, "Test with margin and border");
|
||||||
$div.css("padding", "20px");
|
$div.css("padding", "20px");
|
||||||
equals($div.innerWidth(), 70, "Test with margin, border and padding");
|
equals($div.innerWidth(), 70, "Test with margin, border and padding");
|
||||||
$div.hide();
|
$div.hide();
|
||||||
equals($div.innerWidth(), 70, "Test hidden div");
|
equals($div.innerWidth(), 70, "Test hidden div");
|
||||||
|
|
||||||
// reset styles
|
// reset styles
|
||||||
$div.css({ display: "", border: "", padding: "", width: "", height: "" });
|
$div.css({ display: "", border: "", padding: "", width: "", height: "" });
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ test("innerWidth()", function() {
|
||||||
|
|
||||||
test("innerHeight()", function() {
|
test("innerHeight()", function() {
|
||||||
expect(4);
|
expect(4);
|
||||||
|
|
||||||
var $div = jQuery("#nothiddendiv");
|
var $div = jQuery("#nothiddendiv");
|
||||||
// set styles
|
// set styles
|
||||||
$div.css({
|
$div.css({
|
||||||
|
@ -138,13 +138,13 @@ test("innerHeight()", function() {
|
||||||
border: "2px solid #fff",
|
border: "2px solid #fff",
|
||||||
height: 30
|
height: 30
|
||||||
});
|
});
|
||||||
|
|
||||||
equals($div.innerHeight(), 30, "Test with margin and border");
|
equals($div.innerHeight(), 30, "Test with margin and border");
|
||||||
$div.css("padding", "20px");
|
$div.css("padding", "20px");
|
||||||
equals($div.innerHeight(), 70, "Test with margin, border and padding");
|
equals($div.innerHeight(), 70, "Test with margin, border and padding");
|
||||||
$div.hide();
|
$div.hide();
|
||||||
equals($div.innerHeight(), 70, "Test hidden div");
|
equals($div.innerHeight(), 70, "Test hidden div");
|
||||||
|
|
||||||
// reset styles
|
// reset styles
|
||||||
$div.css({ display: "", border: "", padding: "", width: "", height: "" });
|
$div.css({ display: "", border: "", padding: "", width: "", height: "" });
|
||||||
|
|
||||||
|
@ -156,10 +156,10 @@ test("innerHeight()", function() {
|
||||||
|
|
||||||
test("outerWidth()", function() {
|
test("outerWidth()", function() {
|
||||||
expect(7);
|
expect(7);
|
||||||
|
|
||||||
var $div = jQuery("#nothiddendiv");
|
var $div = jQuery("#nothiddendiv");
|
||||||
$div.css("width", 30);
|
$div.css("width", 30);
|
||||||
|
|
||||||
equals($div.outerWidth(), 30, "Test with only width set");
|
equals($div.outerWidth(), 30, "Test with only width set");
|
||||||
$div.css("padding", "20px");
|
$div.css("padding", "20px");
|
||||||
equals($div.outerWidth(), 70, "Test with padding");
|
equals($div.outerWidth(), 70, "Test with padding");
|
||||||
|
@ -171,7 +171,7 @@ test("outerWidth()", function() {
|
||||||
equals($div.outerWidth(true), 94, "Test with padding, border and margin with margin option");
|
equals($div.outerWidth(true), 94, "Test with padding, border and margin with margin option");
|
||||||
$div.hide();
|
$div.hide();
|
||||||
equals($div.outerWidth(true), 94, "Test hidden div with padding, border and margin with margin option");
|
equals($div.outerWidth(true), 94, "Test hidden div with padding, border and margin with margin option");
|
||||||
|
|
||||||
// reset styles
|
// reset styles
|
||||||
$div.css({ position: "", display: "", border: "", padding: "", width: "", height: "" });
|
$div.css({ position: "", display: "", border: "", padding: "", width: "", height: "" });
|
||||||
|
|
||||||
|
@ -183,10 +183,10 @@ test("outerWidth()", function() {
|
||||||
|
|
||||||
test("outerHeight()", function() {
|
test("outerHeight()", function() {
|
||||||
expect(7);
|
expect(7);
|
||||||
|
|
||||||
var $div = jQuery("#nothiddendiv");
|
var $div = jQuery("#nothiddendiv");
|
||||||
$div.css("height", 30);
|
$div.css("height", 30);
|
||||||
|
|
||||||
equals($div.outerHeight(), 30, "Test with only width set");
|
equals($div.outerHeight(), 30, "Test with only width set");
|
||||||
$div.css("padding", "20px");
|
$div.css("padding", "20px");
|
||||||
equals($div.outerHeight(), 70, "Test with padding");
|
equals($div.outerHeight(), 70, "Test with padding");
|
||||||
|
@ -197,7 +197,7 @@ test("outerHeight()", function() {
|
||||||
equals($div.outerHeight(true), 94, "Test with padding, border and margin with margin option");
|
equals($div.outerHeight(true), 94, "Test with padding, border and margin with margin option");
|
||||||
$div.hide();
|
$div.hide();
|
||||||
equals($div.outerHeight(true), 94, "Test hidden div with padding, border and margin with margin option");
|
equals($div.outerHeight(true), 94, "Test hidden div with padding, border and margin with margin option");
|
||||||
|
|
||||||
// reset styles
|
// reset styles
|
||||||
$div.css({ display: "", border: "", padding: "", width: "", height: "" });
|
$div.css({ display: "", border: "", padding: "", width: "", height: "" });
|
||||||
|
|
||||||
|
|
43
test/unit/effects.js
vendored
43
test/unit/effects.js
vendored
|
@ -64,7 +64,7 @@ test("show()", function() {
|
||||||
|
|
||||||
// #show-tests * is set display: none in CSS
|
// #show-tests * is set display: none in CSS
|
||||||
jQuery("#main").append('<div id="show-tests"><div><p><a href="#"></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div><table id="test-table"></table>');
|
jQuery("#main").append('<div id="show-tests"><div><p><a href="#"></a></p><code></code><pre></pre><span></span></div><table><thead><tr><th></th></tr></thead><tbody><tr><td></td></tr></tbody></table><ul><li></li></ul></div><table id="test-table"></table>');
|
||||||
|
|
||||||
var old = jQuery("#test-table").show().css("display") !== "table";
|
var old = jQuery("#test-table").show().css("display") !== "table";
|
||||||
jQuery("#test-table").remove();
|
jQuery("#test-table").remove();
|
||||||
|
|
||||||
|
@ -140,15 +140,15 @@ test("Persist correct display value", function() {
|
||||||
|
|
||||||
// #show-tests * is set display: none in CSS
|
// #show-tests * is set display: none in CSS
|
||||||
jQuery("#main").append('<div id="show-tests"><span style="position:absolute;">foo</span></div>');
|
jQuery("#main").append('<div id="show-tests"><span style="position:absolute;">foo</span></div>');
|
||||||
|
|
||||||
var $span = jQuery("#show-tests span"),
|
var $span = jQuery("#show-tests span"),
|
||||||
displayNone = $span.css("display"),
|
displayNone = $span.css("display"),
|
||||||
display = '', num = 0;
|
display = '', num = 0;
|
||||||
|
|
||||||
$span.show();
|
$span.show();
|
||||||
|
|
||||||
display = $span.css("display");
|
display = $span.css("display");
|
||||||
|
|
||||||
$span.hide();
|
$span.hide();
|
||||||
|
|
||||||
$span.fadeIn(100, function() {
|
$span.fadeIn(100, function() {
|
||||||
|
@ -156,13 +156,13 @@ test("Persist correct display value", function() {
|
||||||
equals($span.css("display"), display, "Expecting display: " + display);
|
equals($span.css("display"), display, "Expecting display: " + display);
|
||||||
|
|
||||||
$span.fadeOut(100, function () {
|
$span.fadeOut(100, function () {
|
||||||
|
|
||||||
equals($span.css("display"), displayNone, "Expecting display: " + displayNone);
|
equals($span.css("display"), displayNone, "Expecting display: " + displayNone);
|
||||||
|
|
||||||
$span.fadeIn(100, function() {
|
$span.fadeIn(100, function() {
|
||||||
|
|
||||||
equals($span.css("display"), display, "Expecting display: " + display);
|
equals($span.css("display"), display, "Expecting display: " + display);
|
||||||
|
|
||||||
start();
|
start();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -194,7 +194,7 @@ test("animate block as inline width/height", function() {
|
||||||
|
|
||||||
var span = jQuery("<span>").css("display", "inline-block").appendTo("body"),
|
var span = jQuery("<span>").css("display", "inline-block").appendTo("body"),
|
||||||
expected = span.css("display");
|
expected = span.css("display");
|
||||||
|
|
||||||
span.remove();
|
span.remove();
|
||||||
|
|
||||||
if ( jQuery.support.inlineBlockNeedsLayout || expected === "inline-block" ) {
|
if ( jQuery.support.inlineBlockNeedsLayout || expected === "inline-block" ) {
|
||||||
|
@ -220,7 +220,7 @@ test("animate native inline width/height", function() {
|
||||||
|
|
||||||
var span = jQuery("<span>").css("display", "inline-block").appendTo("body"),
|
var span = jQuery("<span>").css("display", "inline-block").appendTo("body"),
|
||||||
expected = span.css("display");
|
expected = span.css("display");
|
||||||
|
|
||||||
span.remove();
|
span.remove();
|
||||||
|
|
||||||
if ( jQuery.support.inlineBlockNeedsLayout || expected === "inline-block" ) {
|
if ( jQuery.support.inlineBlockNeedsLayout || expected === "inline-block" ) {
|
||||||
|
@ -560,6 +560,23 @@ jQuery.checkOverflowDisplay = function(){
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("support negative values < -10000 (bug #7193)", function () {
|
||||||
|
expect(1);
|
||||||
|
stop();
|
||||||
|
|
||||||
|
jQuery.extend(jQuery.fx.step, {
|
||||||
|
"marginBottom": function(fx) {
|
||||||
|
equals( fx.cur(), -11000, "Element has margin-bottom of -11000" );
|
||||||
|
delete jQuery.fx.step.marginBottom;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
jQuery("#main").css("marginBottom", "-11000px").animate({ marginBottom: "-11001px" }, {
|
||||||
|
duration: 1,
|
||||||
|
complete: start
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test("JS Overflow and Display", function() {
|
test("JS Overflow and Display", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
stop();
|
stop();
|
||||||
|
@ -889,7 +906,7 @@ test("hide hidden elements, with animation (bug #7141)", function() {
|
||||||
expect(3);
|
expect(3);
|
||||||
QUnit.reset();
|
QUnit.reset();
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
var div = jQuery("<div style='display:none'></div>").appendTo("#main");
|
var div = jQuery("<div style='display:none'></div>").appendTo("#main");
|
||||||
equals( div.css("display"), "none", "Element is hidden by default" );
|
equals( div.css("display"), "none", "Element is hidden by default" );
|
||||||
div.hide(1, function () {
|
div.hide(1, function () {
|
||||||
|
|
|
@ -4,20 +4,20 @@ test("null or undefined handler", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
// Supports Fixes bug #7229
|
// Supports Fixes bug #7229
|
||||||
try {
|
try {
|
||||||
|
|
||||||
jQuery("#firstp").click(null);
|
jQuery("#firstp").click(null);
|
||||||
|
|
||||||
ok(true, "Passing a null handler will not throw an exception");
|
ok(true, "Passing a null handler will not throw an exception");
|
||||||
|
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
jQuery("#firstp").click(undefined);
|
jQuery("#firstp").click(undefined);
|
||||||
|
|
||||||
ok(true, "Passing an undefined handler will not throw an exception");
|
ok(true, "Passing an undefined handler will not throw an exception");
|
||||||
|
|
||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
});
|
});
|
||||||
|
|
||||||
test("bind(), with data", function() {
|
test("bind(), with data", function() {
|
||||||
|
@ -175,7 +175,7 @@ test("bind(), no data", function() {
|
||||||
|
|
||||||
test("bind/one/unbind(Object)", function(){
|
test("bind/one/unbind(Object)", function(){
|
||||||
expect(6);
|
expect(6);
|
||||||
|
|
||||||
var clickCounter = 0, mouseoverCounter = 0;
|
var clickCounter = 0, mouseoverCounter = 0;
|
||||||
function handler(event) {
|
function handler(event) {
|
||||||
if (event.type == "click")
|
if (event.type == "click")
|
||||||
|
@ -183,18 +183,18 @@ test("bind/one/unbind(Object)", function(){
|
||||||
else if (event.type == "mouseover")
|
else if (event.type == "mouseover")
|
||||||
mouseoverCounter++;
|
mouseoverCounter++;
|
||||||
};
|
};
|
||||||
|
|
||||||
function handlerWithData(event) {
|
function handlerWithData(event) {
|
||||||
if (event.type == "click")
|
if (event.type == "click")
|
||||||
clickCounter += event.data;
|
clickCounter += event.data;
|
||||||
else if (event.type == "mouseover")
|
else if (event.type == "mouseover")
|
||||||
mouseoverCounter += event.data;
|
mouseoverCounter += event.data;
|
||||||
};
|
};
|
||||||
|
|
||||||
function trigger(){
|
function trigger(){
|
||||||
$elem.trigger("click").trigger("mouseover");
|
$elem.trigger("click").trigger("mouseover");
|
||||||
}
|
}
|
||||||
|
|
||||||
var $elem = jQuery("#firstp")
|
var $elem = jQuery("#firstp")
|
||||||
// Regular bind
|
// Regular bind
|
||||||
.bind({
|
.bind({
|
||||||
|
@ -206,16 +206,16 @@ test("bind/one/unbind(Object)", function(){
|
||||||
click:handlerWithData,
|
click:handlerWithData,
|
||||||
mouseover:handlerWithData
|
mouseover:handlerWithData
|
||||||
}, 2 );
|
}, 2 );
|
||||||
|
|
||||||
trigger();
|
trigger();
|
||||||
|
|
||||||
equals( clickCounter, 3, "bind(Object)" );
|
equals( clickCounter, 3, "bind(Object)" );
|
||||||
equals( mouseoverCounter, 3, "bind(Object)" );
|
equals( mouseoverCounter, 3, "bind(Object)" );
|
||||||
|
|
||||||
trigger();
|
trigger();
|
||||||
equals( clickCounter, 4, "bind(Object)" );
|
equals( clickCounter, 4, "bind(Object)" );
|
||||||
equals( mouseoverCounter, 4, "bind(Object)" );
|
equals( mouseoverCounter, 4, "bind(Object)" );
|
||||||
|
|
||||||
jQuery("#firstp").unbind({
|
jQuery("#firstp").unbind({
|
||||||
click:handler,
|
click:handler,
|
||||||
mouseover:handler
|
mouseover:handler
|
||||||
|
@ -228,10 +228,10 @@ test("bind/one/unbind(Object)", function(){
|
||||||
|
|
||||||
test("live/die(Object), delegate/undelegate(String, Object)", function() {
|
test("live/die(Object), delegate/undelegate(String, Object)", function() {
|
||||||
expect(6);
|
expect(6);
|
||||||
|
|
||||||
var clickCounter = 0, mouseoverCounter = 0,
|
var clickCounter = 0, mouseoverCounter = 0,
|
||||||
$p = jQuery("#firstp"), $a = $p.find("a:first");
|
$p = jQuery("#firstp"), $a = $p.find("a:first");
|
||||||
|
|
||||||
var events = {
|
var events = {
|
||||||
click: function( event ) {
|
click: function( event ) {
|
||||||
clickCounter += ( event.data || 1 );
|
clickCounter += ( event.data || 1 );
|
||||||
|
@ -240,26 +240,26 @@ test("live/die(Object), delegate/undelegate(String, Object)", function() {
|
||||||
mouseoverCounter += ( event.data || 1 );
|
mouseoverCounter += ( event.data || 1 );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function trigger() {
|
function trigger() {
|
||||||
$a.trigger("click").trigger("mouseover");
|
$a.trigger("click").trigger("mouseover");
|
||||||
}
|
}
|
||||||
|
|
||||||
$a.live( events );
|
$a.live( events );
|
||||||
$p.delegate( "a", events, 2 );
|
$p.delegate( "a", events, 2 );
|
||||||
|
|
||||||
trigger();
|
trigger();
|
||||||
equals( clickCounter, 3, "live/delegate" );
|
equals( clickCounter, 3, "live/delegate" );
|
||||||
equals( mouseoverCounter, 3, "live/delegate" );
|
equals( mouseoverCounter, 3, "live/delegate" );
|
||||||
|
|
||||||
$p.undelegate( "a", events );
|
$p.undelegate( "a", events );
|
||||||
|
|
||||||
trigger();
|
trigger();
|
||||||
equals( clickCounter, 4, "undelegate" );
|
equals( clickCounter, 4, "undelegate" );
|
||||||
equals( mouseoverCounter, 4, "undelegate" );
|
equals( mouseoverCounter, 4, "undelegate" );
|
||||||
|
|
||||||
$a.die( events );
|
$a.die( events );
|
||||||
|
|
||||||
trigger();
|
trigger();
|
||||||
equals( clickCounter, 4, "die" );
|
equals( clickCounter, 4, "die" );
|
||||||
equals( mouseoverCounter, 4, "die" );
|
equals( mouseoverCounter, 4, "die" );
|
||||||
|
@ -267,12 +267,12 @@ test("live/die(Object), delegate/undelegate(String, Object)", function() {
|
||||||
|
|
||||||
test("live/delegate immediate propagation", function() {
|
test("live/delegate immediate propagation", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
|
|
||||||
var $p = jQuery("#firstp"), $a = $p.find("a:first"), lastClick;
|
var $p = jQuery("#firstp"), $a = $p.find("a:first"), lastClick;
|
||||||
|
|
||||||
lastClick = "";
|
lastClick = "";
|
||||||
$a.live( "click", function(e) {
|
$a.live( "click", function(e) {
|
||||||
lastClick = "click1";
|
lastClick = "click1";
|
||||||
e.stopImmediatePropagation();
|
e.stopImmediatePropagation();
|
||||||
});
|
});
|
||||||
$a.live( "click", function(e) {
|
$a.live( "click", function(e) {
|
||||||
|
@ -281,10 +281,10 @@ test("live/delegate immediate propagation", function() {
|
||||||
$a.trigger( "click" );
|
$a.trigger( "click" );
|
||||||
equals( lastClick, "click1", "live stopImmediatePropagation" );
|
equals( lastClick, "click1", "live stopImmediatePropagation" );
|
||||||
$a.die( "click" );
|
$a.die( "click" );
|
||||||
|
|
||||||
lastClick = "";
|
lastClick = "";
|
||||||
$p.delegate( "a", "click", function(e) {
|
$p.delegate( "a", "click", function(e) {
|
||||||
lastClick = "click1";
|
lastClick = "click1";
|
||||||
e.stopImmediatePropagation();
|
e.stopImmediatePropagation();
|
||||||
});
|
});
|
||||||
$p.delegate( "a", "click", function(e) {
|
$p.delegate( "a", "click", function(e) {
|
||||||
|
@ -295,10 +295,45 @@ test("live/delegate immediate propagation", function() {
|
||||||
$p.undelegate( "click" );
|
$p.undelegate( "click" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("bind/delegate bubbling, isDefaultPrevented (Bug #7793)", function() {
|
||||||
|
expect(2);
|
||||||
|
var $anchor2 = jQuery( "#anchor2" ),
|
||||||
|
$main = jQuery( "#main" ),
|
||||||
|
fakeClick = function($jq) {
|
||||||
|
// Use a native click so we don't get jQuery simulated bubbling
|
||||||
|
if ( document.createEvent ) {
|
||||||
|
var e = document.createEvent( "MouseEvents" );
|
||||||
|
e.initEvent( "click", true, true );
|
||||||
|
$jq[0].dispatchEvent(e);
|
||||||
|
}
|
||||||
|
else if ( $jq[0].click ) {
|
||||||
|
$jq[0].click(); // IE
|
||||||
|
}
|
||||||
|
};
|
||||||
|
$anchor2.click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
$main.delegate("#foo", "click", function(e) {
|
||||||
|
equals( e.isDefaultPrevented(), true, "isDefaultPrevented true passed to bubbled event" );
|
||||||
|
});
|
||||||
|
fakeClick( $anchor2 );
|
||||||
|
$anchor2.unbind( "click" );
|
||||||
|
$main.undelegate( "click" );
|
||||||
|
$anchor2.click(function(e) {
|
||||||
|
// Let the default action occur
|
||||||
|
});
|
||||||
|
$main.delegate("#foo", "click", function(e) {
|
||||||
|
equals( e.isDefaultPrevented(), false, "isDefaultPrevented false passed to bubbled event" );
|
||||||
|
});
|
||||||
|
fakeClick( $anchor2 );
|
||||||
|
$anchor2.unbind( "click" );
|
||||||
|
$main.undelegate( "click" );
|
||||||
|
});
|
||||||
|
|
||||||
test("bind(), iframes", function() {
|
test("bind(), iframes", function() {
|
||||||
// events don't work with iframes, see #939 - this test fails in IE because of contentDocument
|
// events don't work with iframes, see #939 - this test fails in IE because of contentDocument
|
||||||
var doc = jQuery("#loadediframe").contents();
|
var doc = jQuery("#loadediframe").contents();
|
||||||
|
|
||||||
jQuery("div", doc).bind("click", function() {
|
jQuery("div", doc).bind("click", function() {
|
||||||
ok( true, "Binding to element inside iframe" );
|
ok( true, "Binding to element inside iframe" );
|
||||||
}).click().unbind('click');
|
}).click().unbind('click');
|
||||||
|
@ -360,7 +395,7 @@ test("bind(), namespaced events, cloned events", function() {
|
||||||
|
|
||||||
test("bind(), multi-namespaced events", function() {
|
test("bind(), multi-namespaced events", function() {
|
||||||
expect(6);
|
expect(6);
|
||||||
|
|
||||||
var order = [
|
var order = [
|
||||||
"click.test.abc",
|
"click.test.abc",
|
||||||
"click.test.abc",
|
"click.test.abc",
|
||||||
|
@ -369,7 +404,7 @@ test("bind(), multi-namespaced events", function() {
|
||||||
"click.test",
|
"click.test",
|
||||||
"custom.test2"
|
"custom.test2"
|
||||||
];
|
];
|
||||||
|
|
||||||
function check(name, msg){
|
function check(name, msg){
|
||||||
same(name, order.shift(), msg);
|
same(name, order.shift(), msg);
|
||||||
}
|
}
|
||||||
|
@ -389,7 +424,7 @@ test("bind(), multi-namespaced events", function() {
|
||||||
jQuery("#firstp").bind("click.test.abc",function(e){
|
jQuery("#firstp").bind("click.test.abc",function(e){
|
||||||
check("click.test.abc", "Namespaced click triggered");
|
check("click.test.abc", "Namespaced click triggered");
|
||||||
});
|
});
|
||||||
|
|
||||||
// Those would not trigger/unbind (#5303)
|
// Those would not trigger/unbind (#5303)
|
||||||
jQuery("#firstp").trigger("click.a.test");
|
jQuery("#firstp").trigger("click.a.test");
|
||||||
jQuery("#firstp").unbind("click.a.test");
|
jQuery("#firstp").unbind("click.a.test");
|
||||||
|
@ -453,7 +488,7 @@ test("bind(), make sure order is maintained", function() {
|
||||||
|
|
||||||
elem.unbind("click");
|
elem.unbind("click");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("bind(), with different this object", function() {
|
test("bind(), with different this object", function() {
|
||||||
expect(4);
|
expect(4);
|
||||||
var thisObject = { myThis: true },
|
var thisObject = { myThis: true },
|
||||||
|
@ -465,7 +500,7 @@ test("bind(), with different this object", function() {
|
||||||
equals( this, thisObject, "bind() with different this object and data" );
|
equals( this, thisObject, "bind() with different this object and data" );
|
||||||
equals( event.data, data, "bind() with different this object and data" );
|
equals( event.data, data, "bind() with different this object and data" );
|
||||||
};
|
};
|
||||||
|
|
||||||
jQuery("#firstp")
|
jQuery("#firstp")
|
||||||
.bind("click", jQuery.proxy(handler1, thisObject)).click().unbind("click", handler1)
|
.bind("click", jQuery.proxy(handler1, thisObject)).click().unbind("click", handler1)
|
||||||
.bind("click", data, jQuery.proxy(handler2, thisObject)).click().unbind("click", handler2);
|
.bind("click", data, jQuery.proxy(handler2, thisObject)).click().unbind("click", handler2);
|
||||||
|
@ -531,29 +566,29 @@ test("bind()/trigger()/unbind() on plain object", function() {
|
||||||
|
|
||||||
// Make sure it doesn't complain when no events are found
|
// Make sure it doesn't complain when no events are found
|
||||||
jQuery(obj).unbind("test");
|
jQuery(obj).unbind("test");
|
||||||
|
|
||||||
equals( obj.__events__, undefined, "Make sure events object is removed" );
|
equals( obj.__events__, undefined, "Make sure events object is removed" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("unbind(type)", function() {
|
test("unbind(type)", function() {
|
||||||
expect( 0 );
|
expect( 0 );
|
||||||
|
|
||||||
var $elem = jQuery("#firstp"),
|
var $elem = jQuery("#firstp"),
|
||||||
message;
|
message;
|
||||||
|
|
||||||
function error(){
|
function error(){
|
||||||
ok( false, message );
|
ok( false, message );
|
||||||
}
|
}
|
||||||
|
|
||||||
message = "unbind passing function";
|
message = "unbind passing function";
|
||||||
$elem.bind('error1', error).unbind('error1',error).triggerHandler('error1');
|
$elem.bind('error1', error).unbind('error1',error).triggerHandler('error1');
|
||||||
|
|
||||||
message = "unbind all from event";
|
message = "unbind all from event";
|
||||||
$elem.bind('error1', error).unbind('error1').triggerHandler('error1');
|
$elem.bind('error1', error).unbind('error1').triggerHandler('error1');
|
||||||
|
|
||||||
message = "unbind all";
|
message = "unbind all";
|
||||||
$elem.bind('error1', error).unbind().triggerHandler('error1');
|
$elem.bind('error1', error).unbind().triggerHandler('error1');
|
||||||
|
|
||||||
message = "unbind many with function";
|
message = "unbind many with function";
|
||||||
$elem.bind('error1 error2',error)
|
$elem.bind('error1 error2',error)
|
||||||
.unbind('error1 error2', error )
|
.unbind('error1 error2', error )
|
||||||
|
@ -563,7 +598,7 @@ test("unbind(type)", function() {
|
||||||
$elem.bind('error1 error2',error)
|
$elem.bind('error1 error2',error)
|
||||||
.unbind('error1 error2')
|
.unbind('error1 error2')
|
||||||
.trigger('error1').triggerHandler('error2');
|
.trigger('error1').triggerHandler('error2');
|
||||||
|
|
||||||
message = "unbind without a type or handler";
|
message = "unbind without a type or handler";
|
||||||
$elem.bind("error1 error2.test",error)
|
$elem.bind("error1 error2.test",error)
|
||||||
.unbind()
|
.unbind()
|
||||||
|
@ -572,7 +607,7 @@ test("unbind(type)", function() {
|
||||||
|
|
||||||
test("unbind(eventObject)", function() {
|
test("unbind(eventObject)", function() {
|
||||||
expect(4);
|
expect(4);
|
||||||
|
|
||||||
var $elem = jQuery("#firstp"),
|
var $elem = jQuery("#firstp"),
|
||||||
num;
|
num;
|
||||||
|
|
||||||
|
@ -581,7 +616,7 @@ test("unbind(eventObject)", function() {
|
||||||
$elem.trigger('foo').triggerHandler('bar');
|
$elem.trigger('foo').triggerHandler('bar');
|
||||||
equals( num, expected, "Check the right handlers are triggered" );
|
equals( num, expected, "Check the right handlers are triggered" );
|
||||||
}
|
}
|
||||||
|
|
||||||
$elem
|
$elem
|
||||||
// This handler shouldn't be unbound
|
// This handler shouldn't be unbound
|
||||||
.bind('foo', function(){
|
.bind('foo', function(){
|
||||||
|
@ -595,14 +630,14 @@ test("unbind(eventObject)", function() {
|
||||||
.bind('bar', function(){
|
.bind('bar', function(){
|
||||||
num += 4;
|
num += 4;
|
||||||
});
|
});
|
||||||
|
|
||||||
assert( 7 );
|
assert( 7 );
|
||||||
assert( 5 );
|
assert( 5 );
|
||||||
|
|
||||||
$elem.unbind('bar');
|
$elem.unbind('bar');
|
||||||
assert( 1 );
|
assert( 1 );
|
||||||
|
|
||||||
$elem.unbind();
|
$elem.unbind();
|
||||||
assert( 0 );
|
assert( 0 );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -632,25 +667,25 @@ test("trigger() shortcuts", function() {
|
||||||
ok( !close[0], "Context element does not exist, direct access to element must return undefined" );
|
ok( !close[0], "Context element does not exist, direct access to element must return undefined" );
|
||||||
return false;
|
return false;
|
||||||
}).click();
|
}).click();
|
||||||
|
|
||||||
jQuery("#check1").click(function() {
|
jQuery("#check1").click(function() {
|
||||||
ok( true, "click event handler for checkbox gets fired twice, see #815" );
|
ok( true, "click event handler for checkbox gets fired twice, see #815" );
|
||||||
}).click();
|
}).click();
|
||||||
|
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
jQuery('#firstp')[0].onclick = function(event) {
|
jQuery('#firstp')[0].onclick = function(event) {
|
||||||
counter++;
|
counter++;
|
||||||
};
|
};
|
||||||
jQuery('#firstp').click();
|
jQuery('#firstp').click();
|
||||||
equals( counter, 1, "Check that click, triggers onclick event handler also" );
|
equals( counter, 1, "Check that click, triggers onclick event handler also" );
|
||||||
|
|
||||||
var clickCounter = 0;
|
var clickCounter = 0;
|
||||||
jQuery('#simon1')[0].onclick = function(event) {
|
jQuery('#simon1')[0].onclick = function(event) {
|
||||||
clickCounter++;
|
clickCounter++;
|
||||||
};
|
};
|
||||||
jQuery('#simon1').click();
|
jQuery('#simon1').click();
|
||||||
equals( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" );
|
equals( clickCounter, 1, "Check that click, triggers onclick event handler on an a tag also" );
|
||||||
|
|
||||||
jQuery('<img />').load(function(){
|
jQuery('<img />').load(function(){
|
||||||
ok( true, "Trigger the load event, using the shortcut .load() (#2819)");
|
ok( true, "Trigger the load event, using the shortcut .load() (#2819)");
|
||||||
}).load();
|
}).load();
|
||||||
|
@ -728,7 +763,7 @@ test("trigger(type, [data], [fn])", function() {
|
||||||
pass = false;
|
pass = false;
|
||||||
}
|
}
|
||||||
ok( pass, "Trigger focus on hidden element" );
|
ok( pass, "Trigger focus on hidden element" );
|
||||||
|
|
||||||
pass = true;
|
pass = true;
|
||||||
try {
|
try {
|
||||||
jQuery('table:first').bind('test:test', function(){}).trigger('test:test');
|
jQuery('table:first').bind('test:test', function(){}).trigger('test:test');
|
||||||
|
@ -768,28 +803,28 @@ test("jQuery.Event.currentTarget", function(){
|
||||||
|
|
||||||
test("trigger(eventObject, [data], [fn])", function() {
|
test("trigger(eventObject, [data], [fn])", function() {
|
||||||
expect(25);
|
expect(25);
|
||||||
|
|
||||||
var $parent = jQuery('<div id="par" />').hide().appendTo('body'),
|
var $parent = jQuery('<div id="par" />').hide().appendTo('body'),
|
||||||
$child = jQuery('<p id="child">foo</p>').appendTo( $parent );
|
$child = jQuery('<p id="child">foo</p>').appendTo( $parent );
|
||||||
|
|
||||||
var event = jQuery.Event("noNew");
|
var event = jQuery.Event("noNew");
|
||||||
ok( event != window, "Instantiate jQuery.Event without the 'new' keyword" );
|
ok( event != window, "Instantiate jQuery.Event without the 'new' keyword" );
|
||||||
equals( event.type, "noNew", "Verify its type" );
|
equals( event.type, "noNew", "Verify its type" );
|
||||||
|
|
||||||
equals( event.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
|
equals( event.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
|
||||||
equals( event.isPropagationStopped(), false, "Verify isPropagationStopped" );
|
equals( event.isPropagationStopped(), false, "Verify isPropagationStopped" );
|
||||||
equals( event.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );
|
equals( event.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
equals( event.isDefaultPrevented(), true, "Verify isDefaultPrevented" );
|
equals( event.isDefaultPrevented(), true, "Verify isDefaultPrevented" );
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
|
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
|
||||||
|
|
||||||
event.isPropagationStopped = function(){ return false };
|
event.isPropagationStopped = function(){ return false };
|
||||||
event.stopImmediatePropagation();
|
event.stopImmediatePropagation();
|
||||||
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
|
equals( event.isPropagationStopped(), true, "Verify isPropagationStopped" );
|
||||||
equals( event.isImmediatePropagationStopped(), true, "Verify isPropagationStopped" );
|
equals( event.isImmediatePropagationStopped(), true, "Verify isPropagationStopped" );
|
||||||
|
|
||||||
$parent.bind('foo',function(e){
|
$parent.bind('foo',function(e){
|
||||||
// Tries bubbling
|
// Tries bubbling
|
||||||
equals( e.type, 'foo', 'Verify event type when passed passing an event object' );
|
equals( e.type, 'foo', 'Verify event type when passed passing an event object' );
|
||||||
|
@ -797,72 +832,72 @@ test("trigger(eventObject, [data], [fn])", function() {
|
||||||
equals( e.currentTarget.id, 'par', 'Verify event.target when passed passing an event object' );
|
equals( e.currentTarget.id, 'par', 'Verify event.target when passed passing an event object' );
|
||||||
equals( e.secret, 'boo!', 'Verify event object\'s custom attribute when passed passing an event object' );
|
equals( e.secret, 'boo!', 'Verify event object\'s custom attribute when passed passing an event object' );
|
||||||
});
|
});
|
||||||
|
|
||||||
// test with an event object
|
// test with an event object
|
||||||
event = new jQuery.Event("foo");
|
event = new jQuery.Event("foo");
|
||||||
event.secret = 'boo!';
|
event.secret = 'boo!';
|
||||||
$child.trigger(event);
|
$child.trigger(event);
|
||||||
|
|
||||||
// test with a literal object
|
// test with a literal object
|
||||||
$child.trigger({type:'foo', secret:'boo!'});
|
$child.trigger({type:'foo', secret:'boo!'});
|
||||||
|
|
||||||
$parent.unbind();
|
$parent.unbind();
|
||||||
|
|
||||||
function error(){
|
function error(){
|
||||||
ok( false, "This assertion shouldn't be reached");
|
ok( false, "This assertion shouldn't be reached");
|
||||||
}
|
}
|
||||||
|
|
||||||
$parent.bind('foo', error );
|
$parent.bind('foo', error );
|
||||||
|
|
||||||
$child.bind('foo',function(e, a, b, c ){
|
$child.bind('foo',function(e, a, b, c ){
|
||||||
equals( arguments.length, 4, "Check arguments length");
|
equals( arguments.length, 4, "Check arguments length");
|
||||||
equals( a, 1, "Check first custom argument");
|
equals( a, 1, "Check first custom argument");
|
||||||
equals( b, 2, "Check second custom argument");
|
equals( b, 2, "Check second custom argument");
|
||||||
equals( c, 3, "Check third custom argument");
|
equals( c, 3, "Check third custom argument");
|
||||||
|
|
||||||
equals( e.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
|
equals( e.isDefaultPrevented(), false, "Verify isDefaultPrevented" );
|
||||||
equals( e.isPropagationStopped(), false, "Verify isPropagationStopped" );
|
equals( e.isPropagationStopped(), false, "Verify isPropagationStopped" );
|
||||||
equals( e.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );
|
equals( e.isImmediatePropagationStopped(), false, "Verify isImmediatePropagationStopped" );
|
||||||
|
|
||||||
// Skips both errors
|
// Skips both errors
|
||||||
e.stopImmediatePropagation();
|
e.stopImmediatePropagation();
|
||||||
|
|
||||||
return "result";
|
return "result";
|
||||||
});
|
});
|
||||||
|
|
||||||
// We should add this back in when we want to test the order
|
// We should add this back in when we want to test the order
|
||||||
// in which event handlers are iterated.
|
// in which event handlers are iterated.
|
||||||
//$child.bind('foo', error );
|
//$child.bind('foo', error );
|
||||||
|
|
||||||
event = new jQuery.Event("foo");
|
event = new jQuery.Event("foo");
|
||||||
$child.trigger( event, [1,2,3] ).unbind();
|
$child.trigger( event, [1,2,3] ).unbind();
|
||||||
equals( event.result, "result", "Check event.result attribute");
|
equals( event.result, "result", "Check event.result attribute");
|
||||||
|
|
||||||
// Will error if it bubbles
|
// Will error if it bubbles
|
||||||
$child.triggerHandler('foo');
|
$child.triggerHandler('foo');
|
||||||
|
|
||||||
$child.unbind();
|
$child.unbind();
|
||||||
$parent.unbind().remove();
|
$parent.unbind().remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
test("jQuery.Event.currentTarget", function(){
|
test("jQuery.Event.currentTarget", function(){
|
||||||
expect(1);
|
expect(1);
|
||||||
|
|
||||||
var counter = 0,
|
var counter = 0,
|
||||||
$elem = jQuery('<button>a</button>').click(function(e){
|
$elem = jQuery('<button>a</button>').click(function(e){
|
||||||
equals( e.currentTarget, this, "Check currentTarget on "+(counter++?"native":"fake") +" event" );
|
equals( e.currentTarget, this, "Check currentTarget on "+(counter++?"native":"fake") +" event" );
|
||||||
});
|
});
|
||||||
|
|
||||||
// Fake event
|
// Fake event
|
||||||
$elem.trigger('click');
|
$elem.trigger('click');
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
$elem.unbind();
|
$elem.unbind();
|
||||||
});
|
});
|
||||||
|
|
||||||
test("toggle(Function, Function, ...)", function() {
|
test("toggle(Function, Function, ...)", function() {
|
||||||
expect(16);
|
expect(16);
|
||||||
|
|
||||||
var count = 0,
|
var count = 0,
|
||||||
fn1 = function(e) { count++; },
|
fn1 = function(e) { count++; },
|
||||||
fn2 = function(e) { count--; },
|
fn2 = function(e) { count--; },
|
||||||
|
@ -885,7 +920,7 @@ test("toggle(Function, Function, ...)", function() {
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}).click().click().click();
|
}).click().click().click();
|
||||||
|
|
||||||
var turn = 0;
|
var turn = 0;
|
||||||
var fns = [
|
var fns = [
|
||||||
function(){
|
function(){
|
||||||
|
@ -898,7 +933,7 @@ test("toggle(Function, Function, ...)", function() {
|
||||||
turn = 3;
|
turn = 3;
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
var $div = jQuery("<div> </div>").toggle( fns[0], fns[1], fns[2] );
|
var $div = jQuery("<div> </div>").toggle( fns[0], fns[1], fns[2] );
|
||||||
$div.click();
|
$div.click();
|
||||||
equals( turn, 1, "Trying toggle with 3 functions, attempt 1 yields 1");
|
equals( turn, 1, "Trying toggle with 3 functions, attempt 1 yields 1");
|
||||||
|
@ -910,7 +945,7 @@ test("toggle(Function, Function, ...)", function() {
|
||||||
equals( turn, 1, "Trying toggle with 3 functions, attempt 4 yields 1");
|
equals( turn, 1, "Trying toggle with 3 functions, attempt 4 yields 1");
|
||||||
$div.click();
|
$div.click();
|
||||||
equals( turn, 2, "Trying toggle with 3 functions, attempt 5 yields 2");
|
equals( turn, 2, "Trying toggle with 3 functions, attempt 5 yields 2");
|
||||||
|
|
||||||
$div.unbind('click',fns[0]);
|
$div.unbind('click',fns[0]);
|
||||||
var data = jQuery.data( $div[0], 'events' );
|
var data = jQuery.data( $div[0], 'events' );
|
||||||
ok( !data, "Unbinding one function from toggle unbinds them all");
|
ok( !data, "Unbinding one function from toggle unbinds them all");
|
||||||
|
@ -1052,7 +1087,7 @@ test(".live()/.die()", function() {
|
||||||
// Test binding with different this object, event data, and trigger data
|
// Test binding with different this object, event data, and trigger data
|
||||||
jQuery("#foo").live("click", true, jQuery.proxy(function(e, data){
|
jQuery("#foo").live("click", true, jQuery.proxy(function(e, data){
|
||||||
equals( e.data, true, "live with with different this object, event data, and trigger data" );
|
equals( e.data, true, "live with with different this object, event data, and trigger data" );
|
||||||
equals( this.foo, "bar", "live with with different this object, event data, and trigger data" );
|
equals( this.foo, "bar", "live with with different this object, event data, and trigger data" );
|
||||||
equals( data, true, "live with with different this object, event data, and trigger data")
|
equals( data, true, "live with with different this object, event data, and trigger data")
|
||||||
}, { foo: "bar" }));
|
}, { foo: "bar" }));
|
||||||
jQuery("#foo").trigger("click", true).die("click");
|
jQuery("#foo").trigger("click", true).die("click");
|
||||||
|
@ -1113,25 +1148,25 @@ test(".live()/.die()", function() {
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
jQuery("#nothiddendiv").die("foo", callback);
|
jQuery("#nothiddendiv").die("foo", callback);
|
||||||
|
|
||||||
// Make sure we don't loose the target by DOM modifications
|
// Make sure we don't loose the target by DOM modifications
|
||||||
// after the bubble already reached the liveHandler
|
// after the bubble already reached the liveHandler
|
||||||
var livec = 0, elemDiv = jQuery("#nothiddendivchild").html('<span></span>').get(0);
|
var livec = 0, elemDiv = jQuery("#nothiddendivchild").html('<span></span>').get(0);
|
||||||
|
|
||||||
jQuery("#nothiddendivchild").live("click", function(e){ jQuery("#nothiddendivchild").html(''); });
|
jQuery("#nothiddendivchild").live("click", function(e){ jQuery("#nothiddendivchild").html(''); });
|
||||||
jQuery("#nothiddendivchild").live("click", function(e){ if(e.target) {livec++;} });
|
jQuery("#nothiddendivchild").live("click", function(e){ if(e.target) {livec++;} });
|
||||||
|
|
||||||
jQuery("#nothiddendiv span").click();
|
jQuery("#nothiddendiv span").click();
|
||||||
equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." );
|
equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." );
|
||||||
equals( livec, 1, "Verify that second handler occurred even with nuked target." );
|
equals( livec, 1, "Verify that second handler occurred even with nuked target." );
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
jQuery("#nothiddendivchild").die("click");
|
jQuery("#nothiddendivchild").die("click");
|
||||||
|
|
||||||
// Verify that .live() ocurs and cancel buble in the same order as
|
// Verify that .live() ocurs and cancel buble in the same order as
|
||||||
// we would expect .bind() and .click() without delegation
|
// we would expect .bind() and .click() without delegation
|
||||||
var lived = 0, livee = 0;
|
var lived = 0, livee = 0;
|
||||||
|
|
||||||
// bind one pair in one order
|
// bind one pair in one order
|
||||||
jQuery('span#liveSpan1 a').live('click', function(){ lived++; return false; });
|
jQuery('span#liveSpan1 a').live('click', function(){ lived++; return false; });
|
||||||
jQuery('span#liveSpan1').live('click', function(){ livee++; });
|
jQuery('span#liveSpan1').live('click', function(){ livee++; });
|
||||||
|
@ -1149,22 +1184,22 @@ test(".live()/.die()", function() {
|
||||||
jQuery('span#liveSpan2 a').click();
|
jQuery('span#liveSpan2 a').click();
|
||||||
equals( lived, 1, "Verify that only one first handler occurred." );
|
equals( lived, 1, "Verify that only one first handler occurred." );
|
||||||
equals( livee, 0, "Verify that second handler doesn't." );
|
equals( livee, 0, "Verify that second handler doesn't." );
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
jQuery("span#liveSpan1 a").die("click")
|
jQuery("span#liveSpan1 a").die("click")
|
||||||
jQuery("span#liveSpan1").die("click");
|
jQuery("span#liveSpan1").die("click");
|
||||||
jQuery("span#liveSpan2 a").die("click");
|
jQuery("span#liveSpan2 a").die("click");
|
||||||
jQuery("span#liveSpan2").die("click");
|
jQuery("span#liveSpan2").die("click");
|
||||||
|
|
||||||
// Test this, target and currentTarget are correct
|
// Test this, target and currentTarget are correct
|
||||||
jQuery('span#liveSpan1').live('click', function(e){
|
jQuery('span#liveSpan1').live('click', function(e){
|
||||||
equals( this.id, 'liveSpan1', 'Check the this within a live handler' );
|
equals( this.id, 'liveSpan1', 'Check the this within a live handler' );
|
||||||
equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a live handler' );
|
equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a live handler' );
|
||||||
equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a live handler' );
|
equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a live handler' );
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery('span#liveSpan1 a').click();
|
jQuery('span#liveSpan1 a').click();
|
||||||
|
|
||||||
jQuery('span#liveSpan1').die('click');
|
jQuery('span#liveSpan1').die('click');
|
||||||
|
|
||||||
// Work with deep selectors
|
// Work with deep selectors
|
||||||
|
@ -1298,18 +1333,18 @@ test("live with change", function(){
|
||||||
expect(8);
|
expect(8);
|
||||||
|
|
||||||
var selectChange = 0, checkboxChange = 0;
|
var selectChange = 0, checkboxChange = 0;
|
||||||
|
|
||||||
var select = jQuery("select[name='S1']")
|
var select = jQuery("select[name='S1']")
|
||||||
select.live("change", function() {
|
select.live("change", function() {
|
||||||
selectChange++;
|
selectChange++;
|
||||||
});
|
});
|
||||||
|
|
||||||
var checkbox = jQuery("#check2"),
|
var checkbox = jQuery("#check2"),
|
||||||
checkboxFunction = function(){
|
checkboxFunction = function(){
|
||||||
checkboxChange++;
|
checkboxChange++;
|
||||||
}
|
}
|
||||||
checkbox.live("change", checkboxFunction);
|
checkbox.live("change", checkboxFunction);
|
||||||
|
|
||||||
// test click on select
|
// test click on select
|
||||||
|
|
||||||
// second click that changed it
|
// second click that changed it
|
||||||
|
@ -1317,17 +1352,17 @@ test("live with change", function(){
|
||||||
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
||||||
select.trigger("change");
|
select.trigger("change");
|
||||||
equals( selectChange, 1, "Change on click." );
|
equals( selectChange, 1, "Change on click." );
|
||||||
|
|
||||||
// test keys on select
|
// test keys on select
|
||||||
selectChange = 0;
|
selectChange = 0;
|
||||||
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
||||||
select.trigger("change");
|
select.trigger("change");
|
||||||
equals( selectChange, 1, "Change on keyup." );
|
equals( selectChange, 1, "Change on keyup." );
|
||||||
|
|
||||||
// test click on checkbox
|
// test click on checkbox
|
||||||
checkbox.trigger("change");
|
checkbox.trigger("change");
|
||||||
equals( checkboxChange, 1, "Change on checkbox." );
|
equals( checkboxChange, 1, "Change on checkbox." );
|
||||||
|
|
||||||
// test blur/focus on text
|
// test blur/focus on text
|
||||||
var text = jQuery("#name"), textChange = 0, oldTextVal = text.val();
|
var text = jQuery("#name"), textChange = 0, oldTextVal = text.val();
|
||||||
text.live("change", function() {
|
text.live("change", function() {
|
||||||
|
@ -1340,7 +1375,7 @@ test("live with change", function(){
|
||||||
|
|
||||||
text.val(oldTextVal);
|
text.val(oldTextVal);
|
||||||
text.die("change");
|
text.die("change");
|
||||||
|
|
||||||
// test blur/focus on password
|
// test blur/focus on password
|
||||||
var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val();
|
var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val();
|
||||||
password.live("change", function() {
|
password.live("change", function() {
|
||||||
|
@ -1353,9 +1388,9 @@ test("live with change", function(){
|
||||||
|
|
||||||
password.val(oldPasswordVal);
|
password.val(oldPasswordVal);
|
||||||
password.die("change");
|
password.die("change");
|
||||||
|
|
||||||
// make sure die works
|
// make sure die works
|
||||||
|
|
||||||
// die all changes
|
// die all changes
|
||||||
selectChange = 0;
|
selectChange = 0;
|
||||||
select.die("change");
|
select.die("change");
|
||||||
|
@ -1367,7 +1402,7 @@ test("live with change", function(){
|
||||||
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
||||||
select.trigger("change");
|
select.trigger("change");
|
||||||
equals( selectChange, 0, "Die on keyup works." );
|
equals( selectChange, 0, "Die on keyup works." );
|
||||||
|
|
||||||
// die specific checkbox
|
// die specific checkbox
|
||||||
checkbox.die("change", checkboxFunction);
|
checkbox.die("change", checkboxFunction);
|
||||||
checkbox.trigger("change");
|
checkbox.trigger("change");
|
||||||
|
@ -1376,7 +1411,7 @@ test("live with change", function(){
|
||||||
|
|
||||||
test("live with submit", function() {
|
test("live with submit", function() {
|
||||||
var count1 = 0, count2 = 0;
|
var count1 = 0, count2 = 0;
|
||||||
|
|
||||||
jQuery("#testForm").live("submit", function(ev) {
|
jQuery("#testForm").live("submit", function(ev) {
|
||||||
count1++;
|
count1++;
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
|
@ -1390,7 +1425,7 @@ test("live with submit", function() {
|
||||||
jQuery("#testForm input[name=sub1]").submit();
|
jQuery("#testForm input[name=sub1]").submit();
|
||||||
equals( count1, 1, "Verify form submit." );
|
equals( count1, 1, "Verify form submit." );
|
||||||
equals( count2, 1, "Verify body submit." );
|
equals( count2, 1, "Verify body submit." );
|
||||||
|
|
||||||
jQuery("#testForm").die("submit");
|
jQuery("#testForm").die("submit");
|
||||||
jQuery("body").die("submit");
|
jQuery("body").die("submit");
|
||||||
});
|
});
|
||||||
|
@ -1568,7 +1603,7 @@ test(".delegate()/.undelegate()", function() {
|
||||||
// Test binding with different this object, event data, and trigger data
|
// Test binding with different this object, event data, and trigger data
|
||||||
jQuery("#body").delegate("#foo", "click", true, jQuery.proxy(function(e, data){
|
jQuery("#body").delegate("#foo", "click", true, jQuery.proxy(function(e, data){
|
||||||
equals( e.data, true, "delegate with with different this object, event data, and trigger data" );
|
equals( e.data, true, "delegate with with different this object, event data, and trigger data" );
|
||||||
equals( this.foo, "bar", "delegate with with different this object, event data, and trigger data" );
|
equals( this.foo, "bar", "delegate with with different this object, event data, and trigger data" );
|
||||||
equals( data, true, "delegate with with different this object, event data, and trigger data")
|
equals( data, true, "delegate with with different this object, event data, and trigger data")
|
||||||
}, { foo: "bar" }));
|
}, { foo: "bar" }));
|
||||||
jQuery("#foo").trigger("click", true);
|
jQuery("#foo").trigger("click", true);
|
||||||
|
@ -1630,25 +1665,25 @@ test(".delegate()/.undelegate()", function() {
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
jQuery("#body").undelegate("#nothiddendiv", "foo", callback);
|
jQuery("#body").undelegate("#nothiddendiv", "foo", callback);
|
||||||
|
|
||||||
// Make sure we don't loose the target by DOM modifications
|
// Make sure we don't loose the target by DOM modifications
|
||||||
// after the bubble already reached the liveHandler
|
// after the bubble already reached the liveHandler
|
||||||
var livec = 0, elemDiv = jQuery("#nothiddendivchild").html('<span></span>').get(0);
|
var livec = 0, elemDiv = jQuery("#nothiddendivchild").html('<span></span>').get(0);
|
||||||
|
|
||||||
jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ jQuery("#nothiddendivchild").html(''); });
|
jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ jQuery("#nothiddendivchild").html(''); });
|
||||||
jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ if(e.target) {livec++;} });
|
jQuery("#body").delegate("#nothiddendivchild", "click", function(e){ if(e.target) {livec++;} });
|
||||||
|
|
||||||
jQuery("#nothiddendiv span").click();
|
jQuery("#nothiddendiv span").click();
|
||||||
equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." );
|
equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." );
|
||||||
equals( livec, 1, "Verify that second handler occurred even with nuked target." );
|
equals( livec, 1, "Verify that second handler occurred even with nuked target." );
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
jQuery("#body").undelegate("#nothiddendivchild", "click");
|
jQuery("#body").undelegate("#nothiddendivchild", "click");
|
||||||
|
|
||||||
// Verify that .live() ocurs and cancel buble in the same order as
|
// Verify that .live() ocurs and cancel buble in the same order as
|
||||||
// we would expect .bind() and .click() without delegation
|
// we would expect .bind() and .click() without delegation
|
||||||
var lived = 0, livee = 0;
|
var lived = 0, livee = 0;
|
||||||
|
|
||||||
// bind one pair in one order
|
// bind one pair in one order
|
||||||
jQuery("#body").delegate('span#liveSpan1 a', 'click', function(){ lived++; return false; });
|
jQuery("#body").delegate('span#liveSpan1 a', 'click', function(){ lived++; return false; });
|
||||||
jQuery("#body").delegate('span#liveSpan1', 'click', function(){ livee++; });
|
jQuery("#body").delegate('span#liveSpan1', 'click', function(){ livee++; });
|
||||||
|
@ -1666,19 +1701,19 @@ test(".delegate()/.undelegate()", function() {
|
||||||
jQuery('span#liveSpan2 a').click();
|
jQuery('span#liveSpan2 a').click();
|
||||||
equals( lived, 1, "Verify that only one first handler occurred." );
|
equals( lived, 1, "Verify that only one first handler occurred." );
|
||||||
equals( livee, 0, "Verify that second handler doesn't." );
|
equals( livee, 0, "Verify that second handler doesn't." );
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
jQuery("#body").undelegate("click");
|
jQuery("#body").undelegate("click");
|
||||||
|
|
||||||
// Test this, target and currentTarget are correct
|
// Test this, target and currentTarget are correct
|
||||||
jQuery("#body").delegate('span#liveSpan1', 'click', function(e){
|
jQuery("#body").delegate('span#liveSpan1', 'click', function(e){
|
||||||
equals( this.id, 'liveSpan1', 'Check the this within a delegate handler' );
|
equals( this.id, 'liveSpan1', 'Check the this within a delegate handler' );
|
||||||
equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a delegate handler' );
|
equals( e.currentTarget.id, 'liveSpan1', 'Check the event.currentTarget within a delegate handler' );
|
||||||
equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a delegate handler' );
|
equals( e.target.nodeName.toUpperCase(), 'A', 'Check the event.target within a delegate handler' );
|
||||||
});
|
});
|
||||||
|
|
||||||
jQuery('span#liveSpan1 a').click();
|
jQuery('span#liveSpan1 a').click();
|
||||||
|
|
||||||
jQuery("#body").undelegate('span#liveSpan1', 'click');
|
jQuery("#body").undelegate('span#liveSpan1', 'click');
|
||||||
|
|
||||||
// Work with deep selectors
|
// Work with deep selectors
|
||||||
|
@ -1754,18 +1789,18 @@ test("delegate with change", function(){
|
||||||
expect(8);
|
expect(8);
|
||||||
|
|
||||||
var selectChange = 0, checkboxChange = 0;
|
var selectChange = 0, checkboxChange = 0;
|
||||||
|
|
||||||
var select = jQuery("select[name='S1']");
|
var select = jQuery("select[name='S1']");
|
||||||
jQuery("#body").delegate("select[name='S1']", "change", function() {
|
jQuery("#body").delegate("select[name='S1']", "change", function() {
|
||||||
selectChange++;
|
selectChange++;
|
||||||
});
|
});
|
||||||
|
|
||||||
var checkbox = jQuery("#check2"),
|
var checkbox = jQuery("#check2"),
|
||||||
checkboxFunction = function(){
|
checkboxFunction = function(){
|
||||||
checkboxChange++;
|
checkboxChange++;
|
||||||
}
|
}
|
||||||
jQuery("#body").delegate("#check2", "change", checkboxFunction);
|
jQuery("#body").delegate("#check2", "change", checkboxFunction);
|
||||||
|
|
||||||
// test click on select
|
// test click on select
|
||||||
|
|
||||||
// second click that changed it
|
// second click that changed it
|
||||||
|
@ -1773,17 +1808,17 @@ test("delegate with change", function(){
|
||||||
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
||||||
select.trigger("change");
|
select.trigger("change");
|
||||||
equals( selectChange, 1, "Change on click." );
|
equals( selectChange, 1, "Change on click." );
|
||||||
|
|
||||||
// test keys on select
|
// test keys on select
|
||||||
selectChange = 0;
|
selectChange = 0;
|
||||||
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
||||||
select.trigger("change");
|
select.trigger("change");
|
||||||
equals( selectChange, 1, "Change on keyup." );
|
equals( selectChange, 1, "Change on keyup." );
|
||||||
|
|
||||||
// test click on checkbox
|
// test click on checkbox
|
||||||
checkbox.trigger("change");
|
checkbox.trigger("change");
|
||||||
equals( checkboxChange, 1, "Change on checkbox." );
|
equals( checkboxChange, 1, "Change on checkbox." );
|
||||||
|
|
||||||
// test blur/focus on text
|
// test blur/focus on text
|
||||||
var text = jQuery("#name"), textChange = 0, oldTextVal = text.val();
|
var text = jQuery("#name"), textChange = 0, oldTextVal = text.val();
|
||||||
jQuery("#body").delegate("#name", "change", function() {
|
jQuery("#body").delegate("#name", "change", function() {
|
||||||
|
@ -1796,7 +1831,7 @@ test("delegate with change", function(){
|
||||||
|
|
||||||
text.val(oldTextVal);
|
text.val(oldTextVal);
|
||||||
jQuery("#body").die("change");
|
jQuery("#body").die("change");
|
||||||
|
|
||||||
// test blur/focus on password
|
// test blur/focus on password
|
||||||
var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val();
|
var password = jQuery("#name"), passwordChange = 0, oldPasswordVal = password.val();
|
||||||
jQuery("#body").delegate("#name", "change", function() {
|
jQuery("#body").delegate("#name", "change", function() {
|
||||||
|
@ -1809,9 +1844,9 @@ test("delegate with change", function(){
|
||||||
|
|
||||||
password.val(oldPasswordVal);
|
password.val(oldPasswordVal);
|
||||||
jQuery("#body").undelegate("#name", "change");
|
jQuery("#body").undelegate("#name", "change");
|
||||||
|
|
||||||
// make sure die works
|
// make sure die works
|
||||||
|
|
||||||
// die all changes
|
// die all changes
|
||||||
selectChange = 0;
|
selectChange = 0;
|
||||||
jQuery("#body").undelegate("select[name='S1']", "change");
|
jQuery("#body").undelegate("select[name='S1']", "change");
|
||||||
|
@ -1823,7 +1858,7 @@ test("delegate with change", function(){
|
||||||
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
select[0].selectedIndex = select[0].selectedIndex ? 0 : 1;
|
||||||
select.trigger("change");
|
select.trigger("change");
|
||||||
equals( selectChange, 0, "Die on keyup works." );
|
equals( selectChange, 0, "Die on keyup works." );
|
||||||
|
|
||||||
// die specific checkbox
|
// die specific checkbox
|
||||||
jQuery("#body").undelegate("#check2", "change", checkboxFunction);
|
jQuery("#body").undelegate("#check2", "change", checkboxFunction);
|
||||||
checkbox.trigger("change");
|
checkbox.trigger("change");
|
||||||
|
@ -1832,7 +1867,7 @@ test("delegate with change", function(){
|
||||||
|
|
||||||
test("delegate with submit", function() {
|
test("delegate with submit", function() {
|
||||||
var count1 = 0, count2 = 0;
|
var count1 = 0, count2 = 0;
|
||||||
|
|
||||||
jQuery("#body").delegate("#testForm", "submit", function(ev) {
|
jQuery("#body").delegate("#testForm", "submit", function(ev) {
|
||||||
count1++;
|
count1++;
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
|
@ -1846,7 +1881,7 @@ test("delegate with submit", function() {
|
||||||
jQuery("#testForm input[name=sub1]").submit();
|
jQuery("#testForm input[name=sub1]").submit();
|
||||||
equals( count1, 1, "Verify form submit." );
|
equals( count1, 1, "Verify form submit." );
|
||||||
equals( count2, 1, "Verify body submit." );
|
equals( count2, 1, "Verify body submit." );
|
||||||
|
|
||||||
jQuery("#body").undelegate();
|
jQuery("#body").undelegate();
|
||||||
jQuery(document).undelegate();
|
jQuery(document).undelegate();
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
module("manipulation");
|
module("manipulation");
|
||||||
|
|
||||||
|
// Ensure that an extended Array prototype doesn't break jQuery
|
||||||
|
Array.prototype.arrayProtoFn = function(arg) { throw("arrayProtoFn should not be called"); };
|
||||||
|
|
||||||
var bareObj = function(value) { return value; };
|
var bareObj = function(value) { return value; };
|
||||||
var functionReturningObj = function(value) { return (function() { return value; }); };
|
var functionReturningObj = function(value) { return (function() { return value; }); };
|
||||||
|
|
||||||
|
@ -51,7 +54,7 @@ test("text(Function) with incoming value", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
var testWrap = function(val) {
|
var testWrap = function(val) {
|
||||||
expect(18);
|
expect(19);
|
||||||
var defaultText = 'Try them out:'
|
var defaultText = 'Try them out:'
|
||||||
var result = jQuery('#first').wrap(val( '<div class="red"><span></span></div>' )).text();
|
var result = jQuery('#first').wrap(val( '<div class="red"><span></span></div>' )).text();
|
||||||
equals( defaultText, result, 'Check for wrapping of on-the-fly html' );
|
equals( defaultText, result, 'Check for wrapping of on-the-fly html' );
|
||||||
|
@ -80,10 +83,20 @@ var testWrap = function(val) {
|
||||||
equals( jQuery("#nonnodes > i").text(), j.text(), "Check node,textnode,comment wraps doesn't hurt text" );
|
equals( jQuery("#nonnodes > i").text(), j.text(), "Check node,textnode,comment wraps doesn't hurt text" );
|
||||||
|
|
||||||
// Try wrapping a disconnected node
|
// Try wrapping a disconnected node
|
||||||
|
var cacheLength = 0;
|
||||||
|
for (var i in jQuery.cache) {
|
||||||
|
cacheLength++;
|
||||||
|
}
|
||||||
|
|
||||||
j = jQuery("<label/>").wrap(val( "<li/>" ));
|
j = jQuery("<label/>").wrap(val( "<li/>" ));
|
||||||
equals( j[0].nodeName.toUpperCase(), "LABEL", "Element is a label" );
|
equals( j[0].nodeName.toUpperCase(), "LABEL", "Element is a label" );
|
||||||
equals( j[0].parentNode.nodeName.toUpperCase(), "LI", "Element has been wrapped" );
|
equals( j[0].parentNode.nodeName.toUpperCase(), "LI", "Element has been wrapped" );
|
||||||
|
|
||||||
|
for (i in jQuery.cache) {
|
||||||
|
cacheLength--;
|
||||||
|
}
|
||||||
|
equals(cacheLength, 0, "No memory leak in jQuery.cache (bug #7165)");
|
||||||
|
|
||||||
// Wrap an element containing a text node
|
// Wrap an element containing a text node
|
||||||
j = jQuery("<span/>").wrap("<div>test</div>");
|
j = jQuery("<span/>").wrap("<div>test</div>");
|
||||||
equals( j[0].previousSibling.nodeType, 3, "Make sure the previous node is a text element" );
|
equals( j[0].previousSibling.nodeType, 3, "Make sure the previous node is a text element" );
|
||||||
|
@ -382,7 +395,7 @@ test("append(Function) with incoming value", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("append the same fragment with events (Bug #6997, 5566)", function () {
|
test("append the same fragment with events (Bug #6997, 5566)", function () {
|
||||||
expect(4 + (document.fireEvent ? 1 : 0));
|
expect(2 + (document.fireEvent ? 1 : 0));
|
||||||
stop(1000);
|
stop(1000);
|
||||||
|
|
||||||
var element;
|
var element;
|
||||||
|
@ -413,14 +426,6 @@ test("append the same fragment with events (Bug #6997, 5566)", function () {
|
||||||
|
|
||||||
jQuery("#listWithTabIndex li").before(element);
|
jQuery("#listWithTabIndex li").before(element);
|
||||||
jQuery("#listWithTabIndex li.test6997").eq(1).click();
|
jQuery("#listWithTabIndex li.test6997").eq(1).click();
|
||||||
|
|
||||||
element = jQuery("<select><option>Foo</option><option selected>Bar</option></select>");
|
|
||||||
|
|
||||||
equals( element.clone().find("option:selected").val(), element.find("option:selected").val(), "Selected option cloned correctly" );
|
|
||||||
|
|
||||||
element = jQuery("<input type='checkbox'>").attr('checked', 'checked');
|
|
||||||
|
|
||||||
equals( element.clone().is(":checked"), element.is(":checked"), "Checked input cloned correctly" );
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test("appendTo(String|Element|Array<Element>|jQuery)", function() {
|
test("appendTo(String|Element|Array<Element>|jQuery)", function() {
|
||||||
|
@ -856,7 +861,7 @@ test("replaceAll(String|Element|Array<Element>|jQuery)", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("clone()", function() {
|
test("clone()", function() {
|
||||||
expect(36);
|
expect(37);
|
||||||
equals( 'This is a normal link: Yahoo', jQuery('#en').text(), 'Assert text for #en' );
|
equals( 'This is a normal link: Yahoo', jQuery('#en').text(), 'Assert text for #en' );
|
||||||
var clone = jQuery('#yahoo').clone();
|
var clone = jQuery('#yahoo').clone();
|
||||||
equals( 'Try them out:Yahoo', jQuery('#first').append(clone).text(), 'Check for clone' );
|
equals( 'Try them out:Yahoo', jQuery('#first').append(clone).text(), 'Check for clone' );
|
||||||
|
@ -914,10 +919,12 @@ test("clone()", function() {
|
||||||
equals( clone.html(), div.html(), "Element contents cloned" );
|
equals( clone.html(), div.html(), "Element contents cloned" );
|
||||||
equals( clone[0].nodeName.toUpperCase(), "DIV", "DIV element cloned" );
|
equals( clone[0].nodeName.toUpperCase(), "DIV", "DIV element cloned" );
|
||||||
|
|
||||||
div = jQuery("<div/>").data({ a: true, b: true });
|
div = jQuery("<div/>").data({ a: true });
|
||||||
div = div.clone(true);
|
var div2 = div.clone(true);
|
||||||
equals( div.data("a"), true, "Data cloned." );
|
equals( div2.data("a"), true, "Data cloned." );
|
||||||
equals( div.data("b"), true, "Data cloned." );
|
div2.data("a", false);
|
||||||
|
equals( div2.data("a"), false, "Ensure cloned element data object was correctly modified" );
|
||||||
|
equals( div.data("a"), true, "Ensure cloned element data object is copied, not referenced" );
|
||||||
|
|
||||||
var form = document.createElement("form");
|
var form = document.createElement("form");
|
||||||
form.action = "/test/";
|
form.action = "/test/";
|
||||||
|
@ -930,6 +937,28 @@ test("clone()", function() {
|
||||||
equal( jQuery("body").clone().children()[0].id, "qunit-header", "Make sure cloning body works" );
|
equal( jQuery("body").clone().children()[0].id, "qunit-header", "Make sure cloning body works" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("clone(form element) (Bug #3879, #6655)", function() {
|
||||||
|
expect(6);
|
||||||
|
element = jQuery("<select><option>Foo</option><option selected>Bar</option></select>");
|
||||||
|
|
||||||
|
equals( element.clone().find("option:selected").val(), element.find("option:selected").val(), "Selected option cloned correctly" );
|
||||||
|
|
||||||
|
element = jQuery("<input type='checkbox' value='foo'>").attr('checked', 'checked');
|
||||||
|
clone = element.clone();
|
||||||
|
|
||||||
|
equals( clone.is(":checked"), element.is(":checked"), "Checked input cloned correctly" );
|
||||||
|
equals( clone[0].defaultValue, "foo", "Checked input defaultValue cloned correctly" );
|
||||||
|
equals( clone[0].defaultChecked, !jQuery.support.noCloneEvent, "Checked input defaultChecked cloned correctly" );
|
||||||
|
|
||||||
|
element = jQuery("<input type='text' value='foo'>");
|
||||||
|
clone = element.clone();
|
||||||
|
equals( clone[0].defaultValue, "foo", "Text input defaultValue cloned correctly" );
|
||||||
|
|
||||||
|
element = jQuery("<textarea>foo</textarea>");
|
||||||
|
clone = element.clone();
|
||||||
|
equals( clone[0].defaultValue, "foo", "Textarea defaultValue cloned correctly" );
|
||||||
|
});
|
||||||
|
|
||||||
if (!isLocal) {
|
if (!isLocal) {
|
||||||
test("clone() on XML nodes", function() {
|
test("clone() on XML nodes", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
|
@ -1232,3 +1261,20 @@ test("jQuery.cleanData", function() {
|
||||||
return div;
|
return div;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("jQuery.buildFragment - no plain-text caching (Bug #6779)", function() {
|
||||||
|
expect(1);
|
||||||
|
|
||||||
|
// DOM manipulation fails if added text matches an Object method
|
||||||
|
var $f = jQuery( "<div />" ).appendTo( "#main" ),
|
||||||
|
bad = [ "start-", "toString", "hasOwnProperty", "append", "here&there!", "-end" ];
|
||||||
|
|
||||||
|
for ( var i=0; i < bad.length; i++ ) {
|
||||||
|
try {
|
||||||
|
$f.append( bad[i] );
|
||||||
|
}
|
||||||
|
catch(e) {}
|
||||||
|
}
|
||||||
|
equals($f.text(), bad.join(''), "Cached strings that match Object properties");
|
||||||
|
$f.remove();
|
||||||
|
});
|
||||||
|
|
|
@ -13,9 +13,9 @@ var supportsScroll = false;
|
||||||
|
|
||||||
testoffset("absolute"/* in iframe */, function($, iframe) {
|
testoffset("absolute"/* in iframe */, function($, iframe) {
|
||||||
expect(4);
|
expect(4);
|
||||||
|
|
||||||
var doc = iframe.document, tests;
|
var doc = iframe.document, tests;
|
||||||
|
|
||||||
// force a scroll value on the main window
|
// force a scroll value on the main window
|
||||||
// this insures that the results will be wrong
|
// this insures that the results will be wrong
|
||||||
// if the offset method is using the scroll offset
|
// if the offset method is using the scroll offset
|
||||||
|
@ -28,7 +28,7 @@ testoffset("absolute"/* in iframe */, function($, iframe) {
|
||||||
}
|
}
|
||||||
|
|
||||||
window.scrollTo(1, 1);
|
window.scrollTo(1, 1);
|
||||||
|
|
||||||
// get offset
|
// get offset
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#absolute-1', top: 1, left: 1 }
|
{ id: '#absolute-1', top: 1, left: 1 }
|
||||||
|
@ -47,16 +47,16 @@ testoffset("absolute"/* in iframe */, function($, iframe) {
|
||||||
equals( jQuery( this.id, doc ).position().top, this.top, "jQuery('" + this.id + "').position().top" );
|
equals( jQuery( this.id, doc ).position().top, this.top, "jQuery('" + this.id + "').position().top" );
|
||||||
equals( jQuery( this.id, doc ).position().left, this.left, "jQuery('" + this.id + "').position().left" );
|
equals( jQuery( this.id, doc ).position().left, this.left, "jQuery('" + this.id + "').position().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
forceScroll.remove();
|
forceScroll.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
testoffset("absolute", function( jQuery ) {
|
testoffset("absolute", function( jQuery ) {
|
||||||
expect(178);
|
expect(178);
|
||||||
|
|
||||||
// get offset tests
|
// get offset tests
|
||||||
var tests = [
|
var tests = [
|
||||||
{ id: '#absolute-1', top: 1, left: 1 },
|
{ id: '#absolute-1', top: 1, left: 1 },
|
||||||
{ id: '#absolute-1-1', top: 5, left: 5 },
|
{ id: '#absolute-1-1', top: 5, left: 5 },
|
||||||
{ id: '#absolute-1-1-1', top: 9, left: 9 },
|
{ id: '#absolute-1-1-1', top: 9, left: 9 },
|
||||||
{ id: '#absolute-2', top: 20, left: 20 }
|
{ id: '#absolute-2', top: 20, left: 20 }
|
||||||
|
@ -65,8 +65,8 @@ testoffset("absolute", function( jQuery ) {
|
||||||
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" );
|
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" );
|
||||||
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" );
|
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// get position
|
// get position
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#absolute-1', top: 0, left: 0 },
|
{ id: '#absolute-1', top: 0, left: 0 },
|
||||||
|
@ -78,13 +78,13 @@ testoffset("absolute", function( jQuery ) {
|
||||||
equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.id + "').position().top" );
|
equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.id + "').position().top" );
|
||||||
equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.id + "').position().left" );
|
equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.id + "').position().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
// test #5781
|
// test #5781
|
||||||
var offset = jQuery( '#positionTest' ).offset({ top: 10, left: 10 }).offset();
|
var offset = jQuery( '#positionTest' ).offset({ top: 10, left: 10 }).offset();
|
||||||
equals( offset.top, 10, "Setting offset on element with position absolute but 'auto' values." )
|
equals( offset.top, 10, "Setting offset on element with position absolute but 'auto' values." )
|
||||||
equals( offset.left, 10, "Setting offset on element with position absolute but 'auto' values." )
|
equals( offset.left, 10, "Setting offset on element with position absolute but 'auto' values." )
|
||||||
|
|
||||||
|
|
||||||
// set offset
|
// set offset
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#absolute-2', top: 30, left: 30 },
|
{ id: '#absolute-2', top: 30, left: 30 },
|
||||||
|
@ -108,9 +108,9 @@ testoffset("absolute", function( jQuery ) {
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
||||||
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" );
|
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 + " })" );
|
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
|
||||||
|
|
||||||
var top = this.top, left = this.left;
|
var top = this.top, left = this.left;
|
||||||
|
|
||||||
jQuery( this.id ).offset(function(i, val){
|
jQuery( this.id ).offset(function(i, val){
|
||||||
equals( val.top, top, "Verify incoming top position." );
|
equals( val.top, top, "Verify incoming top position." );
|
||||||
equals( val.left, left, "Verify incoming top position." );
|
equals( val.left, left, "Verify incoming top position." );
|
||||||
|
@ -118,13 +118,13 @@ testoffset("absolute", function( jQuery ) {
|
||||||
});
|
});
|
||||||
equals( jQuery( this.id ).offset().top, this.top + 1, "jQuery('" + this.id + "').offset({ top: " + (this.top + 1) + " })" );
|
equals( jQuery( this.id ).offset().top, this.top + 1, "jQuery('" + this.id + "').offset({ top: " + (this.top + 1) + " })" );
|
||||||
equals( jQuery( this.id ).offset().left, this.left + 1, "jQuery('" + this.id + "').offset({ left: " + (this.left + 1) + " })" );
|
equals( jQuery( this.id ).offset().left, this.left + 1, "jQuery('" + this.id + "').offset({ left: " + (this.left + 1) + " })" );
|
||||||
|
|
||||||
jQuery( this.id )
|
jQuery( this.id )
|
||||||
.offset({ left: this.left + 2 })
|
.offset({ left: this.left + 2 })
|
||||||
.offset({ top: this.top + 2 });
|
.offset({ top: this.top + 2 });
|
||||||
equals( jQuery( this.id ).offset().top, this.top + 2, "Setting one property at a time." );
|
equals( jQuery( this.id ).offset().top, this.top + 2, "Setting one property at a time." );
|
||||||
equals( jQuery( this.id ).offset().left, this.left + 2, "Setting one property at a time." );
|
equals( jQuery( this.id ).offset().left, this.left + 2, "Setting one property at a time." );
|
||||||
|
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
||||||
jQuery( this ).css({
|
jQuery( this ).css({
|
||||||
top: props.top + 1,
|
top: props.top + 1,
|
||||||
|
@ -138,10 +138,10 @@ testoffset("absolute", function( jQuery ) {
|
||||||
|
|
||||||
testoffset("relative", function( jQuery ) {
|
testoffset("relative", function( jQuery ) {
|
||||||
expect(60);
|
expect(60);
|
||||||
|
|
||||||
// IE is collapsing the top margin of 1px
|
// IE is collapsing the top margin of 1px
|
||||||
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
||||||
|
|
||||||
// get offset
|
// get offset
|
||||||
var tests = [
|
var tests = [
|
||||||
{ id: '#relative-1', top: ie ? 6 : 7, left: 7 },
|
{ id: '#relative-1', top: ie ? 6 : 7, left: 7 },
|
||||||
|
@ -152,8 +152,8 @@ testoffset("relative", function( jQuery ) {
|
||||||
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" );
|
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" );
|
||||||
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" );
|
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// get position
|
// get position
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#relative-1', top: ie ? 5 : 6, left: 6 },
|
{ id: '#relative-1', top: ie ? 5 : 6, left: 6 },
|
||||||
|
@ -164,8 +164,8 @@ testoffset("relative", function( jQuery ) {
|
||||||
equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.id + "').position().top" );
|
equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.id + "').position().top" );
|
||||||
equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.id + "').position().left" );
|
equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.id + "').position().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// set offset
|
// set offset
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#relative-2', top: 200, left: 50 },
|
{ id: '#relative-2', top: 200, left: 50 },
|
||||||
|
@ -185,7 +185,7 @@ testoffset("relative", function( jQuery ) {
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
||||||
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" );
|
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 + " })" );
|
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
|
||||||
|
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
||||||
jQuery( this ).css({
|
jQuery( this ).css({
|
||||||
top: props.top + 1,
|
top: props.top + 1,
|
||||||
|
@ -199,10 +199,10 @@ testoffset("relative", function( jQuery ) {
|
||||||
|
|
||||||
testoffset("static", function( jQuery ) {
|
testoffset("static", function( jQuery ) {
|
||||||
expect(80);
|
expect(80);
|
||||||
|
|
||||||
// IE is collapsing the top margin of 1px
|
// IE is collapsing the top margin of 1px
|
||||||
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
||||||
|
|
||||||
// get offset
|
// get offset
|
||||||
var tests = [
|
var tests = [
|
||||||
{ id: '#static-1', top: ie ? 6 : 7, left: 7 },
|
{ id: '#static-1', top: ie ? 6 : 7, left: 7 },
|
||||||
|
@ -214,8 +214,8 @@ testoffset("static", function( jQuery ) {
|
||||||
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" );
|
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset().top" );
|
||||||
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" );
|
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// get position
|
// get position
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#static-1', top: ie ? 5 : 6, left: 6 },
|
{ id: '#static-1', top: ie ? 5 : 6, left: 6 },
|
||||||
|
@ -227,8 +227,8 @@ testoffset("static", function( jQuery ) {
|
||||||
equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.top + "').position().top" );
|
equals( jQuery( this.id ).position().top, this.top, "jQuery('" + this.top + "').position().top" );
|
||||||
equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.left +"').position().left" );
|
equals( jQuery( this.id ).position().left, this.left, "jQuery('" + this.left +"').position().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// set offset
|
// set offset
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#static-2', top: 200, left: 200 },
|
{ id: '#static-2', top: 200, left: 200 },
|
||||||
|
@ -252,7 +252,7 @@ testoffset("static", function( jQuery ) {
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
||||||
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" );
|
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 + " })" );
|
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
|
||||||
|
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
||||||
jQuery( this ).css({
|
jQuery( this ).css({
|
||||||
top: props.top + 1,
|
top: props.top + 1,
|
||||||
|
@ -266,9 +266,9 @@ testoffset("static", function( jQuery ) {
|
||||||
|
|
||||||
testoffset("fixed", function( jQuery ) {
|
testoffset("fixed", function( jQuery ) {
|
||||||
expect(28);
|
expect(28);
|
||||||
|
|
||||||
jQuery.offset.initialize();
|
jQuery.offset.initialize();
|
||||||
|
|
||||||
var tests = [
|
var tests = [
|
||||||
{ id: '#fixed-1', top: 1001, left: 1001 },
|
{ id: '#fixed-1', top: 1001, left: 1001 },
|
||||||
{ id: '#fixed-2', top: 1021, left: 1021 }
|
{ id: '#fixed-2', top: 1021, left: 1021 }
|
||||||
|
@ -288,7 +288,7 @@ testoffset("fixed", function( jQuery ) {
|
||||||
ok( true, 'Fixed position is not supported' );
|
ok( true, 'Fixed position is not supported' );
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
tests = [
|
tests = [
|
||||||
{ id: '#fixed-1', top: 100, left: 100 },
|
{ id: '#fixed-1', top: 100, left: 100 },
|
||||||
{ id: '#fixed-1', top: 0, left: 0 },
|
{ id: '#fixed-1', top: 0, left: 0 },
|
||||||
|
@ -297,13 +297,13 @@ testoffset("fixed", function( jQuery ) {
|
||||||
{ id: '#fixed-2', top: 0, left: 0 },
|
{ id: '#fixed-2', top: 0, left: 0 },
|
||||||
{ id: '#fixed-2', top: -5, left: -5 }
|
{ id: '#fixed-2', top: -5, left: -5 }
|
||||||
];
|
];
|
||||||
|
|
||||||
jQuery.each( tests, function() {
|
jQuery.each( tests, function() {
|
||||||
if ( jQuery.offset.supportsFixedPosition ) {
|
if ( jQuery.offset.supportsFixedPosition ) {
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
jQuery( this.id ).offset({ top: this.top, left: this.left });
|
||||||
equals( jQuery( this.id ).offset().top, this.top, "jQuery('" + this.id + "').offset({ top: " + this.top + " })" );
|
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 + " })" );
|
equals( jQuery( this.id ).offset().left, this.left, "jQuery('" + this.id + "').offset({ left: " + this.left + " })" );
|
||||||
|
|
||||||
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
jQuery( this.id ).offset({ top: this.top, left: this.left, using: function( props ) {
|
||||||
jQuery( this ).css({
|
jQuery( this ).css({
|
||||||
top: props.top + 1,
|
top: props.top + 1,
|
||||||
|
@ -324,38 +324,38 @@ testoffset("fixed", function( jQuery ) {
|
||||||
|
|
||||||
testoffset("table", function( jQuery ) {
|
testoffset("table", function( jQuery ) {
|
||||||
expect(4);
|
expect(4);
|
||||||
|
|
||||||
equals( jQuery('#table-1').offset().top, 6, "jQuery('#table-1').offset().top" );
|
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('#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().top, 10, "jQuery('#th-1').offset().top" );
|
||||||
equals( jQuery('#th-1').offset().left, 10, "jQuery('#th-1').offset().left" );
|
equals( jQuery('#th-1').offset().left, 10, "jQuery('#th-1').offset().left" );
|
||||||
});
|
});
|
||||||
|
|
||||||
testoffset("scroll", function( jQuery, win ) {
|
testoffset("scroll", function( jQuery, win ) {
|
||||||
expect(16);
|
expect(16);
|
||||||
|
|
||||||
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
var ie = jQuery.browser.msie && parseInt( jQuery.browser.version, 10 ) < 8;
|
||||||
|
|
||||||
// IE is collapsing the top margin of 1px
|
// IE is collapsing the top margin of 1px
|
||||||
equals( jQuery('#scroll-1').offset().top, ie ? 6 : 7, "jQuery('#scroll-1').offset().top" );
|
equals( jQuery('#scroll-1').offset().top, ie ? 6 : 7, "jQuery('#scroll-1').offset().top" );
|
||||||
equals( jQuery('#scroll-1').offset().left, 7, "jQuery('#scroll-1').offset().left" );
|
equals( jQuery('#scroll-1').offset().left, 7, "jQuery('#scroll-1').offset().left" );
|
||||||
|
|
||||||
// IE is collapsing the top margin of 1px
|
// IE is collapsing the top margin of 1px
|
||||||
equals( jQuery('#scroll-1-1').offset().top, ie ? 9 : 11, "jQuery('#scroll-1-1').offset().top" );
|
equals( jQuery('#scroll-1-1').offset().top, ie ? 9 : 11, "jQuery('#scroll-1-1').offset().top" );
|
||||||
equals( jQuery('#scroll-1-1').offset().left, 11, "jQuery('#scroll-1-1').offset().left" );
|
equals( jQuery('#scroll-1-1').offset().left, 11, "jQuery('#scroll-1-1').offset().left" );
|
||||||
|
|
||||||
|
|
||||||
// scroll offset tests .scrollTop/Left
|
// scroll offset tests .scrollTop/Left
|
||||||
equals( jQuery('#scroll-1').scrollTop(), 5, "jQuery('#scroll-1').scrollTop()" );
|
equals( jQuery('#scroll-1').scrollTop(), 5, "jQuery('#scroll-1').scrollTop()" );
|
||||||
equals( jQuery('#scroll-1').scrollLeft(), 5, "jQuery('#scroll-1').scrollLeft()" );
|
equals( jQuery('#scroll-1').scrollLeft(), 5, "jQuery('#scroll-1').scrollLeft()" );
|
||||||
|
|
||||||
equals( jQuery('#scroll-1-1').scrollTop(), 0, "jQuery('#scroll-1-1').scrollTop()" );
|
equals( jQuery('#scroll-1-1').scrollTop(), 0, "jQuery('#scroll-1-1').scrollTop()" );
|
||||||
equals( jQuery('#scroll-1-1').scrollLeft(), 0, "jQuery('#scroll-1-1').scrollLeft()" );
|
equals( jQuery('#scroll-1-1').scrollLeft(), 0, "jQuery('#scroll-1-1').scrollLeft()" );
|
||||||
|
|
||||||
// equals( jQuery('body').scrollTop(), 0, "jQuery('body').scrollTop()" );
|
// equals( jQuery('body').scrollTop(), 0, "jQuery('body').scrollTop()" );
|
||||||
// equals( jQuery('body').scrollLeft(), 0, "jQuery('body').scrollTop()" );
|
// equals( jQuery('body').scrollLeft(), 0, "jQuery('body').scrollTop()" );
|
||||||
|
|
||||||
win.name = "test";
|
win.name = "test";
|
||||||
|
|
||||||
if ( !supportsScroll ) {
|
if ( !supportsScroll ) {
|
||||||
|
@ -367,11 +367,11 @@ testoffset("scroll", function( jQuery, win ) {
|
||||||
} else {
|
} else {
|
||||||
equals( jQuery(win).scrollTop(), 1000, "jQuery(window).scrollTop()" );
|
equals( jQuery(win).scrollTop(), 1000, "jQuery(window).scrollTop()" );
|
||||||
equals( jQuery(win).scrollLeft(), 1000, "jQuery(window).scrollLeft()" );
|
equals( jQuery(win).scrollLeft(), 1000, "jQuery(window).scrollLeft()" );
|
||||||
|
|
||||||
equals( jQuery(win.document).scrollTop(), 1000, "jQuery(document).scrollTop()" );
|
equals( jQuery(win.document).scrollTop(), 1000, "jQuery(document).scrollTop()" );
|
||||||
equals( jQuery(win.document).scrollLeft(), 1000, "jQuery(document).scrollLeft()" );
|
equals( jQuery(win.document).scrollLeft(), 1000, "jQuery(document).scrollLeft()" );
|
||||||
}
|
}
|
||||||
|
|
||||||
// test jQuery using parent window/document
|
// test jQuery using parent window/document
|
||||||
// jQuery reference here is in the iframe
|
// jQuery reference here is in the iframe
|
||||||
window.scrollTo(0,0);
|
window.scrollTo(0,0);
|
||||||
|
@ -383,7 +383,7 @@ testoffset("scroll", function( jQuery, win ) {
|
||||||
|
|
||||||
testoffset("body", function( jQuery ) {
|
testoffset("body", function( jQuery ) {
|
||||||
expect(2);
|
expect(2);
|
||||||
|
|
||||||
equals( jQuery('body').offset().top, 1, "jQuery('#body').offset().top" );
|
equals( jQuery('body').offset().top, 1, "jQuery('#body').offset().top" );
|
||||||
equals( jQuery('body').offset().left, 1, "jQuery('#body').offset().left" );
|
equals( jQuery('body').offset().left, 1, "jQuery('#body').offset().left" );
|
||||||
});
|
});
|
||||||
|
@ -423,11 +423,11 @@ test("offsetParent", function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
function testoffset(name, fn) {
|
function testoffset(name, fn) {
|
||||||
|
|
||||||
test(name, function() {
|
test(name, function() {
|
||||||
// pause execution for now
|
// pause execution for now
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
// load fixture in iframe
|
// load fixture in iframe
|
||||||
var iframe = loadFixture(),
|
var iframe = loadFixture(),
|
||||||
win = iframe.contentWindow,
|
win = iframe.contentWindow,
|
||||||
|
@ -443,7 +443,7 @@ function testoffset(name, fn) {
|
||||||
}
|
}
|
||||||
}, 15 );
|
}, 15 );
|
||||||
});
|
});
|
||||||
|
|
||||||
function loadFixture() {
|
function loadFixture() {
|
||||||
var src = './data/offset/' + name + '.html?' + parseInt( Math.random()*1000, 10 ),
|
var src = './data/offset/' + name + '.html?' + parseInt( Math.random()*1000, 10 ),
|
||||||
iframe = jQuery('<iframe />').css({
|
iframe = jQuery('<iframe />').css({
|
||||||
|
|
|
@ -3,9 +3,9 @@ module("queue");
|
||||||
test("queue() with other types",function() {
|
test("queue() with other types",function() {
|
||||||
expect(9);
|
expect(9);
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
var $div = jQuery({});
|
var $div = jQuery({});
|
||||||
|
|
||||||
$div
|
$div
|
||||||
.queue('foo',function(){
|
.queue('foo',function(){
|
||||||
equals( ++counter, 1, "Dequeuing" );
|
equals( ++counter, 1, "Dequeuing" );
|
||||||
|
@ -21,26 +21,26 @@ test("queue() with other types",function() {
|
||||||
.queue('foo',function(){
|
.queue('foo',function(){
|
||||||
equals( ++counter, 4, "Dequeuing" );
|
equals( ++counter, 4, "Dequeuing" );
|
||||||
});
|
});
|
||||||
|
|
||||||
equals( $div.queue('foo').length, 4, "Testing queue length" );
|
equals( $div.queue('foo').length, 4, "Testing queue length" );
|
||||||
|
|
||||||
$div.dequeue('foo');
|
$div.dequeue('foo');
|
||||||
|
|
||||||
equals( counter, 3, "Testing previous call to dequeue" );
|
equals( counter, 3, "Testing previous call to dequeue" );
|
||||||
equals( $div.queue('foo').length, 1, "Testing queue length" );
|
equals( $div.queue('foo').length, 1, "Testing queue length" );
|
||||||
|
|
||||||
$div.dequeue('foo');
|
$div.dequeue('foo');
|
||||||
|
|
||||||
equals( counter, 4, "Testing previous call to dequeue" );
|
equals( counter, 4, "Testing previous call to dequeue" );
|
||||||
equals( $div.queue('foo').length, 0, "Testing queue length" );
|
equals( $div.queue('foo').length, 0, "Testing queue length" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("queue(name) passes in the next item in the queue as a parameter", function() {
|
test("queue(name) passes in the next item in the queue as a parameter", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
|
|
||||||
var div = jQuery({});
|
var div = jQuery({});
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
div.queue("foo", function(next) {
|
div.queue("foo", function(next) {
|
||||||
equals(++counter, 1, "Dequeueing");
|
equals(++counter, 1, "Dequeueing");
|
||||||
next();
|
next();
|
||||||
|
@ -50,16 +50,16 @@ test("queue(name) passes in the next item in the queue as a parameter", function
|
||||||
}).queue("bar", function() {
|
}).queue("bar", function() {
|
||||||
equals(++counter, 3, "Other queues are not triggered by next()")
|
equals(++counter, 3, "Other queues are not triggered by next()")
|
||||||
});
|
});
|
||||||
|
|
||||||
div.dequeue("foo");
|
div.dequeue("foo");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("queue(name) passes in the next item in the queue as a parameter", function() {
|
test("queue(name) passes in the next item in the queue as a parameter", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
|
|
||||||
var div = jQuery({});
|
var div = jQuery({});
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
div.queue("foo", function(next) {
|
div.queue("foo", function(next) {
|
||||||
equals(++counter, 1, "Dequeueing");
|
equals(++counter, 1, "Dequeueing");
|
||||||
next();
|
next();
|
||||||
|
@ -69,17 +69,17 @@ test("queue(name) passes in the next item in the queue as a parameter", function
|
||||||
}).queue("bar", function() {
|
}).queue("bar", function() {
|
||||||
equals(++counter, 3, "Other queues are not triggered by next()")
|
equals(++counter, 3, "Other queues are not triggered by next()")
|
||||||
});
|
});
|
||||||
|
|
||||||
div.dequeue("foo");
|
div.dequeue("foo");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("queue() passes in the next item in the queue as a parameter to fx queues", function() {
|
test("queue() passes in the next item in the queue as a parameter to fx queues", function() {
|
||||||
expect(2);
|
expect(2);
|
||||||
stop();
|
stop();
|
||||||
|
|
||||||
var div = jQuery({});
|
var div = jQuery({});
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
div.queue(function(next) {
|
div.queue(function(next) {
|
||||||
equals(++counter, 1, "Dequeueing");
|
equals(++counter, 1, "Dequeueing");
|
||||||
var self = this;
|
var self = this;
|
||||||
|
@ -111,10 +111,10 @@ test("delay()", function() {
|
||||||
|
|
||||||
test("clearQueue(name) clears the queue", function() {
|
test("clearQueue(name) clears the queue", function() {
|
||||||
expect(1);
|
expect(1);
|
||||||
|
|
||||||
var div = jQuery({});
|
var div = jQuery({});
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
div.queue("foo", function(next) {
|
div.queue("foo", function(next) {
|
||||||
counter++;
|
counter++;
|
||||||
jQuery(this).clearQueue("foo");
|
jQuery(this).clearQueue("foo");
|
||||||
|
@ -122,18 +122,18 @@ test("clearQueue(name) clears the queue", function() {
|
||||||
}).queue("foo", function(next) {
|
}).queue("foo", function(next) {
|
||||||
counter++;
|
counter++;
|
||||||
});
|
});
|
||||||
|
|
||||||
div.dequeue("foo");
|
div.dequeue("foo");
|
||||||
|
|
||||||
equals(counter, 1, "the queue was cleared");
|
equals(counter, 1, "the queue was cleared");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("clearQueue() clears the fx queue", function() {
|
test("clearQueue() clears the fx queue", function() {
|
||||||
expect(1);
|
expect(1);
|
||||||
|
|
||||||
var div = jQuery({});
|
var div = jQuery({});
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
||||||
div.queue(function(next) {
|
div.queue(function(next) {
|
||||||
counter++;
|
counter++;
|
||||||
var self = this;
|
var self = this;
|
||||||
|
@ -141,8 +141,8 @@ test("clearQueue() clears the fx queue", function() {
|
||||||
}).queue(function(next) {
|
}).queue(function(next) {
|
||||||
counter++;
|
counter++;
|
||||||
});
|
});
|
||||||
|
|
||||||
equals(counter, 1, "the queue was cleared");
|
equals(counter, 1, "the queue was cleared");
|
||||||
|
|
||||||
div.removeData();
|
div.removeData();
|
||||||
});
|
});
|
||||||
|
|
|
@ -22,7 +22,7 @@ test("element", function() {
|
||||||
same( jQuery("div").find("p").get(), q("firstp","ap","sndp","en","sap","first"), "Finding elements with a context." );
|
same( jQuery("div").find("p").get(), q("firstp","ap","sndp","en","sap","first"), "Finding elements with a context." );
|
||||||
|
|
||||||
same( jQuery("#form").find("select").get(), q("select1","select2","select3","select4","select5"), "Finding selects with a context." );
|
same( jQuery("#form").find("select").get(), q("select1","select2","select3","select4","select5"), "Finding selects with a context." );
|
||||||
|
|
||||||
ok( jQuery("#length").length, '<input name="length"> cannot be found under IE, see #945' );
|
ok( jQuery("#length").length, '<input name="length"> cannot be found under IE, see #945' );
|
||||||
ok( jQuery("#lengthtest input").length, '<input name="length"> cannot be found under IE, see #945' );
|
ok( jQuery("#lengthtest input").length, '<input name="length"> cannot be found under IE, see #945' );
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ test("broken", function() {
|
||||||
name + ": " + selector );
|
name + ": " + selector );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
broken( "Broken Selector", "[", [] );
|
broken( "Broken Selector", "[", [] );
|
||||||
broken( "Broken Selector", "(", [] );
|
broken( "Broken Selector", "(", [] );
|
||||||
broken( "Broken Selector", "{", [] );
|
broken( "Broken Selector", "{", [] );
|
||||||
|
@ -90,28 +90,28 @@ test("id", function() {
|
||||||
t( "Multiple ID selectors using UTF8", "#台北Táiběi, #台北", ["台北Táiběi","台北"] );
|
t( "Multiple ID selectors using UTF8", "#台北Táiběi, #台北", ["台北Táiběi","台北"] );
|
||||||
t( "Descendant ID selector using UTF8", "div #台北", ["台北"] );
|
t( "Descendant ID selector using UTF8", "div #台北", ["台北"] );
|
||||||
t( "Child ID selector using UTF8", "form > #台北", ["台北"] );
|
t( "Child ID selector using UTF8", "form > #台北", ["台北"] );
|
||||||
|
|
||||||
t( "Escaped ID", "#foo\\:bar", ["foo:bar"] );
|
t( "Escaped ID", "#foo\\:bar", ["foo:bar"] );
|
||||||
t( "Escaped ID", "#test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
|
t( "Escaped ID", "#test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
|
||||||
t( "Descendant escaped ID", "div #foo\\:bar", ["foo:bar"] );
|
t( "Descendant escaped ID", "div #foo\\:bar", ["foo:bar"] );
|
||||||
t( "Descendant escaped ID", "div #test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
|
t( "Descendant escaped ID", "div #test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
|
||||||
t( "Child escaped ID", "form > #foo\\:bar", ["foo:bar"] );
|
t( "Child escaped ID", "form > #foo\\:bar", ["foo:bar"] );
|
||||||
t( "Child escaped ID", "form > #test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
|
t( "Child escaped ID", "form > #test\\.foo\\[5\\]bar", ["test.foo[5]bar"] );
|
||||||
|
|
||||||
t( "ID Selector, child ID present", "#form > #radio1", ["radio1"] ); // bug #267
|
t( "ID Selector, child ID present", "#form > #radio1", ["radio1"] ); // bug #267
|
||||||
t( "ID Selector, not an ancestor ID", "#form #first", [] );
|
t( "ID Selector, not an ancestor ID", "#form #first", [] );
|
||||||
t( "ID Selector, not a child ID", "#form > #option1a", [] );
|
t( "ID Selector, not a child ID", "#form > #option1a", [] );
|
||||||
|
|
||||||
t( "All Children of ID", "#foo > *", ["sndp", "en", "sap"] );
|
t( "All Children of ID", "#foo > *", ["sndp", "en", "sap"] );
|
||||||
t( "All Children of ID with no children", "#firstUL > *", [] );
|
t( "All Children of ID with no children", "#firstUL > *", [] );
|
||||||
|
|
||||||
var a = jQuery('<div><a name="tName1">tName1 A</a><a name="tName2">tName2 A</a><div id="tName1">tName1 Div</div></div>').appendTo('#main');
|
var a = jQuery('<div><a name="tName1">tName1 A</a><a name="tName2">tName2 A</a><div id="tName1">tName1 Div</div></div>').appendTo('#main');
|
||||||
equals( jQuery("#tName1")[0].id, 'tName1', "ID selector with same value for a name attribute" );
|
equals( jQuery("#tName1")[0].id, 'tName1', "ID selector with same value for a name attribute" );
|
||||||
equals( jQuery("#tName2").length, 0, "ID selector non-existing but name attribute on an A tag" );
|
equals( jQuery("#tName2").length, 0, "ID selector non-existing but name attribute on an A tag" );
|
||||||
a.remove();
|
a.remove();
|
||||||
|
|
||||||
t( "ID Selector on Form with an input that has a name of 'id'", "#lengthtest", ["lengthtest"] );
|
t( "ID Selector on Form with an input that has a name of 'id'", "#lengthtest", ["lengthtest"] );
|
||||||
|
|
||||||
t( "ID selector with non-existant ancestor", "#asdfasdf #foobar", [] ); // bug #986
|
t( "ID selector with non-existant ancestor", "#asdfasdf #foobar", [] ); // bug #986
|
||||||
|
|
||||||
same( jQuery("body").find("div#form").get(), [], "ID selector within the context of another element" );
|
same( jQuery("body").find("div#form").get(), [], "ID selector within the context of another element" );
|
||||||
|
@ -134,7 +134,7 @@ test("class", function() {
|
||||||
same( jQuery(".blog", "p").get(), q("mark", "simon"), "Finding elements with a context." );
|
same( jQuery(".blog", "p").get(), q("mark", "simon"), "Finding elements with a context." );
|
||||||
same( jQuery(".blog", jQuery("p")).get(), q("mark", "simon"), "Finding elements with a context." );
|
same( jQuery(".blog", jQuery("p")).get(), q("mark", "simon"), "Finding elements with a context." );
|
||||||
same( jQuery("p").find(".blog").get(), q("mark", "simon"), "Finding elements with a context." );
|
same( jQuery("p").find(".blog").get(), q("mark", "simon"), "Finding elements with a context." );
|
||||||
|
|
||||||
t( "Class selector using UTF8", ".台北Táiběi", ["utf8class1"] );
|
t( "Class selector using UTF8", ".台北Táiběi", ["utf8class1"] );
|
||||||
//t( "Class selector using UTF8", ".台北", ["utf8class1","utf8class2"] );
|
//t( "Class selector using UTF8", ".台北", ["utf8class1","utf8class2"] );
|
||||||
t( "Class selector using UTF8", ".台北Táiběi.台北", ["utf8class1"] );
|
t( "Class selector using UTF8", ".台北Táiběi.台北", ["utf8class1"] );
|
||||||
|
@ -194,7 +194,7 @@ test("name", function() {
|
||||||
|
|
||||||
test("multiple", function() {
|
test("multiple", function() {
|
||||||
expect(4);
|
expect(4);
|
||||||
|
|
||||||
t( "Comma Support", "h2, p", ["qunit-banner","qunit-userAgent","firstp","ap","sndp","en","sap","first"]);
|
t( "Comma Support", "h2, p", ["qunit-banner","qunit-userAgent","firstp","ap","sndp","en","sap","first"]);
|
||||||
t( "Comma Support", "h2 , p", ["qunit-banner","qunit-userAgent","firstp","ap","sndp","en","sap","first"]);
|
t( "Comma Support", "h2 , p", ["qunit-banner","qunit-userAgent","firstp","ap","sndp","en","sap","first"]);
|
||||||
t( "Comma Support", "h2 , p", ["qunit-banner","qunit-userAgent","firstp","ap","sndp","en","sap","first"]);
|
t( "Comma Support", "h2 , p", ["qunit-banner","qunit-userAgent","firstp","ap","sndp","en","sap","first"]);
|
||||||
|
@ -242,7 +242,7 @@ test("attributes", function() {
|
||||||
t( "Attribute Exists", "*[title]", ["google"] );
|
t( "Attribute Exists", "*[title]", ["google"] );
|
||||||
t( "Attribute Exists", "[title]", ["google"] );
|
t( "Attribute Exists", "[title]", ["google"] );
|
||||||
t( "Attribute Exists", "a[ title ]", ["google"] );
|
t( "Attribute Exists", "a[ title ]", ["google"] );
|
||||||
|
|
||||||
t( "Attribute Equals", "a[rel='bookmark']", ["simon1"] );
|
t( "Attribute Equals", "a[rel='bookmark']", ["simon1"] );
|
||||||
t( "Attribute Equals", 'a[rel="bookmark"]', ["simon1"] );
|
t( "Attribute Equals", 'a[rel="bookmark"]', ["simon1"] );
|
||||||
t( "Attribute Equals", "a[rel=bookmark]", ["simon1"] );
|
t( "Attribute Equals", "a[rel=bookmark]", ["simon1"] );
|
||||||
|
@ -263,13 +263,13 @@ test("attributes", function() {
|
||||||
t( "Attribute containing []", "input[name$='[bar]']", ["hidden2"] );
|
t( "Attribute containing []", "input[name$='[bar]']", ["hidden2"] );
|
||||||
t( "Attribute containing []", "input[name$='foo[bar]']", ["hidden2"] );
|
t( "Attribute containing []", "input[name$='foo[bar]']", ["hidden2"] );
|
||||||
t( "Attribute containing []", "input[name*='foo[bar]']", ["hidden2"] );
|
t( "Attribute containing []", "input[name*='foo[bar]']", ["hidden2"] );
|
||||||
|
|
||||||
t( "Multiple Attribute Equals", "#form input[type='radio'], #form input[type='hidden']", ["radio1", "radio2", "hidden1"] );
|
t( "Multiple Attribute Equals", "#form input[type='radio'], #form input[type='hidden']", ["radio1", "radio2", "hidden1"] );
|
||||||
t( "Multiple Attribute Equals", "#form input[type='radio'], #form input[type=\"hidden\"]", ["radio1", "radio2", "hidden1"] );
|
t( "Multiple Attribute Equals", "#form input[type='radio'], #form input[type=\"hidden\"]", ["radio1", "radio2", "hidden1"] );
|
||||||
t( "Multiple Attribute Equals", "#form input[type='radio'], #form input[type=hidden]", ["radio1", "radio2", "hidden1"] );
|
t( "Multiple Attribute Equals", "#form input[type='radio'], #form input[type=hidden]", ["radio1", "radio2", "hidden1"] );
|
||||||
|
|
||||||
t( "Attribute selector using UTF8", "span[lang=中文]", ["台北"] );
|
t( "Attribute selector using UTF8", "span[lang=中文]", ["台北"] );
|
||||||
|
|
||||||
t( "Attribute Begins With", "a[href ^= 'http://www']", ["google","yahoo"] );
|
t( "Attribute Begins With", "a[href ^= 'http://www']", ["google","yahoo"] );
|
||||||
t( "Attribute Ends With", "a[href $= 'org/']", ["mark"] );
|
t( "Attribute Ends With", "a[href $= 'org/']", ["mark"] );
|
||||||
t( "Attribute Contains", "a[href *= 'google']", ["google","groups"] );
|
t( "Attribute Contains", "a[href *= 'google']", ["google","groups"] );
|
||||||
|
@ -288,11 +288,11 @@ test("attributes", function() {
|
||||||
|
|
||||||
t("Empty values", "#select1 option[value='']", ["option1a"]);
|
t("Empty values", "#select1 option[value='']", ["option1a"]);
|
||||||
t("Empty values", "#select1 option[value!='']", ["option1b","option1c","option1d"]);
|
t("Empty values", "#select1 option[value!='']", ["option1b","option1c","option1d"]);
|
||||||
|
|
||||||
t("Select options via :selected", "#select1 option:selected", ["option1a"] );
|
t("Select options via :selected", "#select1 option:selected", ["option1a"] );
|
||||||
t("Select options via :selected", "#select2 option:selected", ["option2d"] );
|
t("Select options via :selected", "#select2 option:selected", ["option2d"] );
|
||||||
t("Select options via :selected", "#select3 option:selected", ["option3b", "option3c"] );
|
t("Select options via :selected", "#select3 option:selected", ["option3b", "option3c"] );
|
||||||
|
|
||||||
t( "Grouped Form Elements", "input[name='foo[bar]']", ["hidden2"] );
|
t( "Grouped Form Elements", "input[name='foo[bar]']", ["hidden2"] );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -315,10 +315,10 @@ test("pseudo - child", function() {
|
||||||
t( "First Child", "p:first-child", [] );
|
t( "First Child", "p:first-child", [] );
|
||||||
|
|
||||||
QUnit.reset();
|
QUnit.reset();
|
||||||
|
|
||||||
t( "Last Child", "p:last-child", ["sap"] );
|
t( "Last Child", "p:last-child", ["sap"] );
|
||||||
t( "Last Child", "#main a:last-child", ["simon1","anchor1","mark","yahoo","anchor2","simon","liveLink1","liveLink2"] );
|
t( "Last Child", "#main a:last-child", ["simon1","anchor1","mark","yahoo","anchor2","simon","liveLink1","liveLink2"] );
|
||||||
|
|
||||||
t( "Nth-child", "#main form#form > *:nth-child(2)", ["text1"] );
|
t( "Nth-child", "#main form#form > *:nth-child(2)", ["text1"] );
|
||||||
t( "Nth-child", "#main form#form > :nth-child(2)", ["text1"] );
|
t( "Nth-child", "#main form#form > :nth-child(2)", ["text1"] );
|
||||||
|
|
||||||
|
@ -347,7 +347,7 @@ test("pseudo - misc", function() {
|
||||||
|
|
||||||
t( "Headers", ":header", ["qunit-header", "qunit-banner", "qunit-userAgent"] );
|
t( "Headers", ":header", ["qunit-header", "qunit-banner", "qunit-userAgent"] );
|
||||||
t( "Has Children - :has()", "p:has(a)", ["firstp","ap","en","sap"] );
|
t( "Has Children - :has()", "p:has(a)", ["firstp","ap","en","sap"] );
|
||||||
|
|
||||||
var select = document.getElementById("select1");
|
var select = document.getElementById("select1");
|
||||||
ok( (window.Sizzle || window.jQuery.find).matchesSelector( select, ":has(option)" ), "Has Option Matches" );
|
ok( (window.Sizzle || window.jQuery.find).matchesSelector( select, ":has(option)" ), "Has Option Matches" );
|
||||||
|
|
||||||
|
@ -393,7 +393,7 @@ test("pseudo - :not", function() {
|
||||||
t( ":not() Multiple Class", "#foo a:not(.blog.link)", ["yahoo","anchor2"] );
|
t( ":not() Multiple Class", "#foo a:not(.blog.link)", ["yahoo","anchor2"] );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("pseudo - position", function() {
|
test("pseudo - position", function() {
|
||||||
expect(25);
|
expect(25);
|
||||||
t( "nth Element", "p:nth(1)", ["ap"] );
|
t( "nth Element", "p:nth(1)", ["ap"] );
|
||||||
t( "First Element", "p:first", ["firstp"] );
|
t( "First Element", "p:first", ["firstp"] );
|
||||||
|
|
|
@ -138,7 +138,7 @@ test("closest()", function() {
|
||||||
same( jq.closest("html", document.body).get(), [], "Context limited." );
|
same( jq.closest("html", document.body).get(), [], "Context limited." );
|
||||||
same( jq.closest("body", document.body).get(), [], "Context limited." );
|
same( jq.closest("body", document.body).get(), [], "Context limited." );
|
||||||
same( jq.closest("#nothiddendiv", document.body).get(), q("nothiddendiv"), "Context not reached." );
|
same( jq.closest("#nothiddendiv", document.body).get(), q("nothiddendiv"), "Context not reached." );
|
||||||
|
|
||||||
//Test that .closest() returns unique'd set
|
//Test that .closest() returns unique'd set
|
||||||
equals( jQuery('#main p').closest('#main').length, 1, "Closest should return a unique set" );
|
equals( jQuery('#main p').closest('#main').length, 1, "Closest should return a unique set" );
|
||||||
|
|
||||||
|
@ -275,9 +275,9 @@ test("parents([String])", function() {
|
||||||
|
|
||||||
test("parentsUntil([String])", function() {
|
test("parentsUntil([String])", function() {
|
||||||
expect(9);
|
expect(9);
|
||||||
|
|
||||||
var parents = jQuery("#groups").parents();
|
var parents = jQuery("#groups").parents();
|
||||||
|
|
||||||
same( jQuery("#groups").parentsUntil().get(), parents.get(), "parentsUntil with no selector (nextAll)" );
|
same( jQuery("#groups").parentsUntil().get(), parents.get(), "parentsUntil with no selector (nextAll)" );
|
||||||
same( jQuery("#groups").parentsUntil(".foo").get(), parents.get(), "parentsUntil with invalid selector (nextAll)" );
|
same( jQuery("#groups").parentsUntil(".foo").get(), parents.get(), "parentsUntil with invalid selector (nextAll)" );
|
||||||
same( jQuery("#groups").parentsUntil("#html").get(), parents.not(':last').get(), "Simple parentsUntil check" );
|
same( jQuery("#groups").parentsUntil("#html").get(), parents.not(':last').get(), "Simple parentsUntil check" );
|
||||||
|
@ -307,9 +307,9 @@ test("prev([String])", function() {
|
||||||
|
|
||||||
test("nextAll([String])", function() {
|
test("nextAll([String])", function() {
|
||||||
expect(4);
|
expect(4);
|
||||||
|
|
||||||
var elems = jQuery('#form').children();
|
var elems = jQuery('#form').children();
|
||||||
|
|
||||||
same( jQuery("#label-for").nextAll().get(), elems.not(':first').get(), "Simple nextAll check" );
|
same( jQuery("#label-for").nextAll().get(), elems.not(':first').get(), "Simple nextAll check" );
|
||||||
same( jQuery("#label-for").nextAll('input').get(), elems.not(':first').filter('input').get(), "Filtered nextAll check" );
|
same( jQuery("#label-for").nextAll('input').get(), elems.not(':first').filter('input').get(), "Filtered nextAll check" );
|
||||||
same( jQuery("#label-for").nextAll('input,select').get(), elems.not(':first').filter('input,select').get(), "Multiple-filtered nextAll check" );
|
same( jQuery("#label-for").nextAll('input,select').get(), elems.not(':first').filter('input,select').get(), "Multiple-filtered nextAll check" );
|
||||||
|
@ -318,9 +318,9 @@ test("nextAll([String])", function() {
|
||||||
|
|
||||||
test("prevAll([String])", function() {
|
test("prevAll([String])", function() {
|
||||||
expect(4);
|
expect(4);
|
||||||
|
|
||||||
var elems = jQuery( jQuery('#form').children().slice(0, 12).get().reverse() );
|
var elems = jQuery( jQuery('#form').children().slice(0, 12).get().reverse() );
|
||||||
|
|
||||||
same( jQuery("#area1").prevAll().get(), elems.get(), "Simple prevAll check" );
|
same( jQuery("#area1").prevAll().get(), elems.get(), "Simple prevAll check" );
|
||||||
same( jQuery("#area1").prevAll('input').get(), elems.filter('input').get(), "Filtered prevAll check" );
|
same( jQuery("#area1").prevAll('input').get(), elems.filter('input').get(), "Filtered prevAll check" );
|
||||||
same( jQuery("#area1").prevAll('input,select').get(), elems.filter('input,select').get(), "Multiple-filtered prevAll check" );
|
same( jQuery("#area1").prevAll('input,select').get(), elems.filter('input,select').get(), "Multiple-filtered prevAll check" );
|
||||||
|
@ -329,9 +329,9 @@ test("prevAll([String])", function() {
|
||||||
|
|
||||||
test("nextUntil([String])", function() {
|
test("nextUntil([String])", function() {
|
||||||
expect(11);
|
expect(11);
|
||||||
|
|
||||||
var elems = jQuery('#form').children().slice( 2, 12 );
|
var elems = jQuery('#form').children().slice( 2, 12 );
|
||||||
|
|
||||||
same( jQuery("#text1").nextUntil().get(), jQuery("#text1").nextAll().get(), "nextUntil with no selector (nextAll)" );
|
same( jQuery("#text1").nextUntil().get(), jQuery("#text1").nextAll().get(), "nextUntil with no selector (nextAll)" );
|
||||||
same( jQuery("#text1").nextUntil(".foo").get(), jQuery("#text1").nextAll().get(), "nextUntil with invalid selector (nextAll)" );
|
same( jQuery("#text1").nextUntil(".foo").get(), jQuery("#text1").nextAll().get(), "nextUntil with invalid selector (nextAll)" );
|
||||||
same( jQuery("#text1").nextUntil("#area1").get(), elems.get(), "Simple nextUntil check" );
|
same( jQuery("#text1").nextUntil("#area1").get(), elems.get(), "Simple nextUntil check" );
|
||||||
|
@ -342,15 +342,15 @@ test("nextUntil([String])", function() {
|
||||||
same( jQuery("#text1").nextUntil("#area1", "button,input").get(), elems.get(), "Multiple-filtered nextUntil check" );
|
same( jQuery("#text1").nextUntil("#area1", "button,input").get(), elems.get(), "Multiple-filtered nextUntil check" );
|
||||||
equals( jQuery("#text1").nextUntil("#area1", "div").length, 0, "Filtered nextUntil check, no match" );
|
equals( jQuery("#text1").nextUntil("#area1", "div").length, 0, "Filtered nextUntil check, no match" );
|
||||||
same( jQuery("#text1, #hidden1").nextUntil("#area1", "button,input").get(), elems.get(), "Multi-source, multiple-filtered nextUntil check" );
|
same( jQuery("#text1, #hidden1").nextUntil("#area1", "button,input").get(), elems.get(), "Multi-source, multiple-filtered nextUntil check" );
|
||||||
|
|
||||||
same( jQuery("#text1").nextUntil("[class=foo]").get(), jQuery("#text1").nextAll().get(), "Non-element nodes must be skipped, since they have no attributes" );
|
same( jQuery("#text1").nextUntil("[class=foo]").get(), jQuery("#text1").nextAll().get(), "Non-element nodes must be skipped, since they have no attributes" );
|
||||||
});
|
});
|
||||||
|
|
||||||
test("prevUntil([String])", function() {
|
test("prevUntil([String])", function() {
|
||||||
expect(10);
|
expect(10);
|
||||||
|
|
||||||
var elems = jQuery("#area1").prevAll();
|
var elems = jQuery("#area1").prevAll();
|
||||||
|
|
||||||
same( jQuery("#area1").prevUntil().get(), elems.get(), "prevUntil with no selector (prevAll)" );
|
same( jQuery("#area1").prevUntil().get(), elems.get(), "prevUntil with no selector (prevAll)" );
|
||||||
same( jQuery("#area1").prevUntil(".foo").get(), elems.get(), "prevUntil with invalid selector (prevAll)" );
|
same( jQuery("#area1").prevUntil(".foo").get(), elems.get(), "prevUntil with invalid selector (prevAll)" );
|
||||||
same( jQuery("#area1").prevUntil("label").get(), elems.not(':last').get(), "Simple prevUntil check" );
|
same( jQuery("#area1").prevUntil("label").get(), elems.not(':last').get(), "Simple prevUntil check" );
|
||||||
|
|
Loading…
Add table
Reference in a new issue