源码:

jQuery
        .extend({
            createUploadIframe : function(id, uri) {//id为当前系统时间字符串,uri是外部传入的json对象的一个参数
                //create frame
                var frameId = 'jUploadFrame' + id; //给iframe添加一个独一无二的id
                var iframeHtml = '<iframe id="'
                        + frameId
                        + '" name="'
                        + frameId
                        + '" style="position:absolute; top:-9999px; left:-9999px"'; //创建iframe元素
                if (window.ActiveXObject) {//判断浏览器是否支持ActiveX控件
                    if (typeof uri == 'boolean') {
                        iframeHtml += ' src="' + 'javascript:false' + '"';
                    } else if (typeof uri == 'string') {
                        iframeHtml += ' src="' + uri + '"';
                    }
                }
                iframeHtml += ' />';
                jQuery(iframeHtml).appendTo(document.body); //将动态iframe追加到body中
                return jQuery('#' + frameId).get(0); //返回iframe对象
            },
            createUploadForm : function(id, fileElementId, data) {//id为当前系统时间字符串,fileElementId为页面<input type='file' />的id,data的值需要根据传入json的键来决定
                //create form
                var formId = 'jUploadForm' + id; //给form添加一个独一无二的id
                var fileId = 'jUploadFile' + id; //给<input type='file' />添加一个独一无二的id
                var form = jQuery('<form  action="" method="POST" name="'
                        + formId + '" id="' + formId
                        + '" enctype="multipart/form-data" ></form>'); //创建form元素
                if (data) {//通常为false
                    for ( var i in data) {
                        jQuery(
                                '<input type="hidden" name="' + i + '" value="'
                                        + data[i] + '" />').appendTo(form); //根据data的内容,创建隐藏域,这部分我还不知道是什么时候用到。估计是传入json的时候,如果默认传一些参数的话要用到。
                    }
                }
                var oldElement = jQuery('#' + fileElementId); //得到页面中的<input type='file' />对象
                var newElement = jQuery(oldElement).clone(); //克隆页面中的<input type='file' />对象
                jQuery(oldElement).attr('id', fileId); //修改原对象的id
                jQuery(oldElement).before(newElement); //在原对象前插入克隆对象
                jQuery(oldElement).appendTo(form); //把原对象插入到动态form的结尾处
                //set attributes
                jQuery(form).css('position', 'absolute'); //给动态form添加样式,使其浮动起来,
                jQuery(form).css('top', '-1200px');
                jQuery(form).css('left', '-1200px');
                jQuery(form).appendTo('body'); //把动态form插入到body中
                return form;
            },
            handleError : function(s, xhr, status, e) {
                // If a local callback was specified, fire it
                if (s.error) {
                    s.error.call(s.context || s, xhr, status, e);
                }

                // Fire the global callback
                if (s.global) {
                    (s.context ? jQuery(s.context) : jQuery.event).trigger(
                            "ajaxError", [ xhr, s, e ]);
                }
            },
            ajaxFileUpload : function(s) {//这里s是个json对象,传入一些ajax的参数
                // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
                s = jQuery.extend({}, jQuery.ajaxSettings, s); //此时的s对象是由jQuery.ajaxSettings和原s对象扩展后的对象
                var id = new Date().getTime(); //取当前系统时间,目的是得到一个独一无二的数字
                var form = jQuery.createUploadForm(id, s.fileElementId,
                        (typeof (s.data) == 'undefined' ? false : s.data)); //创建动态form
                var io = jQuery.createUploadIframe(id, s.secureuri); //创建动态iframe
                var frameId = 'jUploadFrame' + id; //动态iframe的id
                var formId = 'jUploadForm' + id; //动态form的id
                // Watch for a new set of requests
                if (s.global && !jQuery.active++) {//当jQuery开始一个ajax请求时发生
                    jQuery.event.trigger("ajaxStart"); //触发ajaxStart方法
                }
                var requestDone = false; //请求完成标志
                // Create the request object
                var xml = {};
                if (s.global) {
                    jQuery.event.trigger("ajaxSend", [ xml, s ]); //触发ajaxSend方法
                }
                // Wait for a response to come back
                var uploadCallback = function(isTimeout) {//回调函数
                    var io = document.getElementById(frameId); //得到iframe对象
                    try {
                        if (io.contentWindow) {//动态iframe所在窗口对象是否存在
                            xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML
                                    : null;
                            xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument
                                    : io.contentWindow.document;
                        } else if (io.contentDocument) {//动态iframe的文档对象是否存在
                            xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML
                                    : null;
                            xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument
                                    : io.contentDocument.document;
                        }
                    } catch (e) {
                        jQuery.handleError(s, xml, null, e);
                    }
                    if (xml || isTimeout == "timeout") {//xml变量被赋值或者isTimeout == "timeout"都表示请求发出,并且有响应
                        requestDone = true; //请求完成
                        var status;
                        try {
                            status = isTimeout != "timeout" ? "success"
                                    : "error"; //如果不是“超时”,表示请求成功
                            // Make sure that the request was successful or notmodified
                            if (status != "error") { // process the data (runs the xml through httpData regardless of callback)
                                var data = jQuery.uploadHttpData(xml,
                                        s.dataType); //根据传送的type类型,返回json对象,此时返回的data就是后台操作后的返回结果
                                // If a local callback was specified, fire it and pass it the data
                                if (s.success)
                                    s.success(data, status); //执行上传成功的操作
                                // Fire the global callback
                                if (s.global)
                                    jQuery.event.trigger("ajaxSuccess", [ xml,
                                            s ]);
                            } else
                                jQuery.handleError(s, xml, status);
                        } catch (e) {
                            status = "error";
                            jQuery.handleError(s, xml, status, e);
                        } // The request was completed
                        if (s.global)
                            jQuery.event.trigger("ajaxComplete", [ xml, s ]); // Handle the global AJAX counter
                        if (s.global && !--jQuery.active)
                            jQuery.event.trigger("ajaxStop"); // Process result
                        if (s.complete)
                            s.complete(xml, status);
                        jQuery(io).unbind();//移除iframe的事件处理程序
                        setTimeout(function() {//设置超时时间
                            try {
                                jQuery(io).remove();//移除动态iframe
                                jQuery(form).remove();//移除动态form
                            } catch (e) {
                                jQuery.handleError(s, xml, null, e);
                            }
                        }, 100)
                        xml = null
                    }
                } // Timeout checker
                if (s.timeout > 0) {//超时检测
                    setTimeout(function() { // Check to see if the request is still happening
                        if (!requestDone)
                            uploadCallback("timeout");//如果请求仍未完成,就发送超时信号
                    }, s.timeout);
                }
                try {
                    var form = jQuery('#' + formId);
                    jQuery(form).attr('action', s.url);//传入的ajax页面导向url
                    jQuery(form).attr('method', 'POST');//设置提交表单方式
                    jQuery(form).attr('target', frameId);//返回的目标iframe,就是创建的动态iframe
                    if (form.encoding) {//选择编码方式
                        jQuery(form).attr('encoding', 'multipart/form-data');
                    } else {
                        jQuery(form).attr('enctype', 'multipart/form-data');
                    }
                    jQuery(form).submit();//提交form表单
                } catch (e) {
                    jQuery.handleError(s, xml, null, e);
                }
                jQuery('#' + frameId).load(uploadCallback); //ajax 请求从服务器加载数据,同时传入回调函数
                return {
                    abort : function() {

                    }
                };
            },
            uploadHttpData : function(r, type) {
                var data = !type;
                data = type == "xml" || data ? r.responseXML : r.responseText; // If the type is "script", eval it in global context
                if (type == "script")
                    jQuery.globalEval(data); // Get the JavaScript object, if JSON is used.
                if (type == "json")
                    eval("data = " + data); // evaluate scripts within html
                if (type == "html")
                    jQuery("<div>").html(data).evalScripts();
                return data;
            }

        })

