123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // jQuery.XDomainRequest.js
- // Author: Jason Moon - @JSONMOON
- // IE8+
- if (!jQuery.support.cors && jQuery.ajaxTransport && window.XDomainRequest) {
- var httpRegEx = /^https?:\/\//i;
- var getOrPostRegEx = /^get|post$/i;
- var sameSchemeRegEx = new RegExp('^'+location.protocol, 'i');
- var htmlRegEx = /text\/html/i;
- var jsonRegEx = /\/json/i;
- var xmlRegEx = /\/xml/i;
- // ajaxTransport exists in jQuery 1.5+
- jQuery.ajaxTransport('text html xml json', function(options, userOptions, jqXHR){
- // XDomainRequests must be: asynchronous, GET or POST methods, HTTP or HTTPS protocol, and same scheme as calling page
- if (options.crossDomain && options.async && getOrPostRegEx.test(options.type) && httpRegEx.test(options.url) && sameSchemeRegEx.test(options.url)) {
- var xdr = null;
- var userType = (userOptions.dataType||'').toLowerCase();
- return {
- send: function(headers, complete){
- xdr = new XDomainRequest();
- if (/^\d+$/.test(userOptions.timeout)) {
- xdr.timeout = userOptions.timeout;
- }
- xdr.ontimeout = function(){
- complete(500, 'timeout');
- };
- xdr.onload = function(){
- var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType;
- var status = {
- code: 200,
- message: 'success'
- };
- var responses = {
- text: xdr.responseText
- };
- try {
- if (userType === 'html' || htmlRegEx.test(xdr.contentType)) {
- responses.html = xdr.responseText;
- } else if (userType === 'json' || (userType !== 'text' && jsonRegEx.test(xdr.contentType))) {
- try {
- responses.json = jQuery.parseJSON(xdr.responseText);
- } catch(e) {
- status.code = 500;
- status.message = 'parseerror';
- //throw 'Invalid JSON: ' + xdr.responseText;
- }
- } else if (userType === 'xml' || (userType !== 'text' && xmlRegEx.test(xdr.contentType))) {
- var doc = new ActiveXObject('Microsoft.XMLDOM');
- doc.async = false;
- try {
- doc.loadXML(xdr.responseText);
- } catch(e) {
- doc = undefined;
- }
- if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) {
- status.code = 500;
- status.message = 'parseerror';
- throw 'Invalid XML: ' + xdr.responseText;
- }
- responses.xml = doc;
- }
- } catch(parseMessage) {
- throw parseMessage;
- } finally {
- complete(status.code, status.message, responses, allResponseHeaders);
- }
- };
- // set an empty handler for 'onprogress' so requests don't get aborted
- xdr.onprogress = function(){};
- xdr.onerror = function(){
- complete(500, 'error', {
- text: xdr.responseText
- });
- };
- var postData = '';
- if (userOptions.data) {
- postData = (jQuery.type(userOptions.data) === 'string') ? userOptions.data : jQuery.param(userOptions.data);
- }
- xdr.open(options.type, options.url);
- xdr.send(postData);
- },
- abort: function(){
- if (xdr) {
- xdr.abort();
- }
- }
- };
- }
- });
- }
|