我目前正在使用HTML、CSS和JavaScript设计一个表单,其中包括输入类型=文件.我自定义了该表单,以便输入现在使用图像,可以单击该图像来浏览和 Select 用户机器中的文件.不过,我也希望它具有拖放功能.

下面是我目前拥有的代码.此代码足以完成几件事:

  1. 它用IMG标签中调用的图像替换了在使用带有类型=文件的输入标签时渲染的默认" Select 文件"按钮.
  2. 它使用一些JavaScript作为span标签,以向用户指示他们 Select 了哪个文件,或者是否没有 Select 任何文件.

这些之所以成为可能,是因为CSS用于更改输入标记中类型=文件的默认行为.然而,我还没有找到可以在当前解决方案中实现拖放的代码.有人能帮忙吗?

<style>
    .required-file::after {
    content: "*";
    color: red;
    }
    .custom-upload {
    display: inline-block;
    padding: 6px 12px;
    cursor: pointer;
    }
    input[type="file"] {
    display: none;
    }
    </style>
    <script>
    $(function() {
    const fileUploadElement = document.getElementById('fileUpload');
    const chosenFileElement = document.getElementById('chosen-file');
    fileUploadElement.addEventListener('change', function(){
    chosenFileElement.textContent = this.files[0].name;
    });
    });
    </script>
    <label for="fileUpload" class="custom-upload">
    <img src="/fakepath/image.png" width="100" height="100">
    </label>
    <input type="file" id="fileUpload" name="fileUpload" >
    <span class="required-file" id="chosen-file">No file chosen</span>

推荐答案

这是解决方案

document.addEventListener("DOMContentLoaded", function() {
  const fileUploadElement = document.getElementById('fileUpload');
  const chosenFileElement = document.getElementById('chosen-file');
  const fileDropArea = document.getElementById('fileDropArea');

  const handleFileSelect = function(event) {
    event.stopPropagation();
    event.preventDefault();
    const files = event.dataTransfer.files;
    showFileName(files);
  };

  const handleDragOver = function(event) {
    event.stopPropagation();
    event.preventDefault();
    event.dataTransfer.dropEffect = 'copy'; 
  };

  const showFileName = function(files) {
    if (files.length > 0) {
      chosenFileElement.textContent = files[0].name;
    } else {
      chosenFileElement.textContent = 'No file chosen';
    }
  };

  fileDropArea.addEventListener('dragover', handleDragOver, false);
  fileDropArea.addEventListener('drop', handleFileSelect, false);

  fileUploadElement.addEventListener('change', function() {
    showFileName(this.files);
  });
});
.required-file::after {
  content: "*";
  color: red;
}

.custom-upload {
  display: inline-block;
  padding: 6px 12px;
  cursor: pointer;
  border: 2px dashed #ccc;
}

input[type="file"] {
  display: none;
}
<label for="fileUpload" class="custom-upload" id="fileDropArea">
        <img src="https://cataas.com/cat" width="100" height="100">
    </label>
<input type="file" id="fileUpload" name="fileUpload">
<span class="required-file" id="chosen-file">No file chosen</span>

Javascript相关问答推荐

使用JavaScript更改json值顺序

功能和普通对象之间的原型污染

foreach循环中的Typescript字符串索引

序列查找器功能应用默认值而不是读取响应

对象和数字减法会抵消浏览器js中的数字

传递一个大对象以在Express布局中呈现

我可以从React中的出口从主布局调用一个处理程序函数吗?

如何将Openjphjs与next.js一起使用?

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

JavaScript是否有多个`unfined`?

从另一个数组中的对应行/键值对更新数组中的键值对对象

如何在我的Next.js项目中.blob()我的图像文件?

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

react -原生向量-图标笔划宽度

Jexl to LowerCase()和Replace()

与在编剧中具有动态价值的定位器交互

设置复选框根据选中状态输入选中值

我们是否可以在reactjs中创建多个同名的路由