X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Ftransports%2Fscript.js;fp=src%2Ftransports%2Fscript.js;h=5470deccedcbce80453d1599d9dfe6045c6d3b74;hb=ab3ba4a81252c4357a7aab5f24d765d41d47986e;hp=0000000000000000000000000000000000000000;hpb=29616e60c88bf300f4b2ee4ad1a89a8ac6481027;p=jquery.git diff --git a/src/transports/script.js b/src/transports/script.js new file mode 100644 index 0000000..5470dec --- /dev/null +++ b/src/transports/script.js @@ -0,0 +1,83 @@ +(function( jQuery ) { + +// Install text to script executor +jQuery.extend( true, jQuery.ajaxSettings , { + + accepts: { + script: "text/javascript, application/javascript" + }, + + autoDataType: { + script: /javascript/ + }, + + dataConverters: { + "text => script": jQuery.globalEval + } +} ); + +// Bind script tag hack transport +jQuery.xhr.bindTransport("script", function(s) { + + // Handle cache special case + if ( s.cache === undefined ) { + s.cache = false; + } + + // This transport only deals with cross domain get requests + if ( s.crossDomain && s.async && ( s.type === "GET" || ! s.data ) ) { + + s.global = false; + + var script, + head = document.getElementsByTagName("head")[0] || document.documentElement; + + return { + + send: function(_, callback) { + + script = document.createElement("script"); + + script.async = "async"; + + if ( s.scriptCharset ) { + script.charset = s.scriptCharset; + } + + script.src = s.url; + + // Attach handlers for all browsers + script.onload = script.onreadystatechange = function(statusText) { + + if ( (!script.readyState || + script.readyState === "loaded" || script.readyState === "complete") ) { + + // Handle memory leak in IE + script.onload = script.onreadystatechange = null; + + // Remove the script + if ( head && script.parentNode ) { + head.removeChild( script ); + } + + script = undefined; + + // Callback & dereference + callback(statusText ? 0 : 200, statusText || "success"); + } + }; + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709 and #4378). + head.insertBefore( script, head.firstChild ); + }, + + abort: function(statusText) { + if ( script ) { + script.onload(statusText); + } + } + }; + } +}); + +})(jQuery);