基于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 相关文章推荐
js onload处理html页面加载之后的事件
Oct 30 Javascript
js操作label给label赋值及取label的值示例
Nov 07 Javascript
使用jQuery实现的掷色子游戏动画效果
Mar 14 Javascript
jquery实现的图片点击滚动效果
Apr 29 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
Feb 15 Javascript
AngularJS+Bootstrap实现多文件上传与管理
Nov 08 Javascript
js中常用的Math方法总结
Jan 12 Javascript
jQuery基于正则表达式的表单验证功能示例
Jan 21 Javascript
JS Testing Properties 判断属性是否在对象里的方法
Oct 01 Javascript
详解ES6中的Map与Set集合
Mar 22 Javascript
vue.js watch经常失效的场景与解决方案
Jan 07 Vue.js
JavaScript实现班级抽签小程序
May 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
各种战术和打法的原创者
2020/03/04 星际争霸
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
php实现登录页面的简单实例
2019/09/29 PHP
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
跟老齐学Python之开始真正编程
2014/09/12 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python中防止sql注入的方法详解
2017/02/25 Python
Python实现文件信息进行合并实例代码
2018/01/17 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
Python求解正态分布置信区间教程
2019/11/20 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
行政管理专业推荐信
2013/11/02 职场文书
综艺节目策划方案
2014/06/13 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
解除施工合同协议书
2014/10/17 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
商场广播稿范文
2015/08/19 职场文书
python办公自动化之excel的操作
2021/05/23 Python