英文注解应该是原作者写的吧~说实话,有些if判断里的东西我也没太弄明白,但是大致思路还是OK的。

  1. jQuery.extend({
  2. createUploadIframe: function (id, uri) {//id为当前系统时间字符串,uri是外部传入的json对象的一个参数
  3. //create frame
  4. var frameId = 'jUploadFrame' + id; //给iframe添加一个独一无二的id
  5. var iframeHtml = '<iframe id="' + frameId + '" name="' + frameId + '" style="position:absolute; top:-9999px; left:-9999px"'; //创建iframe元素
  6. if (window.ActiveXObject) {//判断浏览器是否支持ActiveX控件
  7. if (typeof uri == 'boolean') {
  8. iframeHtml += ' src="' + 'javascript:false' + '"';
  9. }            else if (typeof uri == 'string') {
  10. iframeHtml += ' src="' + uri + '"';
  11. }
  12. }
  13. iframeHtml += ' />';
  14. jQuery(iframeHtml).appendTo(document.body); //将动态iframe追加到body中
  15. return jQuery('#' + frameId).get(0); //返回iframe对象
  16. },
  17. createUploadForm: function (id, fileElementId, data) {//id为当前系统时间字符串,fileElementId为页面<input type='file' />的id,data的值需要根据传入json的键来决定
  18. //create form
  19. var formId = 'jUploadForm' + id; //给form添加一个独一无二的id
  20. var fileId = 'jUploadFile' + id; //给<input type='file' />添加一个独一无二的id
  21. var form = jQuery('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data" ></form>'); //创建form元素
  22. if (data) {//通常为false
  23. for (var i in data) {
  24. jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form); //根据data的内容,创建隐藏域,这部分我还不知道是什么时候用到。估计是传入json的时候,如果默认传一些参数的话要用到。
  25. }
  26. }        var oldElement = jQuery('#' + fileElementId); //得到页面中的<input type='file' />对象
  27. var newElement = jQuery(oldElement).clone(); //克隆页面中的<input type='file' />对象
  28. jQuery(oldElement).attr('id', fileId); //修改原对象的id
  29. jQuery(oldElement).before(newElement); //在原对象前插入克隆对象
  30. jQuery(oldElement).appendTo(form); //把原对象插入到动态form的结尾处
  31. //set attributes
  32. jQuery(form).css('position', 'absolute'); //给动态form添加样式,使其浮动起来,
  33. jQuery(form).css('top', '-1200px');
  34. jQuery(form).css('left', '-1200px');
  35. jQuery(form).appendTo('body'); //把动态form插入到body中
  36. return form;
  37. },
  38. ajaxFileUpload: function (s) {//这里s是个json对象,传入一些ajax的参数
  39. // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
  40. s = jQuery.extend({}, jQuery.ajaxSettings, s); //此时的s对象是由jQuery.ajaxSettings和原s对象扩展后的对象
  41. var id = new Date().getTime(); //取当前系统时间,目的是得到一个独一无二的数字
  42. var form = jQuery.createUploadForm(id, s.fileElementId, (typeof (s.data) == 'undefined' ? false : s.data)); //创建动态form
  43. var io = jQuery.createUploadIframe(id, s.secureuri); //创建动态iframe
  44. var frameId = 'jUploadFrame' + id; //动态iframe的id
  45. var formId = 'jUploadForm' + id; //动态form的id
  46. // Watch for a new set of requests
  47. if (s.global && !jQuery.active++) {//当jQuery开始一个ajax请求时发生
  48. jQuery.event.trigger("ajaxStart"); //触发ajaxStart方法
  49. }        var requestDone = false; //请求完成标志
  50. // Create the request object
  51. var xml = {};        if (s.global)
  52. jQuery.event.trigger("ajaxSend", [xml, s]); //触发ajaxSend方法
  53. // Wait for a response to come back
  54. var uploadCallback = function (isTimeout) {//回调函数
  55. var io = document.getElementById(frameId); //得到iframe对象
  56. try {                if (io.contentWindow) {//动态iframe所在窗口对象是否存在
  57. xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
  58. xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;
  59. } else if (io.contentDocument) {//动态iframe的文档对象是否存在
  60. xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
  61. xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
  62. }
  63. } catch (e) {
  64. jQuery.handleError(s, xml, null, e);
  65. }            if (xml || isTimeout == "timeout") {//xml变量被赋值或者isTimeout == "timeout"都表示请求发出,并且有响应
  66. requestDone = true; //请求完成
  67. var status;                try {
  68. status = isTimeout != "timeout" ? "success" : "error"; //如果不是“超时”,表示请求成功
  69. // Make sure that the request was successful or notmodified
  70. if (status != "error") {                        // process the data (runs the xml through httpData regardless of callback)
  71. var data = jQuery.uploadHttpData(xml, s.dataType); //根据传送的type类型,返回json对象,此时返回的data就是后台操作后的返回结果
  72. // If a local callback was specified, fire it and pass it the data
  73. if (s.success)
  74. s.success(data, status); //执行上传成功的操作
  75. // Fire the global callback
  76. if (s.global)
  77. jQuery.event.trigger("ajaxSuccess", [xml, s]);
  78. } else
  79. jQuery.handleError(s, xml, status);
  80. } catch (e) {
  81. status = "error";
  82. jQuery.handleError(s, xml, status, e);
  83. }                // The request was completed
  84. if (s.global)
  85. jQuery.event.trigger("ajaxComplete", [xml, s]);                // Handle the global AJAX counter
  86. if (s.global && ! --jQuery.active)
  87. jQuery.event.trigger("ajaxStop");                // Process result
  88. if (s.complete)
  89. s.complete(xml, status);
  90. jQuery(io).unbind();//移除iframe的事件处理程序
  91. setTimeout(function () {//设置超时时间
  92. try {
  93. jQuery(io).remove();//移除动态iframe
  94. jQuery(form).remove();//移除动态form
  95. } catch (e) {
  96. jQuery.handleError(s, xml, null, e);
  97. }
  98. }, 100)
  99. xml = null
  100. }
  101. }        // Timeout checker
  102. if (s.timeout > 0) {//超时检测
  103. setTimeout(function () {                // Check to see if the request is still happening
  104. if (!requestDone) uploadCallback("timeout");//如果请求仍未完成,就发送超时信号
  105. }, s.timeout);
  106. }        try {            var form = jQuery('#' + formId);
  107. jQuery(form).attr('action', s.url);//传入的ajax页面导向url
  108. jQuery(form).attr('method', 'POST');//设置提交表单方式
  109. jQuery(form).attr('target', frameId);//返回的目标iframe,就是创建的动态iframe
  110. if (form.encoding) {//选择编码方式
  111. jQuery(form).attr('encoding', 'multipart/form-data');
  112. }            else {
  113. jQuery(form).attr('enctype', 'multipart/form-data');
  114. }
  115. jQuery(form).submit();//提交form表单
  116. } catch (e) {
  117. jQuery.handleError(s, xml, null, e);
  118. }
  119. jQuery('#' + frameId).load(uploadCallback); //ajax 请求从服务器加载数据,同时传入回调函数
  120. return { abort: function () { } };
  121. },
  122. uploadHttpData: function (r, type) {        var data = !type;
  123. data = type == "xml" || data ? r.responseXML : r.responseText;        // If the type is "script", eval it in global context
  124. if (type == "script")
  125. jQuery.globalEval(data);        // Get the JavaScript object, if JSON is used.
  126. if (type == "json")
  127. eval("data = " + data);        // evaluate scripts within html
  128. if (type == "html")
  129. jQuery("<div>").html(data).evalScripts();        return data;
  130. }
  131. })

