基于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 相关文章推荐
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
Jun 29 Javascript
cookie中的path与domain属性详解
Dec 18 Javascript
js 获取浏览器版本以此来调整CSS的样式
Jun 03 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
Mar 13 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
Dec 03 Javascript
Underscore源码分析
Dec 30 Javascript
Bootstrap3学习笔记(二)之排版
May 20 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
Oct 09 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 Javascript
Vue下路由History模式打包后页面空白的解决方法
Jun 29 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 Javascript
微信小程序实现音频文件播放进度的实例代码
Mar 02 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新手上路(八)
2006/10/09 PHP
smarty中常用方法实例总结
2015/08/07 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
python监控键盘输入实例代码
2018/02/09 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
python实现双色球随机选号
2020/01/01 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
2020/09/21 Python
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
机电专业个人自荐信格式模板
2013/09/23 职场文书
幼儿园运动会加油词
2014/02/14 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
党员入党表决心的话
2014/03/11 职场文书
市场策划求职信
2014/08/07 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
使用golang编写一个并发工作队列
2021/05/08 Golang
python基于tkinter实现gif录屏功能
2021/05/19 Python
利用python实时刷新基金估值(摸鱼小工具)
2021/09/15 Python