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:
parent
ea4ebe280a
commit
b2f4a02377
@ -1,6 +1,6 @@
|
||||
/*!
|
||||
* jQuery Form Plugin
|
||||
* version: 2.49 (18-OCT-2010)
|
||||
* version: 2.63 (29-JAN-2011)
|
||||
* @requires jQuery v1.3.2 or later
|
||||
*
|
||||
* Examples and documentation at: http://malsup.com/jquery/form/
|
||||
@ -54,7 +54,8 @@ $.fn.ajaxSubmit = function(options) {
|
||||
options = { success: options };
|
||||
}
|
||||
|
||||
var url = $.trim(this.attr('action'));
|
||||
var action = this.attr('action');
|
||||
var url = (typeof action === 'string') ? $.trim(action) : '';
|
||||
if (url) {
|
||||
// clean url (don't include hash vaue)
|
||||
url = (url.match(/^([^#]+)/)||[])[1];
|
||||
@ -63,7 +64,7 @@ $.fn.ajaxSubmit = function(options) {
|
||||
|
||||
options = $.extend(true, {
|
||||
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'
|
||||
}, options);
|
||||
|
||||
@ -167,7 +168,7 @@ $.fn.ajaxSubmit = function(options) {
|
||||
}
|
||||
}
|
||||
else {
|
||||
$.ajax(options);
|
||||
$.ajax(options);
|
||||
}
|
||||
|
||||
// fire 'notify' event
|
||||
@ -189,15 +190,7 @@ $.fn.ajaxSubmit = function(options) {
|
||||
var s = $.extend(true, {}, $.ajaxSettings, options);
|
||||
s.context = s.context || s;
|
||||
var id = 'jqFormIO' + (new Date().getTime()), fn = '_'+id;
|
||||
window[fn] = function() {
|
||||
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 = $('<iframe id="' + id + '" name="' + id + '" src="'+ s.iframeSrc +'" />');
|
||||
var io = $io[0];
|
||||
|
||||
$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
|
||||
@ -236,7 +229,6 @@ $.fn.ajaxSubmit = function(options) {
|
||||
return;
|
||||
}
|
||||
|
||||
var cbInvoked = false;
|
||||
var timedOut = 0;
|
||||
|
||||
// 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
|
||||
$io.appendTo('body');
|
||||
$io.data('form-plugin-onload', cb);
|
||||
io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
|
||||
form.submit();
|
||||
}
|
||||
finally {
|
||||
@ -318,20 +310,19 @@ $.fn.ajaxSubmit = function(options) {
|
||||
var data, doc, domCheckCount = 50;
|
||||
|
||||
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;
|
||||
}
|
||||
io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
|
||||
|
||||
$io.removeData('form-plugin-onload');
|
||||
|
||||
var ok = true;
|
||||
try {
|
||||
if (timedOut) {
|
||||
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);
|
||||
log('isXml='+isXml);
|
||||
if (!isXml && window.opera && (doc.body == null || doc.body.innerHTML == '')) {
|
||||
@ -348,8 +339,7 @@ $.fn.ajaxSubmit = function(options) {
|
||||
}
|
||||
|
||||
//log('response detected');
|
||||
cbInvoked = true;
|
||||
xhr.responseText = doc.documentElement ? doc.documentElement.innerHTML : null;
|
||||
xhr.responseText = doc.body ? doc.body.innerHTML : doc.documentElement ? doc.documentElement.innerHTML : null;
|
||||
xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
|
||||
xhr.getResponseHeader = function(header){
|
||||
var headers = {'content-type': s.dataType};
|
||||
@ -368,7 +358,7 @@ $.fn.ajaxSubmit = function(options) {
|
||||
var pre = doc.getElementsByTagName('pre')[0];
|
||||
var b = doc.getElementsByTagName('body')[0];
|
||||
if (pre) {
|
||||
xhr.responseText = pre.innerHTML;
|
||||
xhr.responseText = pre.textContent;
|
||||
}
|
||||
else if (b) {
|
||||
xhr.responseText = b.innerHTML;
|
||||
@ -378,31 +368,35 @@ $.fn.ajaxSubmit = function(options) {
|
||||
else if (s.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
|
||||
xhr.responseXML = toXml(xhr.responseText);
|
||||
}
|
||||
data = $.httpData(xhr, s.dataType);
|
||||
|
||||
data = httpData(xhr, s.dataType, s);
|
||||
}
|
||||
catch(e){
|
||||
log('error caught:',e);
|
||||
ok = false;
|
||||
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
|
||||
if (ok) {
|
||||
s.success.call(s.context, data, 'success', xhr);
|
||||
if (g) {
|
||||
$.event.trigger("ajaxSuccess", [xhr, s]);
|
||||
}
|
||||
}
|
||||
if (g) {
|
||||
$.event.trigger("ajaxComplete", [xhr, s]);
|
||||
g && $.event.trigger("ajaxSuccess", [xhr, s]);
|
||||
}
|
||||
|
||||
g && $.event.trigger("ajaxComplete", [xhr, s]);
|
||||
|
||||
if (g && ! --$.active) {
|
||||
$.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
|
||||
setTimeout(function() {
|
||||
@ -412,7 +406,7 @@ $.fn.ajaxSubmit = function(options) {
|
||||
}, 100);
|
||||
}
|
||||
|
||||
function toXml(s, doc) {
|
||||
var toXml = $.parseXML || function(s, doc) { // use parseXML if available (jQuery 1.5+)
|
||||
if (window.ActiveXObject) {
|
||||
doc = new ActiveXObject('Microsoft.XMLDOM');
|
||||
doc.async = 'false';
|
||||
@ -421,8 +415,32 @@ $.fn.ajaxSubmit = function(options) {
|
||||
else {
|
||||
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;
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
|
4
js/jquery.form.min.js
vendored
4
js/jquery.form.min.js
vendored
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user