基于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 相关文章推荐
兼容IE和FF的图片上传前预览js代码
May 28 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
Sep 04 Javascript
我的Node.js学习之路(一)
Jul 06 Javascript
jquery操作HTML5 的data-*的用法实例分享
Aug 17 Javascript
vue双向数据绑定原理探究(附demo)
Jan 17 Javascript
JavaScript中的高级函数
Jan 04 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
May 08 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
JS实现简单省市二级联动
Nov 27 Javascript
浅谈js数组splice删除某个元素爬坑
Oct 14 Javascript
基于JavaScript实现简单抽奖功能代码实例
Oct 20 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
短波的认识
2021/03/01 无线电
一个PHP日历程序
2006/12/06 PHP
PHP JSON 数据解析代码
2010/05/26 PHP
php define的第二个参数使用方法
2013/11/04 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
python五子棋游戏的设计与实现
2019/06/18 Python
python 使用raw socket进行TCP SYN扫描实例
2020/05/05 Python
如何理解Python中包的引入
2020/05/29 Python
python实现AdaBoost算法的示例
2020/10/03 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
财务会计专业求职信范文
2013/12/31 职场文书
运动会四百米广播稿
2014/01/19 职场文书
论文诚信承诺书
2014/05/23 职场文书
幼儿园清明节活动总结
2014/07/04 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
小学假期安全广播稿
2014/09/28 职场文书
2016党校培训心得体会
2016/01/07 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
Redis命令处理过程源码解析
2022/02/12 Redis