Side navigation
Ticket #1768: 1768.diff
File 1768.diff, 2.6 KB (added by davidserduke, December 14, 2007 08:46PM UTC)
patch (not complete)
Index: src/ajax.js
===================================================================
--- src/ajax.js (revision 4156)
+++ src/ajax.js (working copy)
@@ -184,14 +184,18 @@
// that a JSONP style response is executed properly
s.dataType = "script";
+ function jsonpEnd() {
+ // Garbage collect
+ window[ jsonp ] = undefined;
+ try{ delete window[ jsonp ]; } catch(e){}
+ }
+
// Handle JSONP-style loading
window[ jsonp ] = function(tmp){
data = tmp;
success();
complete();
- // Garbage collect
- window[ jsonp ] = undefined;
- try{ delete window[ jsonp ]; } catch(e){}
+ jsonpEnd();
};
}
@@ -221,26 +225,45 @@
// If we're requesting a remote document
// and trying to load JSON or Script with a GET
if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && ( s.dataType == "script" || s.dataType =="json" ) && s.type.toLowerCase() == "get" ) {
- var head = document.getElementsByTagName("head")[0];
- var script = document.createElement("script");
+ var head = document.getElementsByTagName("head")[0],
+ script = document.createElement("script"),
+ done = false;
script.src = s.url;
- // Handle Script loading
- if ( !jsonp ) {
- var done = false;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function(){
- if ( !done && (!this.readyState ||
- this.readyState == "loaded" || this.readyState == "complete") ) {
- done = true;
- success();
+ function scriptTagEnd(how) {
+ if (!done) {
+ done = true;
+ status = how;
+ // don't do success/complete calls on jsonp success
+ if (!jsonp || status != "success") {
+ if (status == "success")
+ success();
+ else {
+ jQuery.handleError(s, null, status);
+ if (jsonp)
+ jsonpEnd();
+ }
complete();
- head.removeChild( script );
}
- };
+
+ head.removeChild( script );
+ }
}
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function(){
+ if ( !done && (!this.readyState ||
+ this.readyState == "loaded" || this.readyState == "complete") )
+ // opera sets the .text value so we can test that, the other browsers don't so have assume success
+ scriptTagEnd(this.text || !jQuery.browser.opera ? "success" : "error");
+ };
+ script.onerror = function(){
+ scriptTagEnd("error");
+ };
+
+ if (s.timeout)
+ setTimeout(function(){ scriptTagEnd("timeout"); }, s.timeout);
+
head.appendChild(script);
// We handle everything using the script element injection
Download in other formats:
Original Format
File 1768.diff, 2.6 KB (added by davidserduke, December 14, 2007 08:46PM UTC)
patch (not complete)
Index: src/ajax.js
===================================================================
--- src/ajax.js (revision 4156)
+++ src/ajax.js (working copy)
@@ -184,14 +184,18 @@
// that a JSONP style response is executed properly
s.dataType = "script";
+ function jsonpEnd() {
+ // Garbage collect
+ window[ jsonp ] = undefined;
+ try{ delete window[ jsonp ]; } catch(e){}
+ }
+
// Handle JSONP-style loading
window[ jsonp ] = function(tmp){
data = tmp;
success();
complete();
- // Garbage collect
- window[ jsonp ] = undefined;
- try{ delete window[ jsonp ]; } catch(e){}
+ jsonpEnd();
};
}
@@ -221,26 +225,45 @@
// If we're requesting a remote document
// and trying to load JSON or Script with a GET
if ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && ( s.dataType == "script" || s.dataType =="json" ) && s.type.toLowerCase() == "get" ) {
- var head = document.getElementsByTagName("head")[0];
- var script = document.createElement("script");
+ var head = document.getElementsByTagName("head")[0],
+ script = document.createElement("script"),
+ done = false;
script.src = s.url;
- // Handle Script loading
- if ( !jsonp ) {
- var done = false;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function(){
- if ( !done && (!this.readyState ||
- this.readyState == "loaded" || this.readyState == "complete") ) {
- done = true;
- success();
+ function scriptTagEnd(how) {
+ if (!done) {
+ done = true;
+ status = how;
+ // don't do success/complete calls on jsonp success
+ if (!jsonp || status != "success") {
+ if (status == "success")
+ success();
+ else {
+ jQuery.handleError(s, null, status);
+ if (jsonp)
+ jsonpEnd();
+ }
complete();
- head.removeChild( script );
}
- };
+
+ head.removeChild( script );
+ }
}
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function(){
+ if ( !done && (!this.readyState ||
+ this.readyState == "loaded" || this.readyState == "complete") )
+ // opera sets the .text value so we can test that, the other browsers don't so have assume success
+ scriptTagEnd(this.text || !jQuery.browser.opera ? "success" : "error");
+ };
+ script.onerror = function(){
+ scriptTagEnd("error");
+ };
+
+ if (s.timeout)
+ setTimeout(function(){ scriptTagEnd("timeout"); }, s.timeout);
+
head.appendChild(script);
// We handle everything using the script element injection