ajaxfileupload.js插件大致的思路就是如上所述,但是对于ajax来说,传值也是相当关键的部分,也就是传入的json对象里的键值对。调用方法如下:

  1. $.ajaxFileUpload
  2. (
  3. {
  4. url: '../../XXXX/XXXX.aspx', //用于文件上传的服务器端请求地址
  5. secureuri: false,           //一般设置为false
  6. fileElementId: $("input#xxx").attr("id"), //文件上传控件的id属性  <input type="file" id="file" name="file" /> 注意,这里一定要有name值
  7. //$("form").serialize(),表单序列化。指把所有元素的ID,NAME 等全部发过去
  8. dataType: 'json',//返回值类型 一般设置为json
  9. complete: function () {//只要完成即执行,最后执行
  10. },
  11. success: function (data, status)  //服务器成功响应处理函数
  12. {            if (typeof (data.error) != 'undefined') {                if (data.error != '') {                    if (data.error == "1001") {//这个error(错误码)是由自己定义的,根据后台返回的json对象的键值而判断
  13. }                    else if (data.error == "1002") {
  14. }
  15. alert(data.msg);//同error
  16. return;
  17. } else {
  18. alert(data.msg);
  19. }
  20. }            /*                *    这里就是做一些其他操作,比如把图片显示到某控件中去之类的。                */
  21. },
  22. error: function (data, status, e)//服务器响应失败处理函数
  23. {
  24. alert(e);
  25. }
  26. }
  27. )

