基于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系列(2) 揭秘命名函数表达式
Jan 15 Javascript
利用了jquery的ajax实现二级联互动菜单
Dec 02 Javascript
jQuery版AJAX简易封装代码
Sep 14 Javascript
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 Javascript
vue插件draggable实现拖拽移动图片顺序
Dec 01 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
Mar 07 Javascript
vue slot与传参实例代码讲解
Apr 28 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
Sep 25 Javascript
如何构建 vue-ssr 项目的方法步骤
Aug 04 Javascript
Vue axios获取token临时令牌封装案例
Sep 11 Javascript
谈谈JavaScript中的垃圾回收机制
Sep 17 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
php中autoload的用法总结
2013/11/08 PHP
PHP编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
php如何获取文件的扩展名
2015/10/28 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
拥抱模块化的JavaScript
2012/03/07 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
python检测是文件还是目录的方法
2015/07/03 Python
python爬虫获取京东手机图片的图文教程
2017/12/29 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
解析Python3中的Import
2019/10/13 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
毕业生求职自荐书范文
2014/03/27 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
单身证明范本
2015/06/15 职场文书
苹果M1芯片安装nginx 并且部署vue项目步骤详解
2021/11/20 Servers
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL