基于jquery跨浏览器显示的file上传控件


Posted in Javascript onOctober 24, 2011

前面我写过一篇短小的文章,简要的介绍了下怎样定义input type="file" 的样式。对于一般的表单,上传控件较少,这样的做法确实不错,既减少了代码,又美化了样式,原文:《定义input type="file" 的样式》

其实要实现给file控件定义样式,大致思想都是一样的。

今天看到博客园的繁花连写两篇文章来研究file控件
《jquery.fileEveryWhere.js--一个跨浏览器的file显示插件》
《firefox下input type="file"的size是多大》

我这里也按捺不住了。成果是繁花的,以下内容引用自上面两篇文章:

大牛ppk都说过,在从多表单控件中,上传文件控件的样式是最难以控制的。见文章Styling an input type="file"。本插件也多是参考此文。

先来看看input type="file"在chrome,ie,firefox这三个浏览器下表情各异吧。

基于jquery跨浏览器显示的file上传控件
基于jquery跨浏览器显示的file上传控件
基于jquery跨浏览器显示的file上传控件

chrome像是button+label组合,看起差异最大。

ff和ie,是text+button的组合,就外形来看,firefox更标准,事实上firefox存在两个潜在问题:
1,firefox对type="file" 的input的width定义目前是不支持的(但是FF支持size属性,可以给size设置一个值,来控制上传框的大小,至于这个size到底是多大,见文章繁花-firefox下input type="file"的size是多大)。
2,火狐浏览器的提交file表单时只提交文件名不提交路径,而IE提交的是路径+文件名,chrome也能提交路径+文件名,但只显示文件名。火狐浏览器的提交file表单时只提交文件名不提交路径(很遗憾,暂时没有解决方法)

要让file在各个浏览器显示统一,纯样式已经控制不了,只能用js脚本了。基本步骤有3:
1,通过文本框和按钮去模拟一个input type=”file”。
2,把input="file"做成透明,用定位完全盖住文本框和按钮。
3,当input type=”file”的onchange的时,用js将文本框的值设置成input type=”file”的值。

了解步骤后,整个插件就很好写了,代码如下:

/* 
* file everywhere - 浏览器通用文件上传 
* copyright->flowerszhong 
* flowerszhong@gmail.com 
* http://www.cnblogs.com/flowerszhong/ 
*/ 
(function($) { 
$.fn.fileEveryWhere = function(options) { 
var defaults = { 
WrapWidth: 300, 
WrapHeight: 30, 
ButtonWidth: 60, 
ButtonHeight: 28, 
ButtonText: "浏览", 
TextHeight: 28, 
TextWidth: 240 
}; 
var options = $.extend(defaults, options); 
var browser_ver = $.browser.version.substr(0, 1); 
var displayMode = ($.browser.msie && browser_ver <= "7") ? "inline" : "inline-block"; 
return this.each(function() { 
//创建包含,设置为相对定位 
var wrapper = $("<div class='fileWraper'>") 
.css({ 
"width": options.WrapWidth + "px", 
"height": options.WrapHeight + "px", 
"display": displayMode, 
"zoom": "1", 
"position": "relative", 
"overflow": "hidden", 
"z-index":"1" 
}); 
//创建文本输入框,用于存放上传文件名称 
var text = $('<input class="filename" type="text" />') 
.css({ 
"width": options.TextWidth + "px", 
"heigth": options.TextHeight + "px" 
}); 
//创建浏览按钮 
var button = $('<input class="btnfile" type="button" />') 
.val(options.ButtonText); 
$(this).wrap(wrapper).parent().append(text, button); 
$(this).css({ 
"position": "absolute", 
"top": "0", 
"left": "0", 
"z-index": "2", 
"height": options.WrapHeight + "px", 
"width": options.WrapWidth + "px", 
"cursor": "pointer", 
"opacity": "0.0", 
"outline":"0", 
"filter": "alpha(opacity:0)" 
}); 
if ($.browser.mozilla) { $(this).attr("size", 1 + (options.WrapWidth - 85) / 6.5) } 
$(this).bind("change", function() { 
text.val($(this).val()); 
}); 
}); 
}; 
})(jQuery);

使用很简单:

$("input:file").fileEveryWhere({参数});

firefox对type="file" 的input的width定义目前是不支持的,但是FF支持size属性,可以给size设置一个值,来控制上传框的大小。
但是这个size值怎么设置,size="10"是多宽,默认值又是多少,不能光凭感觉去设置。 用脚本来查看下:

<script type="text/javascript"> 
$(function() { 
var fileArray = []; 
var i = 0; 
while (i < 100) { 
fileArray.push(i + ":<input type='file' size='" + i + "' /><br />"); 
i++; 
} 
document.write(fileArray.join("")); 
$("input:file").each(function() { $(this).after("<b>" + $(this).width() + "</b>") }); 
}); 
</script>

在火狐下得到这样的结果:
基于jquery跨浏览器显示的file上传控件

发现了一定的规律,默认为208像素,size="1"时为85像素,每个size之间相差6.5个像素的宽度,所以我们可以动态的设定size的值,如:

if ($.browser.mozilla) { $(this).attr("size", 1 + (options.WrapWidth - 85) / 6.5)
Javascript 相关文章推荐
遍历jquery对象的代码分享
Nov 02 Javascript
JavaScript实现打字效果的方法
Jul 10 Javascript
浅谈Javascript数组索引
Jul 29 Javascript
JS+CSS实现简易实用的滑动门菜单效果
Sep 18 Javascript
图解JavaScript中的this关键字
May 28 Javascript
jQuery简单实现列表隐藏和显示效果示例
Sep 12 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
Nov 29 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
Oct 08 Javascript
element-ui 时间选择器限制范围的实现(随动)
Jan 09 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
firefox下input type=&quot;file&quot;的size是多大
Oct 24 #Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
Oct 24 #Javascript
editable.js 基于jquery的表格的编辑插件
Oct 24 #Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
Oct 24 #Javascript
css值转换成数值请抛弃parseInt
Oct 24 #Javascript
更优雅的事件触发兼容
Oct 24 #Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 #Javascript
You might like
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
用文本文件制作留言板提示(下)
2006/10/09 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
php之Memcache学习笔记
2013/06/17 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
微信小程序实现日期格式化和倒计时
2020/11/01 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
Python使用urllib模块的urlopen超时问题解决方法
2014/11/08 Python
Python实现的彩票机选器实例
2015/06/17 Python
Linux下多个Python版本安装教程
2018/08/15 Python
python版DDOS攻击脚本
2019/06/12 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
大一军训感言
2014/01/09 职场文书
新年寄语大全
2014/04/12 职场文书
安全生产月演讲稿
2014/05/09 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
公司员工离职感言
2015/08/03 职场文书
Mysql忘记密码解决方法
2022/02/12 MySQL