基于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基础之undefined与null的区别分析
Aug 08 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 Javascript
使用javascript实现雪花飘落的效果
Jan 13 Javascript
jQuery的remove()方法使用详解
Aug 11 Javascript
JavaScript实现网页加载进度条代码超简单
Sep 21 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
Nov 15 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
详解angularjs实现echart图表效果最简洁教程
Nov 29 Javascript
浅谈Javascript常用正则表达式应用
Mar 08 Javascript
JS防抖和节流实例解析
Sep 24 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 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&amp;mysql(二)
2006/10/09 PHP
PHP 函数执行效率的小比较
2010/10/17 PHP
php curl 上传文件代码实例
2015/04/27 PHP
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
微信小程序实现打卡日历功能
2020/09/21 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
Python itertools模块详解
2015/05/09 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
美国性感女装网站:bebe
2017/03/04 全球购物
英国最大的在线床超市:Bed Star
2019/01/24 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
少先队学雷锋活动月总结
2014/03/09 职场文书
大连导游词
2015/02/12 职场文书
2015年国培研修感言
2015/08/01 职场文书
企业财务管理制度范本
2015/08/04 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS