- /*
- * jQuery Iframe Transport Plugin 1.1
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2011, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://creativecommons.org/licenses/MIT/
- */
- /*jslint unparam: true */
- /*global jQuery */
- (function ($) {
- 'use strict';
- // Helper variable to create unique names for the transport iframes:
- var counter = 0;
- // The iframe transport accepts two additional options:
- // options.fileInput: a jQuery collection of file input fields
- // options.formData: an array of objects with name and value properties,
- // equivalent to the return data of .serializeArray(), e.g.:
- // [{name: a, value: 1}, {name: b, value: 2}]
- $.ajaxTransport('iframe', function (options, originalOptions, jqXHR) {
- if (options.type === 'POST' || options.type === 'GET') {
- var form,
- iframe;
- return {
- send: function (headers, completeCallback) {
- form = $('<form style="display:none;"></form>');
- // javascript:false as initial iframe src
- // prevents warning popups on HTTPS in IE6.
- // IE versions below IE8 cannot set the name property of
- // elements that have already been added to the DOM,
- // so we set the name along with the iframe HTML markup:
- iframe = $(
- '<iframe src="javascript:false;" name="iframe-transport-' +
- (counter += 1) + '"></iframe>'
- ).bind('load', function () {
- var fileInputClones;
- iframe
- .unbind('load')
- .bind('load', function () {
- // The complete callback returns the
- // iframe content document as response object:
- completeCallback(
- 200,
- 'success',
- {'iframe': iframe.contents()}
- );
- // Fix for IE endless progress bar activity bug
- // (happens on form submits to iframe targets):
- $('<iframe src="javascript:false;"></iframe>')
- .appendTo(form);
- form.remove();
- });
- form
- .prop('target', iframe.prop('name'))
- .prop('action', options.url)
- .prop('method', options.type);
- if (options.formData) {
- $.each(options.formData, function (index, field) {
- $('<input type="hidden"/>')
- .prop('name', field.name)
- .val(field.value)
- .appendTo(form);
- });
- }
- if (options.fileInput && options.fileInput.length &&
- options.type === 'POST') {
- fileInputClones = options.fileInput.clone();
- // Insert a clone for each file input field:
- options.fileInput.after(function (index) {
- return fileInputClones[index];
- });
- // Appending the file input fields to the hidden form
- // removes them from their original location:
- form
- .append(options.fileInput)
- .prop('enctype', 'multipart/form-data')
- // enctype must be set as encoding for IE:
- .prop('encoding', 'multipart/form-data');
- }
- form.submit();
- // Insert the file input fields at their original location
- // by replacing the clones with the originals:
- if (fileInputClones && fileInputClones.length) {
- options.fileInput.each(function (index, input) {
- $(fileInputClones[index]).replaceWith(input);
- });
- }
- });
- form.append(iframe).appendTo('body');
- },
- abort: function () {
- if (iframe) {
- // javascript:false as iframe src aborts the request
- // and prevents warning popups on HTTPS in IE6.
- // concat is used to avoid the "Script URL" JSLint error:
- iframe
- .unbind('load')
- .prop('src', 'javascript'.concat(':false;'));
- }
- if (form) {
- form.remove();
- }
- }
- };
- }
- });
- // The iframe transport returns the iframe content document as response.
- // The following adds converters from iframe to text, json, html, and script:
- $.ajaxSetup({
- converters: {
- 'iframe text': function (iframe) {
- return iframe.text();
- },
- 'iframe json': function (iframe) {
- return $.parseJSON(iframe.text());
- },
- 'iframe html': function (iframe) {
- return iframe.find('body').html();
- },
- 'iframe script': function (iframe) {
- return $.globalEval(iframe.text());
- }
- }
- });
- }(jQuery));
|