/* * 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 = $('
'); // 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 = $( '' ).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): $('') .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) { $('') .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));