ajaxFileUpload 文件上传的更多相关文章

  1. MVC+AjaxFileUpload文件上传

    来源:微信公众号CodeL 本次给大家分享的是ajaxfileupload文件上传插件,百度一大堆功能超炫的文件上传插件,为什么我们会选择这个插件呢? 原因是在此之前,我们尝试使用过很多基于flash ...

  2. jQuery插件AjaxFileUpload文件上传实现Javascript多文件上传功能

     Ajax file upload plugin是一个功能强大的文件上传jQuery插件,可自定义链接.或其它元素庖代传统的file表单上传结果,可实现Ajax动态提示文件上传 过程,同时支撑多文 ...

  3. spring mvc ajaxfileupload文件上传返回json下载问题

    问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/ad ...

  4. ajaxFileUpload文件上传

    一.简介 ajaxFileUpload是一种异步的文件上传控件,通过ajax进行文件上传,并获取上传处理结果.在很多时候我们需要使用到文件上传的功能,但是不需要使用那些强大的上传插件.此时就可以使用a ...

  5. AjaxFileUpload文件上传组件(php+jQuery+ajax)

    jQuery插件AjaxFileUpload可以实现ajax文件上传,下载地址:http://www.phpletter.com/contents/ajaxfileupload/ajaxfileupl ...

  6. JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用

    0 ajaxFileUpload简介 ajaxFileUpload插件是一个非常简单的基于Jquery的异步上传文件的插件,使用过程中发现很多与这个同名的,基于原始版本基础之上修改过的插件,文件版本比 ...

  7. ajaxFileupload多文件上传

    最近有个功能模块需要上传图片,为了和之前的伙伴们保持一致我也使用了ajaxFileupload, 但是源码只支持单文件上传,所以百般斟酌之下决定修改源码,废话不多说直接上代码 HTML上传代码段: & ...

  8. 使用ajaxfileupload.js实现文件上传

    ajaxFileUpload是一个异步上传文件的jQuery插件 语法:$.ajaxFileUpload([options]) options参数说明: 1.url  上传处理程序地址. 2,file ...

  9. 使用ajaxfileupload.js上传文件

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

