记得刚离开大学,进入目前这家公司不到一个月时,有一位前辈给我们当时的新人讲了下JS无刷新上传的相关知识。

在此之前,一直都是在使用C#提供的服务器上传控件FileUpload,但是每次使用时,都会刷新一次页面,给人的感觉不是太好。但是那是,并不是太在意这个细节,而且JS知识非常匮乏,所以并没有去找解决的办法。

当时,这位前辈提到的一种方法是:

准备一个主页面(用户界面)和一个上传页(放在主页面隐藏的iframe中,作为真正意义的上传页),当点击主页面的上传按钮时,实际上是调用了上传页的上传控件,从而来实现上传。而这个套操作并不是没有刷新,只是刷新是在上传页完成的,用户感觉不到罢了。

这个原理其实就是,一个iframe+一个form+一个上传控件,上传实际上是在提交iframe下的form,上面这个方法,需要用到的iframe、form和上传控件都是事先写好,存在一个实际的页面中。

通过之前在网上所了解的,我们可以利用JS或jQuery动态的创建iframe、form和上传控件。

步骤如下:

1、创建一个iframe,添加到文档中

 var iframe = $("<iframe src='javascript:false;' id='" + id + "' name='" + id + "' border='none' width='0' height='0'></iframe>").appendTo(document.body)[0];
2 $(iframe).attr("onload", "IframeLoad('" + id + "', '" + this._imgpanel + "')");

2、创建一个form,添加到文档中,并将其target属性指向上面创建的iframe

 var form = $("<form id='" + id + "' name='" + id + "' action='" + this._url + "' method='POST' enctype='multipart/form-data'></form>").appendTo(document.body)[0];
form.target = iframe.name;

3、创建一个上传控件,添加到上面这个form中

         this._control = $("<input type='file' id='" + id + "' name='" + id + "' style=' filter: alpha(opacity=100);' />");
this._control.appendTo(form);
this._control.attr("onchange", "fileChangeHandler(this,'" + form.id + "','" + id + "')");

4、实现这个上传控件的onchange事件,已完成上传

 var fileChangeHandler = function (obj, formid, fupid) {
///<summary>选择完文件后,自动上传</summary>
$("#" + formid).submit();
};

5、提交后需要后台接收并完成上传。由于本人主要是C#开发,这里就给个C#的上传代码(擅长其他编程语言的,可以用自己方式)。首先建一个一般处理程序handler.ashx,然后获取提交的文件,最后实现上传并返回重要信息。

      Request = context.Request;
//获取上传到服务器的文件集合
HttpFileCollection files = Request.Files;//要配置httpRuntime节点的maxRequestLength属性为较大值,否则过大的文件无法上传而引发异常
string newfilepath = "";
if (files.Count > 0)
{
string path = Server.MapPath("upfiles/");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
HttpPostedFile file = files[0];
string newfilename = DateTime.Now.ToString("yyyyMMddHHmmdd") + Path.GetExtension(file.FileName);
file.SaveAs(path + newfilename);
newfilepath = "upfiles/" + newfilename;
}

Response.Write(newfilepath);
Response.End();

6、前台接收返回消息的方法如下

 var msg = $("#" + iframeid)[0].contentDocument.body.innerHTML;

注:iframeid为创建的iframe的id。后台返回的消息会显示到这个iframe的body里面,这里就只需要抓取到这个值就行了。

具体实现我放在一个Demo里面,有兴趣的园友可以下载下来阅示,如有不足之处,还望能批评斧正。

感谢!

http://files.cnblogs.com/files/jijiexuanfeng/JsNoRefresh.rar

