jquery.postmessage-transport.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * jQuery postMessage Transport Plugin 1.1
  3. * https://github.com/blueimp/jQuery-File-Upload
  4. *
  5. * Copyright 2011, Sebastian Tschan
  6. * https://blueimp.net
  7. *
  8. * Licensed under the MIT license:
  9. * http://www.opensource.org/licenses/MIT
  10. */
  11. /*jslint unparam: true, nomen: true */
  12. /*global define, window, document */
  13. (function (factory) {
  14. 'use strict';
  15. if (typeof define === 'function' && define.amd) {
  16. // Register as an anonymous AMD module:
  17. define(['jquery'], factory);
  18. } else {
  19. // Browser globals:
  20. factory(window.jQuery);
  21. }
  22. }(function ($) {
  23. 'use strict';
  24. var counter = 0,
  25. names = [
  26. 'accepts',
  27. 'cache',
  28. 'contents',
  29. 'contentType',
  30. 'crossDomain',
  31. 'data',
  32. 'dataType',
  33. 'headers',
  34. 'ifModified',
  35. 'mimeType',
  36. 'password',
  37. 'processData',
  38. 'timeout',
  39. 'traditional',
  40. 'type',
  41. 'url',
  42. 'username'
  43. ],
  44. convert = function (p) {
  45. return p;
  46. };
  47. $.ajaxSetup({
  48. converters: {
  49. 'postmessage text': convert,
  50. 'postmessage json': convert,
  51. 'postmessage html': convert
  52. }
  53. });
  54. $.ajaxTransport('postmessage', function (options) {
  55. if (options.postMessage && window.postMessage) {
  56. var iframe,
  57. loc = $('<a>').prop('href', options.postMessage)[0],
  58. target = loc.protocol + '//' + loc.host,
  59. xhrUpload = options.xhr().upload;
  60. return {
  61. send: function (_, completeCallback) {
  62. var message = {
  63. id: 'postmessage-transport-' + (counter += 1)
  64. },
  65. eventName = 'message.' + message.id;
  66. iframe = $(
  67. '<iframe style="display:none;" src="' +
  68. options.postMessage + '" name="' +
  69. message.id + '"></iframe>'
  70. ).bind('load', function () {
  71. $.each(names, function (i, name) {
  72. message[name] = options[name];
  73. });
  74. message.dataType = message.dataType.replace('postmessage ', '');
  75. $(window).bind(eventName, function (e) {
  76. e = e.originalEvent;
  77. var data = e.data,
  78. ev;
  79. if (e.origin === target && data.id === message.id) {
  80. if (data.type === 'progress') {
  81. ev = document.createEvent('Event');
  82. ev.initEvent(data.type, false, true);
  83. $.extend(ev, data);
  84. xhrUpload.dispatchEvent(ev);
  85. } else {
  86. completeCallback(
  87. data.status,
  88. data.statusText,
  89. {postmessage: data.result},
  90. data.headers
  91. );
  92. iframe.remove();
  93. $(window).unbind(eventName);
  94. }
  95. }
  96. });
  97. iframe[0].contentWindow.postMessage(
  98. message,
  99. target
  100. );
  101. }).appendTo(document.body);
  102. },
  103. abort: function () {
  104. if (iframe) {
  105. iframe.remove();
  106. }
  107. }
  108. };
  109. }
  110. });
  111. }));