`
jkfzero
  • 浏览: 105441 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自定义input type=”file”的样式以及引出的相关技术问题

阅读更多

 

http://www.itfeed.cn/post.asp?id=3420

 

因为不同浏览器下如果使用默认的input type=”file”元素,效果如下

为了保证不同浏览器下的UI一致我们有需求要自定义input type=”file”元素的样式

如何Style input type=”file”元素的相关长篇讨论
1. Styling an input type=”file”
http://www.quirksmode.org/dom/inputfile.html

2. Howto Style the Button of a input type=”file” Control
http://imar.spaanjaars.com/154/howto-style-the-button-of-a-input-typefile-control

翻译成白话文就是
1. 隐藏input type=”file”
2. 用CSS将a+span做成按钮样式,对其做事件绑定,点击之后触发input type=”file”的点击事件
3. 用input type=”text”显示input type=”file”选中文件的值

查看能工作的live code
http://jsfiddle.net/jihao/sFCQV/

HTML

<input type="text" id="fakeFile" name="fakeFile">

<a class="linkButton" id="link_browse" href="#"><span>Link Button BROWSE</span></a>

<input id="theFile" type="file"
  style="visibility:hidden;opacity:0;cursor:pointer;*filter: alpha(opacity=0);">

CSS

a.linkButton{
    background: #332233;/*style this link to look like a button*/
    color: #FFFFFF;
    padding: 0 0 0 10px;
    text-decoration: none;
}
a.linkButton>span{
    padding: 0 10px 0 0;
}

JavaScript

$(function() {
    $('#browse,#link_browse').click(function(event) {
        event.preventDefault();
        $('#theFile').trigger('click');
    });

    function changeCallBack() {
        $('#fakeFile').val($('#theFile').val());
    };

    //this works for FF, easy job
    $('#theFile').bind('change', function() {
        alert('gotcha!');
        changeCallBack();

    });
});

写完这段代码之后遇到的相关问题
问题1. FireFox下不会显示文件全路径(google得知这是FF的安全考虑,不影响form提交)
问题2. IE下选择文件后不会触发change事件,原因是IE处理打开文件的机制(参考下面的链接看更多讨论)
对于IE8,这个问题的解决办法如下,setTimeout会阻塞,直到文件选择器关闭之后,回调函数才被调用(更新用来显示的input type=”text”的值)

    if ($.browser.msie) {
        $('#theFile').bind('click', function() {
            //this solution works for IE8, not Maxthon2, so seems not IE6 either(not tested)
            setTimeout(function() {
                alert('[IE8] setTimeout get called after open file dialog was closed');
                changeCallBack();
            }, 0);

        });
    }

查看能工作的live code
http://jsfiddle.net/jihao/sFCQV/

关于IE change事件的相关讨论
1. jQuery, .change() notification, and IE (关于radio button的change事件绑定)
http://norman.walsh.name/2009/03/24/jQueryIE

2. jQuery: change event to input file on IE
http://stackoverflow.com/questions/2389341/jquery-change-event-to-input-file-on-ie

 

就是说IE不blur的话file不触发change事件,解决办法是设置一个setTimeout,然后再0毫秒后执行,利用文件选择框的阻塞。

分享到:
评论
1 楼 jkfzero 2011-05-18  
IE6这个方法不好使,居然是直接给file加onclick事件好使=。=!

相关推荐

    如何将input type=file显示的浏览变成英文的

    ### 如何将input type=file显示的“浏览”变成英文的 在网页开发中,经常会遇到需要用户上传文件的情况。默认情况下,HTML中的`&lt;input type="file"&gt;`元素的“浏览”按钮通常会显示为系统语言,对于英文界面的需求,...

    input type=file 显示的浏览 改成英文

    本篇文章将详细讲解如何将`&lt;input type="file"&gt;` 控件的“浏览”按钮和提示改为英文。 首先,我们需要理解`&lt;input type="file"&gt;`的基本结构和属性。这个标签创建了一个可以点击的区域,用户可以通过点击打开本地...

    HTML input type=file文件选择表单元素.docx

    一、input type=file 文件选择表单元素 input type=file 是 HTML 中的一种表单元素,用于选择文件并上传到服务器。HTML5 之前的 input type=file 元素只能一次上传一张图片,无法满足一次上传多图的交互需求。因此...

    input type=file 调取手机照相机和选择照片上传

    本文将深入探讨如何使用 `input type="file"` 激活手机的照相机功能以及选择图片上传。 首先,`&lt;input type="file"&gt;` 是HTML中的一个表单元素,它的主要作用是让用户选择本地文件。在默认情况下,点击这个元素会...

    Android-解决在webview中input标签type="file"不能使用的问题

    然而,在实际使用中,我们可能会遇到一些问题,比如在WebView中使用`&lt;input type="file"&gt;`标签时,用户无法选择本地文件。这个现象主要是由于Android的安全机制和权限控制导致的。本文将详细讲解如何解决这个问题。 ...

    图片上传.rar(C#如何使用input[type=file]进行多个图片上传)

    C#如何使用input[type=file]进行多个图片上传(XMLHttpRequest与后台交互) 详情可看:https://blog.csdn.net/weixin_44713389/article/details/90746459

    vue中使用input[type=”file”]实现文件上传功能

    input[type=file] 标签中的属性accept=application/msword,application/pdf 在pc上正常,但是在手机ios和android上这个文件格式限制会被忽略,所以需要在js中增加格式的判断,以及对应显示样式的设置.(我也是刚发现,...

    自定义(滑动条)input[type="range"]样式 下载

    为了提升用户体验和界面美观度,我们可以自定义滑动条的样式。本教程将深入探讨如何使用HTML5、CSS3以及JavaScript来实现一个具有个性化外观的滑动条。 首先,我们创建一个基本的HTML结构,包含一个`&lt;input type=...

    android webview input=file 失效解决方案

    Android Webview中的`input=file`失效问题主要由安全策略和权限限制引起。通过自定义`WebChromeClient`、请求读取权限、实现文件选择器和使用`FileProvider`,可以解决这个问题,使用户能够正常在Webview中上传文件...

    定义input type=file 样式的方法

    `input type="file"` 是HTML中用于创建文件选择器的元素,它的默认样式往往不符合设计师的期望,因此需要对其进行美化。原始的`file`控件通常呈现为一个简单的文本框和一个"浏览"按钮,其外观朴素且难以与页面其他...

    input type=file 及时预览图片

    总的来说,`&lt;input type="file"&gt;` 结合 `FileReader API` 可以实现用户在选择图片后的即时预览,这在现代Web开发中是一个常用且实用的技术,提高了用户的交互体验。理解并掌握这一技术,对于提升网页的交互性和专业...

    HTML中文件上传时使用的input type=”file”元素的样式自定义

    总的来说,自定义`&lt;input type="file"&gt;`元素的样式涉及到HTML结构的调整、CSS定位和透明度控制,以及对不同浏览器兼容性的考虑。通过这些技术,我们可以创建出符合设计需求且具有良好用户体验的文件上传按钮。

    file input 按钮国际化

    4. **Web组件**:使用Web组件技术,可以创建自定义的file input组件,内部包含多语言支持。这样,当切换语言时,只需更新组件的属性即可。 5. **i18n工具**:国际化的标准工具,如i18next,可以方便地管理和切换...

    解决webView不支持网页,webViewinput type="file"上传功能

    本篇文章将详细讲解如何解决WebView不支持网页中的文件上传问题,以及如何通过自定义实现来确保其正常工作。 首先,我们需要理解为什么WebView不直接支持`input type="file"`。出于安全考虑,原生的WebView控件通常...

    兼容IE7、IE8、IE9的input type=&quot;number&quot;插件

    在提供的压缩包文件"Firefox和IE对input number的兼容"中,可能包含了实现这种兼容性的源代码、示例页面、CSS样式以及测试用例。开发者可以参考这些资源来理解和应用这个插件,或者作为自定义兼容解决方案的基础。 ...

    ajaxfileupload.js结合input[type=file]无刷新上传

    本文将详细介绍如何使用`ajaxfileupload.js`这个jQuery插件,结合`input[type=file]`元素,实现无刷新的文件上传功能。 首先,`ajaxfileupload.js`是一个基于jQuery的轻量级插件,它允许开发者通过异步方式发送文件...

    css input[type=file] 样式美化(input上传文件样式 )

    需要注意的是,由于安全和浏览器兼容性问题,直接对`input[type=file]`进行样式定制存在一定的限制。例如,不能更改文件选择对话框的外观,也不能阻止其弹出。但是,通过CSS,我们可以让这个元素看起来像是网站设计...

    怎样让input type=file 只读,并能实现文件上传

    ### 如何使 input type=file 只读并实现文件上传 在网页开发中,有时我们需要让用户选择一个文件但不允许他们更改已选择的文件。这通常是为了防止用户在提交表单前临时更改文件,从而确保文件的一致性和安全性。...

    HTML+JAVA 手机端相册或者拍照上传到服务器,简单的代码样例(使用控件input type=file)

    HTML+JAVA 手机端相册或者拍照上传到服务器。前台代码部分:手机选择图片input type=file,通过form表单提交到后台;后台java代码部分:获取表单提交的文件和普通控件数据,将文件写入服务器某路径下

Global site tag (gtag.js) - Google Analytics