美文网首页优美编程让前端飞
优雅的处理从网页外部拖拽图片

优雅的处理从网页外部拖拽图片

作者: 小遁哥 | 来源:发表于2019-05-12 18:04 被阅读3次

测试基于chrome 74

需求如下:
1.禁止放下图片后覆盖当前网页
2.当图片进入时提示用户将图片放在哪里,没有放到指定位置时,则重置状态

完整的例子如下

<!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>从网页外部拖拽图片</title>
    <style>
      .drop-here {
        line-height: 200px;

        width: 200px;
        height: 200px;

        text-align: center;

        border: 1px solid #000;
      }

    </style>
  </head>
  <body>
    <div
      class="drop-here"
      ondragover="dragover.call(this,event)"
      ondrop="drop.call(this,event)"
    ></div>
  </body>

  <script>
    let dropHereDom = document.querySelector(".drop-here");
    let dragSeed = 0;

    document.addEventListener(
      "dragover",
      e => {
        e.preventDefault();
        dropHereDom.textContent = "拖到这里";
        e.dataTransfer && (e.dataTransfer.dropEffect = "none");

        window.clearTimeout(dragSeed);
        dragSeed = window.setTimeout(() => {
          dropHereDom.textContent = "";
        }, 100);
      },
      true
    );
    function drop(event) {
      event.preventDefault();
      const dragData = [];
      //获得图片
      if (event.dataTransfer.items && event.dataTransfer.items.length > 0) {
          for (let i = 0; i < event.dataTransfer.items.length; i++) {
            if (event.dataTransfer.items[i].kind === "file") {
                const file = event.dataTransfer.items[i].getAsFile();
                if (file) {
                  dragData.push(file);
                }
            }
          }
        console.log(dragData);
      }
      console.log(event); //看不到event.dataTransfer.items有东西
    }
    function dragover(event) {
      event.dataTransfer && (event.dataTransfer.dropEffect = "copy");
    }
</script>
</html>

禁止放下图片后覆盖当前网页

document.addEventListener("dragover");注意第三个参数,表示在捕获阶段监听。
e.dataTransfer && (e.dataTransfer.dropEffect = "none"); 全局禁止元素被放下

dragover()中 event.dataTransfer && (event.dataTransfer.dropEffect = "copy"),表示拖拽元素在drop-here中可以被放下,如果document.addEventListener("dragover")不在捕获阶段监听,此处就要加上event.stopPropagation()了。

drop() 中的event.preventDefault();禁止在drop-here中放下图片会覆盖当前网页。

当图片进入时提示用户将图片放在哪里,没有放到指定位置时,则重置状态

从网页外部拖入图片有其特殊性,试了几种方式,图片拖入到网页外放下不能处理。

拖动网页内部图片时就没有这么麻烦,相同情况下总是可以触发dragend事件

因此在document.addEventListener("dragover")中,利用dragover会一直触发,不断的clearTimeout,然后setTimeout,当不触发dragover时,表示拖拽结束了。

dataTransfer 下的dropEffect

dropEffect 表示拖拽的视觉效果以及行为 ,常见的值有copy,move,link,none

https://developer.mozilla.org/zh-CN/docs/Web/API/DataTransfer/dropEffect

与其相关的还有effectAllowed

绑定事件时候的this

 <div class="drop-here" ondragover="dragover.call(this,event)    ondrop="drop.call(this,event)"></div>

ondragover="dragover.call(this,event) 中的this是指向当前的DOM元素的,如果函数名称变成ondragover就会报错Maximum call stack size exceeded,自己调用自己...

这里要diss下Vue了,在2.5.0中,绑定事件既可以drop也可以drop(),个人认为应该和原生的统一。

同时React绑定事件可以onDragStart这种写法,也要和原生统一才好。

怎么说呢,框架尽量减少新概念、新写法对开发者以及团队会更友好,感觉React正在变的越来越难以被掌握!

相关文章

  • 优雅的处理从网页外部拖拽图片

    测试基于chrome 74 需求如下:1.禁止放下图片后覆盖当前网页2.当图片进入时提示用户将图片放在哪里,没有放...

  • 从外部 拖拽 图片文件显示在网页中

  • 网页中拖拽图片的异常问题

    在网页中鼠标拖拽图片时,由于img元素对于拖拽时的默认行为,导致拖拽异常出现下图的中的虚影 在mousemove事...

  • #简书精进计划:网页写文章界面传图体验优化

    在网页版邮箱发邮件的时候,如果需要上传图片/文件,可以直接拖拽图片/文件到窗口,即完成上传。常见地,网页这时会提示...

  • 前端学习 Day3

    1.图片标签 图片标签用于将网页外部图片引入网页,是一个自结束标签 属性 src 表示图片引入的路径alt 如果...

  • 拖拽API

    实现拖拽效果 目前实现拖拽效果 HTML5拖拽 源元素事件例子 目标元素事件 从本地拖放图片到页面中 实现拖拽

  • 前端

    img使用img标签来向网页中引入一个外部图片img标签也是一个自结束标签属性:src:设置一个外部图片的路径al...

  • pano2vr 5.1 使用简易说明

    pano2vr 是一款快速处理全景图片的软件 导入图片 拖拽全景图片到中间的面板,或者点击导入按钮导入图片。 添加...

  • unity Input.touch多点触控

    处理多点触控问题,本文实现多点拖拽图片功能原文:https://blog.csdn.net/AnYuanLzh/a...

  • WKWebview与app本地的交互框架构建

    1:场景网页需要调用本地的拍照、上传图片、保存图片、音视频的上传、图片的预览等;网页通过本地处理alert的提示框...

网友评论

    本文标题:优雅的处理从网页外部拖拽图片

    本文链接:https://www.haomeiwen.com/subject/nfbcaqtx.html