summaryrefslogtreecommitdiff
path: root/ikiwiki/jquery.iframe-transport.js
diff options
context:
space:
mode:
Diffstat (limited to 'ikiwiki/jquery.iframe-transport.js')
-rw-r--r--ikiwiki/jquery.iframe-transport.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/ikiwiki/jquery.iframe-transport.js b/ikiwiki/jquery.iframe-transport.js
new file mode 100644
index 0000000..e859dfe
--- /dev/null
+++ b/ikiwiki/jquery.iframe-transport.js
@@ -0,0 +1,133 @@
+/*
+ * 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)); \ No newline at end of file