<!--
Author: aqua qin
Tech blog:http://blog.csdn.net/aquadp/
Create Date: 2008-4-8 22:00:00
Last Modify Date: 2008-4-9 22:46:35
-->
<HTML>
<HEAD>
<script>
/**//*
需要注意的几个地方:
.由于input type=file控件不能对type属性赋值(in IE),所以采用插入HTML代码的方式(insertAdjacentHTML);
.input type=file控件的value是只读的,不能被赋值;
.因为用一个input type=file控件有缺陷,就是当用户删除了最后一次添加的文件再添加同样的文件则无法触发onchange事件;
并且要上传文件,只用一个上传控件是不够的;
.客户端无法获取文件大小,除非用FSO或ActiveX等。除了img控件,其fileSize可以在图片文件加载完成后获取其文件大小;
.还有另外一种变通的方法就是用flash与js交互达到获取客户端文件大小的效果(现在flash在安全方面也做了限制);
*/
var i = 0; // 用来动态生成span,upfile的id
function addAttachmentToList()
{
if (findAttachment(event.srcElement.value)) return; //如果此文档已在附件列表中则不再添加
// 动态创建附件信息栏并添加到附件列表中
var span = document.createElement('span');
span.id = '_attachment' + i;
span.innerHTML = extractFileName(event.srcElement.value) + ' <a href="javascript:delAttachment(' + (i++) + ')"><font color="blue">删除</font></a><br/>';
span.title = event.srcElement.value;
G('attachmentList').appendChild(span);
// 显示附件列表并变换添加附件按钮文本
if (G('attachmentList').style.display == 'none')
{
G('btnAdd').value = '继续添加';
G('attachmentList').style.display = '';
G('btnClear').style.display = '';
}
G('total').innerText = '当前选择上传'+ G('attachmentList').childNodes.length + '个附件';
}
function selectAttachment()
{
// 先清除无效动态生成的多余upfile
cleanInvalidUpfile();
// 动态创建上传控件并与span对应
var upfile = '<input type="file" style="display:none" onchange="addAttachmentToList();" id="_upfile'+i+'">';
document.body.insertAdjacentHTML('beforeEnd', upfile);
G('_upfile'+i).click();
}
function extractFileName(fn)
{
return fn.substr(fn.lastIndexOf('\\')+1);
}
function findAttachment(fn)
{
var o = G('attachmentList').getElementsByTagName('span');
for(var i=0;i<o.length;i++)
if (o[i].title == fn) return true;
return false;
}
function delAttachment(id)
{
G('attachmentList').removeChild(G('_attachment'+id));
document.body.removeChild(G('_upfile'+id));
// 当附件列表为空则不显示并且变化添加附件按钮文本
if (G('attachmentList').childNodes.length == 0)
{
G('btnAdd').value = '添加附件';
G('attachmentList').style.display = 'none';
G('btnClear').style.display = 'none';
}
G('total').innerText = '当前选择上传'+ G('attachmentList').childNodes.length + '个附件';
}
function cleanInvalidUpfile()
{
var o = document.body.getElementsByTagName('input');
for(var i=o.length-1;i>=0;i--)
if (o[i].type == 'file' && o[i].id.indexOf('_upfile') == 0)
{
if (!G('_attachment'+o[i].id.substr(7)))
document.body.removeChild(o[i]);
}
}
function clearAttachment()
{
var o = G('attachmentList').childNodes;
for(var i=o.length-1;i>=0;i--)
G('attachmentList').removeChild(o[i]);
o = document.body.getElementsByTagName('input');
for(var i=o.length-1;i>=0;i--)
if (o[i].type == 'file' && o[i].id.indexOf('_upfile') == 0)
{
document.body.removeChild(o[i]);
}
G('btnAdd').value = '添加附件';
G('attachmentList').style.display = 'none';
G('btnClear').style.display = 'none';
G('total').innerText = '当前选择上传0个附件';
}
function getAttachmentInfo()
{
// 已知的js获取本地文件大小的三种方式
// 1.通过FSO 2.通过ActiveX 3.通过Flash(设置可能更麻烦)与js交互
// 注:QQ邮箱中获取本地文件大小就是采用第二种方式
}
function G(id)
{
return document.getElementById(id);
}
</script>
</HEAD>
<BODY>
<fieldset style="border : 1px solid #84A24A;text-align:left;COLOR:#84A24A;FONT-SIZE:
12px;font-family: Verdana;padding:5px;">
<legend>模仿QQ邮箱添加附件</legend>
<input style="background:transparent;border:1px solid #84A24A;color:#84A24A" type="button" value="添加附件" id="btnAdd" onclick="selectAttachment();"> <input type="button" value="清空附件" style="background:transparent;border:1px solid #84A24A;color:#84A24A" id="btnClear" style="display:none" onclick="clearAttachment();">
<div id="attachmentList" style="margin:3px 0px 0px 0px;padding:4px 3px 4px 3px;background-color:#DEEBC6;display:none;border:1px solid #84A24A;">
</div>
<div id="total" style="margin:3px 0px 0px 0px;">当前选择上传0个附件</div>
</fieldset>
</BODY>
</HTML>
分享到:
相关推荐
本项目“仿QQ邮箱大文件上传组件”正是针对这一需求而设计,其核心是利用了开源库SwfUpload。SwfUpload是一款优秀的Flash-based文件上传组件,它允许在不刷新页面的情况下实现多文件异步上传,并且能够展示详细的...
这种方案不仅能够实时展示文件上传进度,还能够模拟出类似QQ邮箱等知名平台的大文件上传窗体功能,极大地提升了用户体验。 #### 二、关键技术点分析 **1. SSH框架简介** - **Struts**:用于构建MVC架构的Web应用...
而在多选模式下,用户可以选取多张图片,适用于分享或上传照片的功能。这样的设计考虑到了不同应用场景下的用户需求。 其次,预览功能是该库的另一个亮点。用户在选择图片时,可以预览所选图片,确保所选符合预期。...
总的来说,基于SwfUpload的上传实例结合进度条和仿QQ邮箱附件效果,是一个优秀的文件上传解决方案,尤其适合需要大量文件交互的Web应用。通过合理地利用其提供的API和事件机制,开发者可以创建出高效、友好的文件...
《深入解析:仿QQ邮箱安卓客户端项目的Android应用源码》 在移动开发领域,Android操作系统以其开源、灵活的特性,吸引了无数开发者投身其中。而针对Android应用源码的学习与研究,是提升技能、理解系统运行机制的...
尽管“基于PHP的留言墙仿QQ爱墙源码.zip”没有明确提到文件上传,但某些留言墙可能会包含这一功能,允许用户上传图片或文件作为留言的附件。PHP提供了文件上传的相关函数,如`$_FILES`全局变量和`move_uploaded_file...
本文实例为大家分享了js实现QQ邮箱邮件拖拽删除的具体代码,供大家参考,具体内容如下 步骤分析: 根据数据结构生成HTML结构 全选和单选功能的实现,以及当其为选中状态时它的父级的颜色变化的 点击删除,删除...
用Proteus仿真Lpc2131 控制8个LED 从右向左 ,从左向右 ,从两边到中间 ,从中间到两边 闪烁。 编译环境 ADS1.2 版本4.2.5.764 Proteus7.4 SP3 ...QQ的验证信息在附件中。诚切期待着您的参与,共同进步!谢谢!
最后,"upload"目录通常包含网站上传文件,如用户上传的照片、附件等,这部分在实际运行网站时会非常重要,因为它涉及到用户交互和内容分享。 总的来说,这个资源包提供了一套完整的建站解决方案,适用于那些希望...
说明 这个只是模版 1.只适合用于winwebmail3.8.1.3和3.8.1.5。如果您还需要更旧版本的可以上网站留言...如:通过强化上传组件实现了G级附件的上传,及引用。可先发后传等。 9. 自动锁屏,永不掉线,新邮件到达提醒等。
7. **uploads**:通常用于存储用户上传的文件,如图片、附件等。 8. **images**:存放网站的图像资源,如背景图、按钮、logo等。 9. **templets**:模板文件夹,包含了网站的HTML、CSS、JavaScript等模板文件,是...
图片上传水印功能(需组件支持)、Logo上传、后台附件上传、上传文件管理、无用上传文件清除 4.文章采集、广告管理、自定义标签管理、留言本、友情链接、图片文章、正文分页、批量删除、二级栏目、栏目关键字、投票...
3.图片上传水印功能(需组件支持)、Logo上传、后台附件上传、上传文件管理、无用上传文件清除 4.文章采集、广告管理、自定义标签管理、留言本、友情链接、图片文章、正文分页、批量删除、二级栏目、栏目关键字、投票...
3.图片上传水印功能(需组件支持)、Logo上传、后台附件上传、上传文件管理、无用上传文件清除。 4.文章采集、广告管理、自定义标签管理、图片文章、正文分页、批量删除、二级栏目、栏目关键字。 5.动态、仿静态、...
MATLAB中科院培训课件很好的课件资源-第15章 遗传算法...联系人:期涛 15210196261 qq:1194228740 课件比较大,没办法上传 谁要课件和我联系 或者留下邮箱,我发过去! 附件里面是三章的课件,请大家下载看一下!
MATLAB中科院培训课件很好的课件资源-第四期MATLAB...联系人:期涛 15210196261 qq:1194228740 课件比较大,没办法上传 谁要课件和我联系 或者留下邮箱,我发过去! 附件里面是三章的课件,请大家下载看一下!
MATLAB中科院培训课件很好的课件资源-第14章 优化问题...联系人:期涛 15210196261 qq:1194228740 课件比较大,没办法上传 谁要课件和我联系 或者留下邮箱,我发过去! 附件里面是三章的课件,请大家下载看一下!
这里,我们主要关注"android 邮箱源码"这一主题,它包含两个项目,一个是对QQ邮箱的高仿实现,能够运行并提供收发邮件及附件处理的功能。 1. **网络通信**: - **SMTP/POP3/IMAP协议**:邮件收发主要依赖SMTP...