X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fajax.js;h=07e706c4c5fb55b9cb9ceb90d968e5438ee94fa0;hb=7afe6dcc0837ac00cea7fbb7de6fb95b745148c2;hp=9501e8a07eb0189fd6078a706ebec3a578e8b000;hpb=6861b5d4eb16222ed5ea623af6ce75362b55d1d4;p=jquery.git diff --git a/src/ajax.js b/src/ajax.js index 9501e8a..07e706c 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -178,16 +178,15 @@ jQuery.extend({ // implement the XMLHttpRequest in IE7 (can't request local files), // so we use the ActiveXObject when it is available // This function can be overriden by calling jQuery.ajaxSetup - xhr: function() { - if ( window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ) { + xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? + function() { return new window.XMLHttpRequest(); - - } else { + } : + function() { try { return new window.ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} - } - }, + }, accepts: { xml: "application/xml, text/xml", html: "text/html", @@ -394,7 +393,9 @@ jQuery.extend({ // The request was aborted, clear the interval and decrement jQuery.active if ( !xhr || xhr.readyState === 0 ) { requestDone = true; - xhr.onreadystatechange = jQuery.noop; + if ( xhr ) { + xhr.onreadystatechange = jQuery.noop; + } // Handle the global AJAX counter if ( s.global && ! --jQuery.active ) { @@ -448,6 +449,22 @@ jQuery.extend({ } }; + // Override the abort handler, if we can (IE doesn't allow it, but that's OK) + // Opera doesn't fire onreadystatechange at all on abort + try { + var oldAbort = xhr.abort; + xhr.abort = function() { + oldAbort.call( xhr ); + if ( xhr ) { + xhr.readyState = 0; + } + if ( !requestDone ) { + complete(); + } + onreadystatechange(); + }; + } catch(e) { } + // Timeout checker if ( s.async && s.timeout > 0 ) { setTimeout(function() { @@ -571,20 +588,29 @@ jQuery.extend({ // The filter can actually parse the response if ( typeof data === "string" ) { - // If the type is "script", eval it in global context - if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) { - jQuery.globalEval( data ); - } - // Get the JavaScript object, if JSON is used. if ( type === "json" || !type && ct.indexOf("json") >= 0 ) { - // Try to use the native JSON parser first - try { - data = JSON.parse( data ); + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if (/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@") + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]") + .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) { + + // Try to use the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + data = window.JSON.parse( data ); + + } else { + data = (new Function("return " + data))(); + } - } catch(e) { - data = (new Function("return " + data))(); + } else { + throw "Invalid JSON: " + data; } + + // If the type is "script", eval it in global context + } else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) { + jQuery.globalEval( data ); } }