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