整个就是使用ajaxfileupload.js插件的大致方法。当然,明白其工作原理越透彻,我们也就能越好的去操作和使用它。

以上的分析希望对刚接触ajaxfileupload.js插件的朋友们有帮助。

文件下载地址:http://files.cnblogs.com/zhouhongyu1989/ajaxfileupload.js

<input type="file" id="file" name="file" /> 注意,这里一定要有name值 感谢指点迷津

jquery插件--ajaxfileupload.js上传文件原理分析的更多相关文章

  1. 【转】JQuery插件ajaxFileUpload 异步上传文件(PHP版)

    前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现a ...

  2. JQuery插件ajaxFileUpload 异步上传文件(PHP版)

    太久没写博客了,真的是太忙了.善于总结,进步才会更快啊.不多说,直接进入主题. 前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错 ...

  3. JQuery插件ajaxFileUpload 异步上传文件

    一.先对ajaxFileUpload插件的语法参数进行讲解 原理:ajaxfileupload是通过监听iframe的onload方法来实现, 当从服务端处理完成后,就触发iframe的onload事 ...

  4. 使用ajaxfileupload.js上传文件

    一直以来上传文件都是使用form表单上传文件,也看到过有人使用js上传文件,不过看起来蛮简单的也就没有怎么去理会.今天突然要使用这种方式上传文件,期间还遇到点问题.因此就记录下来,方便以后遇到这样的问 ...

  5. ajaxfileupload.js上传文件兼容IE7及以上版本

    要兼容IE789,要修改ajaxfileupload.js;要将此处的代码替换掉 if(window.ActiveXObject) { var io = document.createElement( ...

  6. js上传文件带参数,并且,返回给前台文件路径,解析上传的xml文件,存储到数据库中

    ajaxfileupload.js jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId ...

  7. js 上传文件后缀名的判断 var flag=false;应用

    js 上传文件后缀名的判断  var flag=false;应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  8. atitit.javascript js 上传文件的本地预览

    atitit.javascript js 上传文件的本地预览 1. .URL.createObjectURL  1 1.1. 吊销所有使用 URL.createObjectURL 而创建的 URL,以 ...

  9. HTTP的上传文件实例分析

    这个是http文件传输的一种格式,当时不知道这种格式,废弃. HTTP的上传文件实例分析 由于论坛不支持Word写文章发帖. 首先就是附件发送怎么搞,这个必须解决.论坛是php的.我用Chrome类浏 ...

随机推荐

  1. Navicat Premium 12全系列

    Navicat 是香港卓软数码科技有限公司生产的一系列 MySQL.MariaDB.Oracle.SQLite.PostgreSQL 及 Microsoft SQL Server 的图形化数据库管理及 ...

  2. 宿主机为linux、windows分别实现VMware三种方式上网(转)

    一.VMware三种方式工作原理1 Host-only连接方式  让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于 ...

  3. IOS之UITabBarController

    在学习IOS开发过程中,针对于UITabBarController的使用也不少出现,UITabBarController和UINavigationController类似,UITabBarContro ...

  4. Windows 8提升普通管理员权限为超级管理员权限以及激活超级管理员Administrator

    在Windows 8下运行某些操作时(比如删除一些文件或者更改某些系统设置时)系统会提示我们权限不够.须要Administrator账户的权限. 相信很多其它的使用者都会觉得自己当前使用的账户已经是系 ...

  5. curl_errno错误码说明

    http://hi.baidu.com/lifang218c/item/fa80496eb4cf262f68105b50 http://blog.csdn.net/cwj649956781/artic ...

  6. QoS的构建模块与机制

    本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...

  7. Android 的事件传递机制,详解

    Android 的事件传递机制,详解 前两天和一个朋友聊天的时候.然后说到事件传递机制.然后让我说的时候,忽然发现说的不是非常清楚,事实上Android 的事件传递机制也是知道一些,可是感觉自己知道的 ...

  8. 算法笔记_195:历届试题 错误票据(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为 ...

  9. AutoResponder Reference

    Fiddler's AutoResponder tab allows you to return files from your local disk instead of transmitting ...

  10. vue 数组 新增元素 响应式原理 7种方法

    1.问题 思考一个问题,以下代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...