ieupload.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. var uploadIndex = 0;
  2. function stoneAgeUpload(elements, url, formData, callback) {
  3. formData = formData || {};
  4. var iframeName = ['stoneage-fileupload', uploadIndex].join('-');
  5. uploadIndex++;
  6. // create iframe
  7. var iframe = document.createElement('iframe');
  8. iframe.id = iframeName;
  9. iframe.name = iframeName;
  10. iframe.style.display = 'none';
  11. iframe.src = 'javascript:false;'; // to prevent warning in IE6
  12. document.body.appendChild(iframe);
  13. // create form
  14. var form = document.createElement('form');
  15. form.method = 'POST';
  16. form.action = url;
  17. form.target = iframeName;
  18. form.encoding = form.enctype = 'multipart/form-data';
  19. form.style.display = 'none';
  20. // submit additional formData in hidden inputs
  21. for (var name in formData) {
  22. var input = document.createElement('input');
  23. input.type = 'hidden';
  24. input.name = name;
  25. input.value = formData[name];
  26. form.appendChild(input);
  27. }
  28. document.body.appendChild(form);
  29. // move elements into the form, submit, move element back to original position,
  30. // and remove form
  31. var i;
  32. var l = elements.length;
  33. var nextSiblings = [];
  34. var unnamedInputs = [];
  35. var parents = [];
  36. for (i = 0; i < l; ++i) {
  37. // set 'files[]' as default name for inputs without name
  38. if (!elements[i].name) {
  39. unnamedInputs.push(elements[i]);
  40. elements[i].name = 'files[]';
  41. }
  42. nextSiblings.push(elements[i].nextSibling);
  43. parents.push(elements[i].parentNode);
  44. form.appendChild(elements[i]);
  45. }
  46. form.submit();
  47. iframe.onerror = iframe.onload = function() {
  48. // try to parse response, remove iframe, and pass response to callback
  49. var response;
  50. try {
  51. var responseStr = iframe.contentWindow.document.body.innerHTML;
  52. response = JSON.parse(responseStr);
  53. } catch(e) {
  54. response = responseStr;
  55. }
  56. iframe.parentNode.removeChild(iframe);
  57. callback(response);
  58. };
  59. for (i = l - 1; i >= 0; --i) {
  60. // unset default name attributes
  61. if (unnamedInputs.indexOf(elements[i]) >= 0) {
  62. elements[i].removeAttribute('name');
  63. }
  64. parents[i].insertBefore(elements[i], nextSiblings[i]);
  65. }
  66. form.parentNode.removeChild(form);
  67. }