随机推荐

  1. scrapy框架修改单个爬虫的配置,包括下载延时,下载超时设置

    在一个框架里面有多个爬虫时,每个爬虫的需求不相同,例如,延时的时间,所以可以在这里配置一下custom_settings = {},大括号里面写需要修改的配置,然后就能把settings里面的配置给覆 ...

  2. oracle mysql 比较

    转载:https://www.cnblogs.com/qq765065332/p/9293029.html 一.数据的存储结构 mysql: 1.对数据的管理可以有很多个用户,登录用户后可以看到该用户 ...

  3. 在vue.js 中使用animate.css库

    main.js文件引入后,在vue文件里直接添加class   animated bounceInUp

  4. String 和 StringBuilder

    官方解释 String  String 类代表字符串.字符串是常量:它们的值在创建之后不能更改. StringBuilder 一个可变的字符序列. 疑问 字符串是常量:它们的值在创建之后不能更改.那 ...

  5. MySQL 相关记录

    删除courseID_tr之前: 新建之后: show create trigger: 下面是mysql-5.7.21-win64解压目录下的my.ini文件中的内容 [client] default ...

  6. Android连接服务器端的Socket

    package com.example.esp8266; import java.io.IOException;import java.io.InputStream;import java.io.Ou ...

  7. [LeetCode&Python] Problem 53. Maximum Subarray

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  8. 20175120彭宇辰 《Java程序设计》第八周学习总结

    教材学习内容总结 第十五章 泛型与集合框架 一.泛型 泛型的主要目的是可以建立具有类型安全的集合框架,如链表.散列映射等数据结构. 1.泛型类声明 class People<E> Peop ...

  9. uniapp如何将微信小程序API封装为Promise

    var SYNC_API_RE = /requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$/; var CALL ...

  10. 通过sql查找指定字段存在哪些表中

    select * from INFORMATION_SCHEMA.columns where COLUMN_NAME Like '%order_type%';