Update jquery.form.js to 2.63 -- 2.60 fixed our Opera regression per issue #3015

Thanks to the fine folks at http://forum.jquery.com/topic/regression-form-plugin-ajaxform-cannot-access-xml-return-data-in-opera#14737000001950332 :D
This commit is contained in:
Brion Vibber 2011-01-31 11:02:29 -08:00
parent ea4ebe280a
commit b2f4a02377
2 changed files with 58 additions and 40 deletions

View File

@ -1,6 +1,6 @@
/*! /*!
* jQuery Form Plugin * jQuery Form Plugin
* version: 2.49 (18-OCT-2010) * version: 2.63 (29-JAN-2011)
* @requires jQuery v1.3.2 or later * @requires jQuery v1.3.2 or later
* *
* Examples and documentation at: http://malsup.com/jquery/form/ * Examples and documentation at: http://malsup.com/jquery/form/
@ -54,7 +54,8 @@ $.fn.ajaxSubmit = function(options) {
options = { success: options }; options = { success: options };
} }
var url = $.trim(this.attr('action')); var action = this.attr('action');
var url = (typeof action === 'string') ? $.trim(action) : '';
if (url) { if (url) {
// clean url (don't include hash vaue) // clean url (don't include hash vaue)
url = (url.match(/^([^#]+)/)||[])[1]; url = (url.match(/^([^#]+)/)||[])[1];
@ -63,7 +64,7 @@ $.fn.ajaxSubmit = function(options) {
options = $.extend(true, { options = $.extend(true, {
url: url, url: url,
type: this.attr('method') || 'GET', type: this[0].getAttribute('method') || 'GET', // IE7 massage (see issue 57)
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
}, options); }, options);
@ -189,15 +190,7 @@ $.fn.ajaxSubmit = function(options) {
var s = $.extend(true, {}, $.ajaxSettings, options); var s = $.extend(true, {}, $.ajaxSettings, options);
s.context = s.context || s; s.context = s.context || s;
var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id; var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id;
window[fn] = function() { var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" />');
var f = $io.data('form-plugin-onload');
if (f) {
f();
window[fn] = undefined;
try { delete window[fn]; } catch(e){}
}
}
var $io = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" onload="window[\'_\'+this.id]()" />');
var io = $io[0]; var io = $io[0];
$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' }); $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
@ -236,7 +229,6 @@ $.fn.ajaxSubmit = function(options) {
return; return;
} }
var cbInvoked = false;
var timedOut = 0; var timedOut = 0;
// add submitting element to data if we know it // add submitting element to data if we know it
@ -293,7 +285,7 @@ $.fn.ajaxSubmit = function(options) {
// add iframe to doc and submit the form // add iframe to doc and submit the form
$io.appendTo('body'); $io.appendTo('body');
$io.data('form-plugin-onload', cb); io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
form.submit(); form.submit();
} }
finally { finally {
@ -318,19 +310,18 @@ $.fn.ajaxSubmit = function(options) {
var data, doc, domCheckCount = 50; var data, doc, domCheckCount = 50;
function cb() { function cb() {
if (cbInvoked) { doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
if (!doc || doc.location.href == s.iframeSrc) {
// response not received yet
return; return;
} }
io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
$io.removeData('form-plugin-onload');
var ok = true; var ok = true;
try { try {
if (timedOut) { if (timedOut) {
throw 'timeout'; throw 'timeout';
} }
// extract the server response from the iframe
doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc); var isXml = s.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
log('isXml='+isXml); log('isXml='+isXml);
@ -348,8 +339,7 @@ $.fn.ajaxSubmit = function(options) {
} }
//log('response detected'); //log('response detected');
cbInvoked = true; xhr.responseText = doc.body ? doc.body.innerHTML : doc.documentElement ? doc.documentElement.innerHTML : null;
xhr.responseText = doc.documentElement ? doc.documentElement.innerHTML : null;
xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc; xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
xhr.getResponseHeader = function(header){ xhr.getResponseHeader = function(header){
var headers = {'content-type': s.dataType}; var headers = {'content-type': s.dataType};
@ -368,7 +358,7 @@ $.fn.ajaxSubmit = function(options) {
var pre = doc.getElementsByTagName('pre')[0]; var pre = doc.getElementsByTagName('pre')[0];
var b = doc.getElementsByTagName('body')[0]; var b = doc.getElementsByTagName('body')[0];
if (pre) { if (pre) {
xhr.responseText = pre.innerHTML; xhr.responseText = pre.textContent;
} }
else if (b) { else if (b) {
xhr.responseText = b.innerHTML; xhr.responseText = b.innerHTML;
@ -378,31 +368,35 @@ $.fn.ajaxSubmit = function(options) {
else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) { else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
xhr.responseXML = toXml(xhr.responseText); xhr.responseXML = toXml(xhr.responseText);
} }
data = $.httpData(xhr, s.dataType);
data = httpData(xhr, s.dataType, s);
} }
catch(e){ catch(e){
log('error caught:',e); log('error caught:',e);
ok = false; ok = false;
xhr.error = e; xhr.error = e;
$.handleError(s, xhr, 'error', e); s.error.call(s.context, xhr, 'error', e);
g && $.event.trigger("ajaxError", [xhr, s, e]);
}
if (xhr.aborted) {
log('upload aborted');
ok = false;
} }
// ordering of these callbacks/triggers is odd, but that's how $.ajax does it // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
if (ok) { if (ok) {
s.success.call(s.context, data, 'success', xhr); s.success.call(s.context, data, 'success', xhr);
if (g) { g && $.event.trigger("ajaxSuccess", [xhr, s]);
$.event.trigger("ajaxSuccess", [xhr, s]);
}
}
if (g) {
$.event.trigger("ajaxComplete", [xhr, s]);
} }
g && $.event.trigger("ajaxComplete", [xhr, s]);
if (g && ! --$.active) { if (g && ! --$.active) {
$.event.trigger("ajaxStop"); $.event.trigger("ajaxStop");
} }
if (s.complete) {
s.complete.call(s.context, xhr, ok ? 'success' : 'error'); s.complete && s.complete.call(s.context, xhr, ok ? 'success' : 'error');
}
// clean up // clean up
setTimeout(function() { setTimeout(function() {
@ -412,7 +406,7 @@ $.fn.ajaxSubmit = function(options) {
}, 100); }, 100);
} }
function toXml(s, doc) { var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
if (window.ActiveXObject) { if (window.ActiveXObject) {
doc = new ActiveXObject('Microsoft.XMLDOM'); doc = new ActiveXObject('Microsoft.XMLDOM');
doc.async = 'false'; doc.async = 'false';
@ -421,8 +415,32 @@ $.fn.ajaxSubmit = function(options) {
else { else {
doc = (new DOMParser()).parseFromString(s, 'text/xml'); doc = (new DOMParser()).parseFromString(s, 'text/xml');
} }
return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null; return (doc && doc.documentElement && doc.documentElement.nodeName != 'parsererror') ? doc : null;
};
var parseJSON = $.parseJSON || function(s) {
return window['eval']('(' + s + ')');
};
var httpData = function( xhr, type, s ) { // mostly lifted from jq1.4.4
var ct = xhr.getResponseHeader('content-type') || '',
xml = type === 'xml' || !type && ct.indexOf('xml') >= 0,
data = xml ? xhr.responseXML : xhr.responseText;
if (xml && data.documentElement.nodeName === 'parsererror') {
$.error && $.error('parsererror');
} }
if (s && s.dataFilter) {
data = s.dataFilter(data, type);
}
if (typeof data === 'string') {
if (type === 'json' || !type && ct.indexOf('json') >= 0) {
data = parseJSON(data);
} else if (type === "script" || !type && ct.indexOf("javascript") >= 0) {
$.globalEval(data);
}
}
return data;
};
} }
}; };

File diff suppressed because one or more lines are too long