ajaxFileUpload.js 无刷新上传图片,支持多个参数同时上传,支持 ie6-ie10

ajaxFileUpload 无刷新上传的原理:

在页面动态创建 form 表单和 ifram 贞,设定 form 表单提交的目标为 ifram 贞,
将文件域和要 post 的参数动态写入 form 表单中,然后提交 from 表单。
通过 window.attachEvent 向 ifram 贞的 onload 事件中注册监听事件响应回调函数。

1.html 部分

 

[html][/html] view plaincopy

  1. <input name=”imgfile1″ id=”imgfile1″ style=”width: 200px; height: 25px;” size=”38″ type=”file” />
  2. <div id=”imgContainer1″></div>

2.调用部分

 

 

[javascript][/javascript] view plaincopy

  1. function uploadImg(imgfileId, imgcontainerId) {
  2.   $.ajaxFileUpload({
  3.     fileElementId: imgfileId,
  4.     url: ‘/UploadImage’,
  5.     dataType: ‘json’,
  6.     data: { id: ‘aaa’, name: ‘bbb’ },
  7.     beforeSend: function (XMLHttpRequest) {
  8.       //(“loading”);
  9.     },
  10.     success: function (data, textStatus) {
  11.       var img = “<img src=” width=’300′ height=’300′ />”;
  12.       $(“#” + imgcontainerId).append(img);
  13.     },
  14.     error: function (XMLHttpRequest, textStatus, errorThrown) {
  15.       var img = “图片上传失败!”;
  16.       $(“#” + imgcontainerId).append(img);
  17.       var msg = “服务器出错,错误内容:” + XMLHttpRequest.responseText;
  18.       $.messager.showWin({ msg: msg, title: ‘错误提示’, color: ‘red’ });
  19.     },
  20.     complete: function (XMLHttpRequest, textStatus) {
  21.       //(“loaded”);
  22.     }
  23.   });
  24. }

3.ajaxFileUpload.js 全部代码

 

 

[javascript][/javascript] view plaincopy

  1. /*
  2.   131108-xxj-ajaxFileUpload.js 无刷新上传图片 jquery 插件,支持 ie6-ie10
  3.   依赖:jquery-1.6.1.min.js
  4.   主方法:ajaxFileUpload 接受 json 对象参数
  5.   参数说明:
  6.   fileElementId:必选,上传文件域ID
  7.   url:必选,发送请求的URL字符串
  8.   data:可选,将和文件域一同post的参数(json对象)
  9.   其它:$.ajax 的参数均为可选参数
  10.   注:如遇到‘无法访问’的脚本错误提示则需要在响应流中加一段脚块一同输出:<script …>document.domain = ‘xxx.com’;</script>
  11. */
  12. jQuery.extend({
  13.   //创建 iframe 元素,接受提交及响应
  14.   createUploadIframe: function(id, uri) {
  15.     //create frame
  16.     var frameId = ‘jUploadFrame’ + id;
  17.     if (window.ActiveXObject) {
  18.       //fix ie9 and ie 10————-
  19.       if (jQuery.browser.version == “9.0” || jQuery.browser.version == “10.0”) {
  20.         var io = document.createElement(‘iframe’);
  21.         io.id = frameId;
  22.         io.name = frameId;
  23.       } else if (jQuery.browser.version == “6.0” || jQuery.browser.version == “7.0” || jQuery.browser.version == “8.0”) {
  24.         var io = document.createElement(‘<iframe id=”‘ + frameId + ‘” name=”‘ + frameId + ‘” />’);
  25.         if (typeof uri == ‘boolean’) {
  26.           io.src = ‘javascript:false’;
  27.         } else if (typeof uri == ‘string’) {
  28.           io.src = uri;
  29.         }
  30.       }
  31.     } else {
  32.       var io = document.createElement(‘iframe’);
  33.       io.id = frameId;
  34.       io.name = frameId;
  35.     }
  36.     io.style.position = ‘absolute’;
  37.     io.style.top = ‘-1000px’;
  38.     io.style.left = ‘-1000px’;
  39.     document.body.appendChild(io);
  40.     return io;
  41.   },
  42.   //创建 from 元素,用于提交的表单
  43.   createUploadForm: function(id, fileElementId, postData) {
  44.     //create form
  45.     var formId = ‘jUploadForm’ + id;
  46.     var fileId = ‘jUploadFile’ + id;
  47.     var form = $(‘<form  action=”” method=”POST” name=”‘ + formId + ‘” id=”‘ + formId + ‘” enctype=”multipart/form-data”></form>’);
  48.     var oldElement = $(‘#’ + fileElementId);
  49.     var newElement = $(oldElement).clone();
  50.     $(oldElement).attr(‘id’, fileId);
  51.     $(oldElement).before(newElement);
  52.     $(oldElement).appendTo(form);
  53.     //添加自定义参数
  54.     if (postData) {
  55.       //递归遍历JSON所有键值
  56.       function recurJson(json) {
  57.         for (var i in json) {
  58.           //alert(i+”=”+json[i])
  59.           $(“<input name='” + i + “‘ id='” + i + “‘ value='” + json[i] + “‘ />”).appendTo(form);
  60.           if (typeof json[i] == “object”) {
  61.             recurJson(json[i]);
  62.           }
  63.         }
  64.       }
  65.       recurJson(postData);
  66.     }
  67.     //set attributes
  68.     $(form).css(‘position’, ‘absolute’);
  69.     $(form).css(‘top’, ‘-1200px’);
  70.     $(form).css(‘left’, ‘-1200px’);
  71.     $(form).appendTo(‘body’);
  72.     return form;
  73.   },
  74.   //上传文件
  75.   //s 参数:json对象
  76.   ajaxFileUpload: function(s) {
  77.     s = jQuery.extend({}, jQuery.ajaxSettings, s);
  78.     var id = new Date().getTime();
  79.     //创建 form 表单元素
  80.     var form = jQuery.createUploadForm(id, s.fileElementId, s.data);
  81.     //创建 iframe 贞元素
  82.     var io = jQuery.createUploadIframe(id, s.secureuri);
  83.     var frameId = ‘jUploadFrame’ + id;
  84.     var formId = ‘jUploadForm’ + id;
  85.     //监测是否有新的请求
  86.     if (s.global && !jQuery.active++) {
  87.       jQuery.event.trigger(“ajaxStart”); //触发 AJAX 请求开始时执行函数。Ajax 事件。
  88.     }
  89.     var requestDone = false;
  90.     //创建请求对象
  91.     var xml = {};
  92.     if (s.global)
  93.       jQuery.event.trigger(“ajaxSend”, [xml 1=”s” language=”,”][/xml]); //触发 AJAX 请求发送前事件
  94.     //上载完成的回调函数
  95.     var uploadCallback = function(isTimeout) {
  96.       var io = document.getElementById(frameId);
  97.       try {
  98.         //存在跨域脚本访问问题,如遇到‘无法访问’提示则需要在响应流中加一段脚块:<script …>document.domain = ‘xxx.com’;</script>
  99.         if (io.contentWindow) { //兼容各个浏览器,可取得子窗口的 window 对象
  100.           xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
  101.           xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;
  102.         } else if (io.contentDocument) { //contentDocument Firefox 支持,> ie8 的ie支持。可取得子窗口的 document 对象。
  103.           xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
  104.           xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
  105.         }
  106.       } catch(e) {
  107.         jQuery.handleErrorExt(s, xml, null, e);
  108.       }
  109.       if (xml || isTimeout == “timeout”) {
  110.         requestDone = true;
  111.         var status;
  112.         try {
  113.           status = isTimeout != “timeout” ? “success” : “error”;
  114.           // Make sure that the request was successful or notmodified
  115.           if (status != “error”) {
  116.             //处理数据(运行XML通过httpData不管回调)
  117.             var data = jQuery.uploadHttpData(xml, s.dataType);
  118.             // If a local callback was specified, fire it and pass it the data
  119.             if (s.success)
  120.               s.success(data, status);
  121.             // Fire the global callback
  122.             if (s.global)
  123.               jQuery.event.trigger(“ajaxSuccess”, [xml 1=”s” language=”,”][/xml]);
  124.           } else
  125.             jQuery.handleErrorExt(s, xml, status);
  126.         } catch(e) {
  127.           status = “error”;
  128.           jQuery.handleErrorExt(s, xml, status, e);
  129.         }
  130.         // The request was completed
  131.         if (s.global)
  132.           jQuery.event.trigger(“ajaxComplete”, [xml 1=”s” language=”,”][/xml]);
  133.         // Handle the global AJAX counter
  134.         if (s.global && !–jQuery.active)
  135.           jQuery.event.trigger(“ajaxStop”);
  136.         // Process result
  137.         if (s.complete)
  138.           s.complete(xml, status);
  139.         jQuery(io).unbind();
  140.         setTimeout(function() {
  141.           try {
  142.             $(io).remove();
  143.             $(form).remove();
  144.           } catch(e) {
  145.             jQuery.handleErrorExt(s, xml, null, e);
  146.           }
  147.         }, 100);
  148.         xml = null;
  149.       }
  150.     };
  151.     //超时检查,s.timeout 毫秒后调用 uploadCallback 回调函数提示请求超时
  152.     if (s.timeout > 0) {
  153.       setTimeout(function() {
  154.         // Check to see if the request is still happening
  155.         if (!requestDone) uploadCallback(“timeout”);
  156.       }, s.timeout);
  157.     }
  158.     try {
  159.       //设置动态 form 表单的提交参数
  160.       // var io = $(‘#’ + frameId);
  161.       var form = $(‘#’ + formId);
  162.       $(form).attr(‘action’, s.url);
  163.       $(form).attr(‘method’, ‘POST’);
  164.       $(form).attr(‘target’, frameId);
  165.       if (form.encoding) {
  166.         form.encoding = ‘multipart/form-data’;
  167.       } else {
  168.         form.enctype = ‘multipart/form-data’;
  169.       }
  170.       $(form).submit();
  171.     } catch(e) {
  172.       jQuery.handleErrorExt(s, xml, null, e);
  173.     }
  174.     //向动态表单的页面加载事件中注册回调函数
  175.     if (window.attachEvent) {
  176.       document.getElementById(frameId).attachEvent(‘onload’, uploadCallback);
  177.     } else {
  178.       document.getElementById(frameId).addEventListener(‘load’, uploadCallback, false);
  179.     }
  180.     return {
  181.       abort: function() {
  182.       }
  183.     };
  184.   },
  185.   //上传文件
  186.   uploadHttpData: function(r, type) {
  187.     //alert(“type=” + type + “;uploadHttpData” + JSON.stringify(r))
  188.     var data = !type;
  189.     data = type == “xml” || data ? r.responseXML : r.responseText;
  190.     // If the type is “script”, eval it in global context
  191.     if (type == “script”)
  192.       jQuery.globalEval(data);
  193.     // Get the JavaScript object, if JSON is used.
  194.     if (type == “json”)
  195.       eval(“data = ” + data);
  196.     // evaluate scripts within html
  197.     if (type == “html”)
  198.       jQuery(“<div>”).html(data).evalScripts();
  199.     //alert($(‘param’, data).each(function(){alert($(this).attr(‘value’));}));
  200.     return data;
  201.   },
  202.   handleErrorExt: function(s, xhr, status, e) {
  203.     // If a local callback was specified, fire it
  204.     if (s.error) {
  205.       s.error.call(s.context || s, xhr, status, e);
  206.     }
  207.     // Fire the global callback
  208.     if (s.global) {
  209.       (s.context ? jQuery(s.context) : jQuery.event).trigger(“ajaxError”, [xhr, s, e]);
  210.     }
  211.   }
  212. });

标签