ChatGPT解决这个技术问题 Extra ChatGPT

更改输入类型 =“文件”中的默认文本?

当我们使用 input="file" 时,我想更改“Choose File”按钮上的默认文本。

https://i.stack.imgur.com/rcdgH.png

我怎样才能做到这一点?正如您在图像中看到的那样,按钮位于文本的左侧。我怎样才能把它放在文本的右侧?

可以选择将此文本转换为变量吗?
ParPar 在这里的回答可能是您正在寻找的: stackoverflow.com/questions/1944267/…
试试这个解决方案:stackoverflow.com/a/30275263/1657573

W
Whymarrh

labelfor 属性用于 input

<div>
  <label for="files" class="btn">Select Image</label>
  <input id="files" style="visibility:hidden;" type="file">
</div>

下面是获取上传文件名称的代码

$("#files").change(function() { filename = this.files[0].name; console.log(filename); });


display:none 可用于 INPUT,因此不会占用不需要的空间。
谢谢你。这非常有效,正是我想要的。
在带有 Chrome、FF 和 Safari 的 Mac 上运行良好。如果它也在 IE 上这样做,那么这是设置文件输入按钮样式的最佳和最简单的选项。谢谢!
效果很好,唯一的负面影响是用户在选择时看不到已选择的文件的名称。
@Mike 更新了帖子以获取文件名
C
Community

我认为这就是你想要的:

JS Bin


迄今为止最好的解决方案。
这也处理键盘导航。要使其完美,请在隐藏文件输入上使用 tabindex="-1" 以在切换时跳过它。
S
SFin

每个浏览器都有自己的控件再现,因此您无法更改控件的文本或方向。

如果您想要 / 解决方案而不是 Flash 或 解决方案,您可能想尝试一些“类型”的技巧。

http://www.quirksmode.org/dom/inputfile.html

http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom

就个人而言,由于大多数用户坚持使用他们选择的浏览器,因此可能习惯于在默认版本中查看控件,如果他们看到不同的东西,他们可能会感到困惑(取决于您正在处理的用户类型) .


P
Paulo Mogollón

这可能对将来的某人有所帮助,您可以根据需要为输入设置标签的样式,并将任何您想要的内容放入其中并隐藏输入,不显示任何内容。

它在带有 iOS 的科尔多瓦上完美运行


A
Anuraj

这不可能。否则您可能需要使用 Silverlight 或 Flash 上传控件。


哪个是不可能的?更改文本或将按钮放在右侧或两者兼而有之?
我赞成这个,因为我认为反对这个答案是不公平的。更改原生文件输入按钮的文本基本上是不可能的。 “可能的解决方案”都是黑客或解决方法。
@PeterLee - 黑客是解决方案,有些甚至遵循 W3C 规范。
G
Gass

为了实现这一点,必须使用 display:none CSS 属性隐藏默认输入按钮,并添加一个新的按钮元素来替换它,这样我们就可以根据需要进行自定义。

使用引导程序

此处为可选文本

使用 jQuery

在这种情况下,添加到按钮元素的 onclick 属性指示 JavaScript 在单击可见按钮时单击隐藏的默认输入按钮。

此处为可选文本

带有事件监听器的纯 JavaScript

document.getElementById('btn').addEventListener('click', () => { document.getElementById('input').click(); }) 此处为可选文本


R
Rokive