jQuery无刷新上传学习心得的更多相关文章

  1. ASP.NET MVC使用jQuery无刷新上传

    昨晚网友有下载了一个jQuery无刷新上传的小功能,他尝试搬至ASP.NET MVC应用程序中去,在上传死活无效果.Insus.NET使用Teamviewer远程桌面,操作一下,果真是有问题.网友是说 ...

  2. jQuery无刷新上传之uploadify简单试用

    先简单的侃两句:貌似已经有两个月的时间没有写过文章了,不过仍会像以前那样每天至少有一至两个小时是泡在园子里看各位大神的文章.前些天在研究“ajax无刷新上传”方面的一些插件,用SWFUpload实现了 ...

  3. jquery 无刷新上传的小function

    function zll_up(click_id,up_url,text_id,show_id){ this.create = function(){} //当点击指定元素时,创建iframe for ...

  4. jQuery无刷新上传之uploadify

    引自 文章 http://www.cnblogs.com/babycool/archive/2012/08/04/2623137.html 将文章里的代码整合在了一个解决方案里,直接可以下载测试,上代 ...

  5. C#_Jquery无刷新上传

    昨晚网友有下载了一个jQuery无刷新上传的小功能,他尝试搬至ASP.NET MVC应用程序中去,在上传死活无效果.Insus.NET使用Teamviewer远程桌面,操作一下,果真是有问题.网友是说 ...

  6. jQuery AJAX 网页无刷新上传示例

    新年礼,提供简单.易套用的 jQuery AJAX 上传示例及代码下载.后台对文件的上传及检查,以 C#/.NET Handler 处理 (可视需要改写成 Java 或 PHP). 有时做一个网站项目 ...

  7. [Asp.net mvc]jquery.form.js无刷新上传

    写在前面 最近在自己的网盘项目中想用ajax.beginform的方式做无刷新的操作,提交表单什么的都可以,但针对文件上传,就是个鸡肋.在网上查找了发现很多人都遇到了这个问题,大部分都推荐使用jque ...

  8. jQuery+AJAX实现网页无刷新上传

    新年礼,提供简单.易套用的 jQuery AJAX上传示例及代码下载.后台对文件的上传及检查,以 C#/.NET Handler 处理 (可视需要改写成 Java 或 PHP). 有时做一个网站项目 ...

  9. jquery ajax php 无刷新上传文件 带 遮罩 进度条 效果的哟

    在很多项目中都会叫用户上传东西这些的,自从接触了jquery 和ajax之后就不管做什么,首先都会想到这个,我这个人呢?是比较重视客户体验的,这次我这边负责的是后台板块,然后就有一块是要求用户上传照片 ...

随机推荐

  1. HDU-2711 Lost Cows

    Lost Cows Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. SQL SERVER 的 INFORMATION_SCHEMA 的使用

    ------------------------------------------------------- 第一个查询看看库里有多少个表,表名等 select * from INFORMATION ...

  3. ubuntu-15.04 下编译 ijkplayer 安卓版

    我的环境: 1.win7 主系统 2.VirtualBox 5.1.2 虚拟机 3.ubuntu-15.04-desktop-amd64.iso 镜像文件 4.android-ndk-r10e-lin ...

  4. mv、umask、chattr、lsattr命令

    mv命令行,即move 将文件移动到目录下 对文件或目录重命名 umask chattr 设置文件或目录的隐藏属性 lsattr显示文件或目录的隐藏属性 ls mv 1.txt aa ls cd aa ...

  5. 学习动态性能表 v$sql

    学习动态性能表 第三篇-(1)-v$sql V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cursor(子游标)存 ...

  6. 第一次JAVA基础考试后的反思

    今天进行了第一次JAVA基础考试,考查了课本上前面三章和方法的知识,基本没有涉及到数组.通过这次的考试,暴露了自己在学习中的很多问题. 机试题是编写一个学员状态转换器,主要运用的是选择语句和方法,而没 ...

  7. 推荐一个很好的富文本web编辑器UEditor

    前天产品提了一个编辑器的bug,本人找是找到了问题的症结,就是不好改.框架是压缩兼混淆后的代码.查一下,好多年前的框架... 咨询了一个同事有关旧框架的事情,他也建议我升级编辑器并帮忙帮我找了UEdi ...

  8. Qt编写串口通信程序全程图文解说

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...

  9. linux route命令学习

    route命令用于显示和操作IP路由表. 没有增加路由之前,route命令的结果如下, sh-# route Kernel IP routing table Destination     Gatew ...

  10. There is an error while getting planid. No Free partitions available

    问题概述 Oracle Advanced Supply Chain Planning最初的设置职责的时候有点问题,不知是不是要打什么补丁或其它配置什么东东,, 这个提示,,但我查到的分区是还有可用分区 ...