我使用下面的脚本来使用拖放上传文件.

// dragover and dragenter events need to have 'preventDefault' called
// in order for the 'drop' event to register. 
// See: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Drag_operations#droptargets
dropContainer.ondragover = dropContainer.ondragenter = function(evt) {
  evt.preventDefault();
};

dropContainer.ondrop = function(evt) {
  // pretty simple -- but not for IE :(
  fileInput.files = evt.dataTransfer.files;

  // If you want to use some of the dropped files
  const dT = new DataTransfer();
  dT.items.add(evt.dataTransfer.files[0]);
  dT.items.add(evt.dataTransfer.files[3]);
  fileInput.files = dT.files;

  evt.preventDefault();
};
<!DOCTYPE html>
<html>
<body>
<div id="dropContainer" style="border:1px solid black;height:100px;">
   Drop Here
</div>
  Should update here:
  <input type="file" id="fileInput" />
</body>
</html>

如果我一次上传多个文件,没问题,它起作用了. 但如果我只上传一个文件,浏览器会在新的选项卡中打开该文件. 怎样才能阻止这个动作,只把文件放在盒子里?

推荐答案

问题是,代码假设有第三个文件(事实并非如此),会抛出错误,因为索引超出边界,没有到达preventDefault行.你需要使用索引循环,只添加实际存在的项:

// dragover and dragenter events need to have 'preventDefault' called
// in order for the 'drop' event to register. 
// See: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Drag_operations#droptargets
dropContainer.ondragover = dropContainer.ondragenter = function(evt) {
  evt.preventDefault();
  evt.stopPropagation();
  return false;
};

dropContainer.ondrop = function(evt) {
  // pretty simple -- but not for IE :(
  //fileInput.files = evt.dataTransfer.files;

  // If you want to use some of the dropped files
  const dT = new DataTransfer();
  //dT.items.add(evt.dataTransfer.files[0]);
  //dT.items.add(evt.dataTransfer.files[3]);
  let index = 0;
  while (evt.dataTransfer.files[index]) dT.items.add(evt.dataTransfer.files[index++]);
  fileInput.files = dT.files;
  
  evt.preventDefault();
};
<!DOCTYPE html>
<html>
<body>
<div id="dropContainer" style="border:1px solid black;height:100px;">
   Drop Here
</div>
  Should update here:
  <input type="file" id="fileInput" />
</body>
</html>

Javascript相关问答推荐

React Native平面列表自动滚动

如何使用Echart 5.5.0创建箱形图

如何为GrapesJS模板编辑器创建自定义撤销/重复按钮?

使用useup时,React-Redux无法找到Redux上下文值

无法检测卡片重叠状态的问题

简单的PayPal按钮集成导致404错误

使用JQuery单击元素从新弹出窗口获取值

如何将Cookie从服务器发送到用户浏览器

如何将react—flanet map添加到remixjs应用程序

JS—删除对象数组中对象的子对象

在HTML语言中调用外部JavaScript文件中的函数

扩展类型的联合被解析为基类型

第三方包不需要NODE_MODULES文件夹就可以工作吗?

将嵌套数组的元素乘以其深度,输出一个和

不协调嵌入图片

如何在TransformControls模式下只保留箭头进行翻译?

如何向内部有文本输入字段的HTML表添加行?

相对于具有选定类的不同SVG组放置自定义工具提示

如果我将高度设置为其内容的100%,则在Java脚本中拖动以调整面板大小时会冻结

在D3.js中创建具有旋转手柄的可拖动、可调整大小的框?