$(document).ready(function () { $('#choose-file').change(function () { var i = $(this).prev('label').clone(); var file = $ ('#choose-file')[0].files[0].name; $(this).prev('label').text(file); }); }); .custom-file-upload{ 背景:#f7f7f7;填充:8px;边框:1px 实心#e3e3e3;边框半径:5px;边框:1px 实心#ccc;显示:内联块;填充:6px 12px;光标:指针; 你能试试这个


T
Tushar Shukla

诀窍是在点击文件输入时触发点击事件,并通过 CSS 管理默认输入文件的可见性。你可以这样做:jQuery:

$(function() {
  $("#labelfile").click(function() {
    $("#imageupl").trigger('click');
  });
})

css

.file {
  position: absolute;
  clip: rect(0px, 0px, 0px, 0px);
  display: block;
}

.labelfile {
  color: #333;
  background-color: #fff;
  display: inline-block;
  margin-bottom: 0;
  font-weight: 400;
  text-align: center;
  vertical-align: middle;
  cursor: pointer;
  background-image: none;
  white-space: nowrap;
  padding: 6px 8px;
  font-size: 14px;
  line-height: 1.42857143;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

HTML 代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div>
  <input name="imageupl" type="file" id="imageupl" class="file" />
  <label class="labelfile" id="labelfile"><i class="icon-download-alt"></i> Browse File</label>
</div>

T
Thielicious

我制作了一个脚本并在 GitHub 上发布:获取 selectFile.js 易于使用,随意克隆。

HTML

<input type=file hidden id=choose name=choose>
<input type=button onClick=getFile.simulate() value=getFile>
<label id=selected>Nothing selected</label>

JS

var getFile = new selectFile;
getFile.targets('choose','selected');

演示

jsfiddle.net/Thielicious/4oxmsy49/


u
user3784950

2017 年更新:

我已经研究了如何实现这一点。最好的解释/教程在这里:https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/

我会在这里写摘要以防它变得不可用。所以你应该有 HTML:

<input type="file" name="file" id="file" class="inputfile" />
<label for="file">Choose a file</label>

然后用 CSS 隐藏输入:

.inputfile {
width: 0.1px;
height: 0.1px;
opacity: 0;
overflow: hidden;
position: absolute;
z-index: -1;}

然后为标签设置样式:

.inputfile + label {
font-size: 1.25em;
font-weight: 700;
color: white;
background-color: black;
display: inline-block;
}

然后可以选择添加 JS 来显示文件名:

var inputs = document.querySelectorAll( '.inputfile' );
Array.prototype.forEach.call( inputs, function( input )
{
var label    = input.nextElementSibling,
    labelVal = label.innerHTML;

input.addEventListener( 'change', function( e )
{
    var fileName = '';
    if( this.files && this.files.length > 1 )
        fileName = ( this.getAttribute( 'data-multiple-caption' ) || '' ).replace( '{count}', this.files.length );
    else
        fileName = e.target.value.split( '\\' ).pop();

    if( fileName )
        label.querySelector( 'span' ).innerHTML = fileName;
    else
        label.innerHTML = labelVal;
});
});

但真的只是阅读教程并下载演示,它真的很棒。


J
Jared Forth

这应该有效:

input.*className*::-webkit-file-upload-button {
  *style content..*
}

L
Leon Tanko

这是它如何使用引导程序完成的,只有你应该将原始输入放在某个地方...... idk 在头部并删除
如果你有它,因为它只是隐藏并且它占用空间:)


T
Tushar Shukla

使用 Bootstrap,您可以像下面的代码一样执行此操作。

<!DOCTYPE html>
<html lang="en">
<head>

  <style>
    .btn-file {
      position: relative;
      overflow: hidden;
    }

    .btn-file input[type=file] {
      position: absolute;
      top: 0;
      right: 0;
      min-width: 100%;
      min-height: 100%;
      font-size: 100px;
      text-align: right;
      filter: alpha(opacity=0);
      opacity: 0;
      outline: none;
      background: white;
      cursor: inherit;
      display: block;
    }

  </style>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
  <span class="btn btn-file">Upload image from here<input type="file">
</body>
</html>

此代码不会将选择的文件打印回网页。
S
Sony Santos

我会使用 button 来触发 input

<button onclick="document.getElementById('fileUpload').click()">Open from File...</button>
<input type="file" id="fileUpload" name="files" style="display:none" />

又快又干净。


И
Илья Зеленько

您可以使用这种方法,即使输入大量文件也可以使用。

const fileBlocks = document.querySelectorAll('.file-block') const buttons = document.querySelectorAll('.btn-select-file') ;[...buttons].forEach(function (btn) { btn.onclick = function () { btn.parentElement.querySelector('input[type="file"]').click() } }) ;[...fileBlocks].forEach(function (block) { block.querySelector('input[type ="file"]').onchange = function () { const filename = this.files[0].name block.querySelector('.btn-select-file').textContent = '文件选择:' + 文件名 } } ) .btn-select-file { 边框半径:20px; } 输入[type="file"] { 显示:无; }



我喜欢这种方法,但对我来说,选择的文件文本没有出现,不知道是什么问题。我是谷歌浏览器
b
bagatov88

我的解决方案...

HTML:

<input type="file" id="uploadImages" style="display:none;" multiple>

<input type="button" id="callUploadImages" value="Select">
<input type="button" id="uploadImagesInfo" value="0 file(s)." disabled>
<input type="button" id="uploadProductImages" value="Upload">

查询:

$('#callUploadImages').click(function(){

    $('#uploadImages').click();
});

$('#uploadImages').change(function(){

    var uploadImages = $(this);
    $('#uploadImagesInfo').val(uploadImages[0].files.length+" file(s).");
});

这只是邪恶的:D


J
Jadin Hornsby

好的,创建自定义输入文件的非常简单的纯 css 方式。

使用标签,但正如您从以前的答案中知道的那样,标签不会在 Firefox 中调用 onclick 函数,可能是一个错误,但与以下内容无关。

<label for="file"  class="custom-file-input"><input type="file"  name="file" class="custom-file-input"></input></label>

您所做的是设置标签的样式以使其看起来像您想要的那样

    .custom-file-input {
        color: transparent;/* This is to take away the browser text for file uploading*/
        /* Carry on with the style you want */
        background: url(../img/doc-o.png);
        background-size: 100%;
        position: absolute;
        width: 200px;
        height: 200px;
        cursor: pointer;
        top: 10%;
        right: 15%;
    }

现在只需隐藏实际的输入按钮,但您不能将其设置为 visability: hidden

所以通过设置 opacity: 0; 使其不可见

input.custom-file-input {
    opacity: 0;
    position: absolute;/*set position to be exactly over your input*/
    left: 0;
    top: 0;
}

现在您可能已经注意到,我的标签上的类与我输入字段的类相同,那是因为我希望两者都具有相同的样式,因此无论您在何处单击标签,实际上都是在单击不可见的输入字段。


C
Carson

我构建了一个更容易做到这一点的脚本。

例如:

基本上,我的脚本与这个 link 非常相似

代码

纯javascript,不需要依赖

参考

可见性:隐藏和显示:无有什么区别?

数据-*


h
hostingutilities.com

下面是一个风格化的上传按钮示例,它将读取图像、压缩图像并下载生成的图像。它的工作原理是隐藏实际的输入元素,然后我们通过一些技巧来制作它,以便当您单击我们的假文件上传器时,它会使用实际的输入元素弹出选择文件的窗口。通过使用这种方法,我们可以 100% 控制文件上传器的外观,因为我们使用自己的元素而不是设置文件上传菜单的样式。如果我们想这样做,它还可以在将来轻松添加拖放功能。

然后我实际上创建了关于这个文件上传按钮的 a series of blog posts

'use strict' var AMOUNT = 10 var WIDTH = 600 var HEIGHT = 400 var canvas = document.getElementById('canvas') canvas.width = WIDTH canvas.height = HEIGHT //这里是我创建可点击区域的方法 //用户点击可点击区域 > 我们发送点击事件 // 到文件打开器 > 文件打开器点击打开 // 文件按钮 > 打开文件对话框弹出 function clickableAreaListener(e){ let clickEvent = new CustomEvent("click", {"来自":"fileOpenerHandler"}); document.getElementById("fileOpener").dispatchEvent(clickEvent); } 函数 fileOpenerListener(e) { document.getElementById("file-btn").click(); e.preventDefault(); } 函数 fileSelectedListener(e){ readFiles(e.target.files); } document.getElementById('file-btn').addEventListener('change', fileSelectedListener); document.getElementById("clickable-area").addEventListener('click', clickableAreaListener); document.getElementById("fileOpener").addEventListener("click", fileOpenerListener);函数 readFiles(files){ files = [].slice.call(files); //将文件转换为普通数组 for (var file of files){ var reader = new FileReader(); reader.onload = createOnLoadHandler(file); reader.onerror = fileErrorHandler; // 还有 reader.onloadstart、reader.onprogress 和 reader.onloadend 处理程序 reader.readAsDataURL(file); } } function fileErrorHandler(e) { switch(e.target.error.code) { case e.target.error.NOT_FOUND_ERR: throw 'Image not found';休息; case e.target.error.NOT_READABLE_ERR: throw '图像不可读';休息;案例 e.target.error.ABORT_ERR:中断;默认值: throw '读取图像时发生错误'; }; } function createOnLoadHandler(file){ console.log('reading ' + file.name + ' of type ' + file.type) //file.type 将是 image/jpeg 或 image/png function onLoad(e){ var数据 = e.target.result 显示(数据); var compressedData = compressCanvas(AMOUNT) 下载(compressedData) } return onLoad } 函数显示(data){ var img = document.createElement('img'); img.src = 数据; var context = canvas.getContext('2d') context.clearRect(0, 0, WIDTH, HEIGHT); context.drawImage(img, 0, 0, WIDTH, HEIGHT); } function compressCanvas(){ return canvas.toDataURL('image/jpeg', AMOUNT / 100); } 函数下载(数据){ 函数 b64toBlob(b64Data,contentType,sliceSize){ contentType = contentType || '';切片大小 = 切片大小 || 512; var byteCharacters = atob(b64Data); var byteArrays = []; for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { var slice = byteCharacters.slice(offset, offset + sliceSize); var byteNumbers = new Array(slice.length); for (var i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } var byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } var blob = new Blob(byteArrays, {type: contentType});返回斑点; } var chromeApp = Boolean(chrome && chrome.permissions) if (chromeApp){ chrome.fileSystem.chooseEntry({type:'openDirectory'}, function(entry) { chrome.fileSystem.getWritableEntry(entry, function(entry) { entry .getFile('example.jpg', {create:true}, function(entry) { entry.createWriter(function(writer){ writer.write(b64toBlob(data.slice(23), 'image/jpg')) } ) }) }) }) } else { let a = document.createElement("a"); a.href = 数据; a.download = 'downloadExample.jpg' document.body.appendChild(a) a.click(); window.URL.revokeObjectURL(a.href); a.remove() } } .fileInput { 显示:无;位置:绝对;顶部:0;右:0;字体大小:100px; } #clickable-area{ 背景:#ccc;宽度:500px;显示:弯曲;边距底部:50px; } #clickable-area-text{ 边距:自动; } .yellow-button { 光标:指针;白颜色;背景:#f1c40f;高度:30px;宽度:120px;内边距:30px;字体大小:22px;文字阴影:0 1px 2px rgba(0, 0, 0, 0.25); }

缩小图片

(你可以点击这里的任何地方) 

堆栈溢出限制似乎阻止了代码片段实际压缩和下载文件。 exact same code here 表明完整的上传/压缩/下载过程确实按预期工作。


A
Azhar Uddin Sheikh

JS Bin


D
David Mikula

With answers from this question,我修复了许多评论中所说的对他们不起作用的问题,即它没有显示用户选择了多少文件。

<label for="uploadedFiles" class="btn btn-sm btn-outline-primary">Choose files</label>
<input type="file" name="postedFiles" id="uploadedFiles" multiple="multiple" hidden onchange="javascript:updateList()" />
<input class="btn btn-primary mt-2 btn-action" type="submit" value="Send" formmethod="post" formaction="@Url.Action("Create")" /><br />
<span id="selected-count">Selected files: 0</span>
<script>
    updateList = function () {
        var input = document.getElementById('uploadedFiles');//list of files user uploaded
        var output = document.getElementById('selected-count');//element displaying count
        output.innerHTML = 'Selected files: ' + input.files.length;
    }
</script>

您可以通过显示文件名或您想要做的任何事情来轻松改进它,但我只想通知用户他们已经选择了文件。