jquery.xdomainrequest.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // jQuery.XDomainRequest.js
  2. // Author: Jason Moon - @JSONMOON
  3. // IE8+
  4. if (!jQuery.support.cors && jQuery.ajaxTransport && window.XDomainRequest) {
  5. var httpRegEx = /^https?:\/\//i;
  6. var getOrPostRegEx = /^get|post$/i;
  7. var sameSchemeRegEx = new RegExp('^'+location.protocol, 'i');
  8. var htmlRegEx = /text\/html/i;
  9. var jsonRegEx = /\/json/i;
  10. var xmlRegEx = /\/xml/i;
  11. // ajaxTransport exists in jQuery 1.5+
  12. jQuery.ajaxTransport('text html xml json', function(options, userOptions, jqXHR){
  13. // XDomainRequests must be: asynchronous, GET or POST methods, HTTP or HTTPS protocol, and same scheme as calling page
  14. if (options.crossDomain && options.async && getOrPostRegEx.test(options.type) && httpRegEx.test(options.url) && sameSchemeRegEx.test(options.url)) {
  15. var xdr = null;
  16. var userType = (userOptions.dataType||'').toLowerCase();
  17. return {
  18. send: function(headers, complete){
  19. xdr = new XDomainRequest();
  20. if (/^\d+$/.test(userOptions.timeout)) {
  21. xdr.timeout = userOptions.timeout;
  22. }
  23. xdr.ontimeout = function(){
  24. complete(500, 'timeout');
  25. };
  26. xdr.onload = function(){
  27. var allResponseHeaders = 'Content-Length: ' + xdr.responseText.length + '\r\nContent-Type: ' + xdr.contentType;
  28. var status = {
  29. code: 200,
  30. message: 'success'
  31. };
  32. var responses = {
  33. text: xdr.responseText
  34. };
  35. try {
  36. if (userType === 'html' || htmlRegEx.test(xdr.contentType)) {
  37. responses.html = xdr.responseText;
  38. } else if (userType === 'json' || (userType !== 'text' && jsonRegEx.test(xdr.contentType))) {
  39. try {
  40. responses.json = jQuery.parseJSON(xdr.responseText);
  41. } catch(e) {
  42. status.code = 500;
  43. status.message = 'parseerror';
  44. //throw 'Invalid JSON: ' + xdr.responseText;
  45. }
  46. } else if (userType === 'xml' || (userType !== 'text' && xmlRegEx.test(xdr.contentType))) {
  47. var doc = new ActiveXObject('Microsoft.XMLDOM');
  48. doc.async = false;
  49. try {
  50. doc.loadXML(xdr.responseText);
  51. } catch(e) {
  52. doc = undefined;
  53. }
  54. if (!doc || !doc.documentElement || doc.getElementsByTagName('parsererror').length) {
  55. status.code = 500;
  56. status.message = 'parseerror';
  57. throw 'Invalid XML: ' + xdr.responseText;
  58. }
  59. responses.xml = doc;
  60. }
  61. } catch(parseMessage) {
  62. throw parseMessage;
  63. } finally {
  64. complete(status.code, status.message, responses, allResponseHeaders);
  65. }
  66. };
  67. // set an empty handler for 'onprogress' so requests don't get aborted
  68. xdr.onprogress = function(){};
  69. xdr.onerror = function(){
  70. complete(500, 'error', {
  71. text: xdr.responseText
  72. });
  73. };
  74. var postData = '';
  75. if (userOptions.data) {
  76. postData = (jQuery.type(userOptions.data) === 'string') ? userOptions.data : jQuery.param(userOptions.data);
  77. }
  78. xdr.open(options.type, options.url);
  79. xdr.send(postData);
  80. },
  81. abort: function(){
  82. if (xdr) {
  83. xdr.abort();
  84. }
  85. }
  86. };
  87. }
  88. });
  89. }