zoukankan      html  css  js  c++  java
  • H5-拖拽

      Drag:拖动

      Drop:释放    

    在HTML5之前只能使用鼠标事件模拟出“拖放”效果;HTML5专门为拖放提供了7个事件句柄。

     (1)拖动的源对象(source)可以触发的事件:

           dragstart:拖动开始

    <h3>拖放API-源对象可以触发的事件</h3>
    <img src="img/p3.png" alt="" id="p3">
    <script>
    //  <!--源对象可以触发的事件-->
      p3.ondragstart=function(){
        console.log("drag start")
      }
    </script>

    拖动开始触发一次

           drag:拖动进行中

      p3.ondrag=function(){
        console.log("drag")
      }

    拖动中一直触发

           dragend:拖动结束

      p3.ondragend=function(){
        console.log("dragEnd")
      }

    结束时触发一次

           源对象的拖动过程:dragstart x 1 + drag x n + dragend x 1

    例子:

    <script>
    //  <!--源对象可以触发的事件-->
    var startX=0;
    var startY=0;
      p3.ondragstart=function(e){
        //    获取鼠标在飞机块上的坐标
        startX= e.offsetX;
        startY= e.offsetY;
      }
      p3.ondrag=function(e){
    //    获取相对整个页面的坐标
        var x= e.pageX;
        var y= e.pageY;
        this.style.left=x-startX+"px";
        this.style.top=y-startY+"px";
    
      }
      p3.ondragend=function(e){
        var x= e.pageX;
        var y= e.pageY;
        if (x===0&&y===0){
          return
        }
        this.style.left=x-startX+"px";
        this.style.top=y-startY+"px";
      }
    </script>

     (2)拖动的目标对象(target)可以触发的事件:

           dragenter:拖动着进入

    <img src="img/trash.png" alt="" id="trash">
      trash.ondragenter=function(){
        console.log("拖动进入 dragenter")
      }

           dragover:拖动着在目标对象上方

    //  andragover事件的默认行为,触发dragleave,而跳过drop事件
     trash.ondragover=function(e){
    //    所以阻止他的默认行为
        e.preventDefault();
        console.log("拖动着在目标对象中")
      }

           dragleave:拖动着离开

      trash.ondragleave=function(){
        console.log("拖动着离开")
      }

           drop:在目标中松手/释放/松开

      trash.ondrop=function(){
        console.log("松开")
      }

           目标对象的进入/离开过程:

                  dragenter x 1 + dragover x n + dragleave x 1

           目标对象的进入/释放过程:

                  dragenter x 1 + dragover x n + drop x 1

      注意:必须阻止dragover的默认行为!否则drop事件无法触发


     练习一:

    要求:

    拖动飞机进入垃圾桶,删除飞机

    垃圾桶开始时半透明,删除东西后变成不透明

    <h3>拖动子垃圾桶</h3>
    <img src="img/trash.png" alt="" id="trash" class="over">
    <hr>
    <div id="container">
      <img src="img/p3.png" alt="" id="p3" >
      <img src="img/p4.png" alt="" id="p4" >
      <img src="img/p5.png" alt="" id="p5" >
    </div>

    先找到拖拽的时哪个飞机,也就是拖拽的源对象

    //  拖拽源对象
      var resObj=null;
      var imgList=document.querySelectorAll("img");
      for(var i=0;i<imgList.length;i++){
        imgList[i].ondragstart=function(){
          resObj=this
        }
      }

    当在目标对象位置松开时,在源对象容器中删除,该对象

    trash.ondragover=function(e){
    e.preventDefault();
    }
    trash.ondrop=function(){
        console.log("松手了");
        container.removeChild(resObj)
      }

    这个方法有全局变量,污染全局不好用


    如何在拖动的源对象和目标对象间传递数据

      如何在7个事件间传递数据?

      源对象事件——3个:

      目标对象事件——4个:

      (1)方法一:使用全局变量 —— 全局对象污染

      (2)方法二:使用拖放事件对象的dataTransfer属性

      说明:dataTransfer,用作数据传递/转移,看作“拖拉机”

      源对象触发事件时保存k-v数据:

           src.onxxx = function(e){

                  e.dataTransfer.setData( 'key',  'value' );

           }

      目标对象触发事件时获取k-v数据:

           target.onxxx = function(e){

                  var value = e.dataTransfer.getData( 'key' )

           }

     

      练习:

        

     要求:

    1.在下面选择战机,添加到上面阴影处;阴影隐藏;

    2.下面战机可以跟上面战机替换

    3。上面战机脱下来,阴影重新显现

    HTML:

    <div class="container">
      <h3>战机选择</h3>
      <div id="chosen">
        <img src="img/p0.png" alt="" id="p0">
      </div>
      <div id="resBox">
        <img src="img/p3.png" alt="" id="p3">
        <img src="img/p4.png" alt="" id="p4">
        <img src="img/p5.png" alt="" id="p5">
      </div>
    </div>

         css:

    body{
      text-align: center;
    }
    #chosen{
      border: 1px solid #aaa;
      border-radius: 5px;
      padding: 10px;
      width: 220px;
      margin: 0 auto;
    }
        #resBox{
          background: #f0f0f0;
          padding: 10px;
          border: 1px solid #aaa;
          width: 800px;
          margin: 10px auto;
        }

    JS"

    <script>
    //  获取所有图片元素
    var planes=document.querySelectorAll("img");
    var chosen=document.querySelector("#chosen");
      for(var i=0;i<planes.length;i++){
    //    对所有图片进行绑定,源对象开始事件,保存数据ID到e.dataTransfer.setData(key,value)
        planes[i].ondragstart=function(e){
          e.dataTransfer.setData("imgId",this.id);
        }
      }
    //去除目标拖拽移动事件的默认事件
    chosen.ondragover=function(e){
      e.preventDefault()
    }
    //在目标事件中松开鼠标
    chosen.ondrop=function(e){
    //    获取移动元对象的ID
        var pid= e.dataTransfer.getData("imgId");
    //    查找移动元对象元素
        var p=document.getElementById(pid);
    //   阴影隐藏
      p0.style.display="none";
    //  目标容器子元素大于1
      if (this.children.length>1){
    //    把p0弟弟,添加到下面去
        resBox.appendChild(p0.nextElementSibling);
      }
    //  把下面移动元素添加进来
      this.appendChild(p);
      }
    //把chosen做为元对象,下面作为目标,进行拖拽
    resBox.ondragenter=function(){}
    resBox.ondragover=function(e){
      e.preventDefault()
    }
    resBox.ondragleave=function(){
    }
    //把下面当成目标
    resBox.ondrop=function(e){
    //  获取刚才存入的移动上去的元素ID
      var pid= e.dataTransfer.getData("imgId");
      var p=document.getElementById(pid);
      resBox.appendChild(p);
      p0.style.display="block"
    }
    </script>

     补充内容:

    如何在服务器端下载的网页中显示客户端图片?

    一般情况下,网页智能显示服务器上的图片

    效果图:

    实现原理:???

    1.桌面向客户端拖拽,首先应该把客户端当成目标元素,所以对目标元素

    所以我们在目标元素中释放要执行ondrop事件,执行他就要取消ondragover的默认事件

    //  拖放目标对象--document,监听drop事件,
      document.ondragover=function(e){
        e.preventDefault();
      }

    此时,拖拽效果是这样

    实际上我们是在本地打开了图片,然而我萌并不想这样

    那么??????????

    2.取消ondrop事件的默认事件,就可以不打开图片了

    //取消打开图片
      document.ondrop=function(e){
        e.preventDefault();
      }

    不打开图片后的效果是一片空白

    我萌要的是图片上传在页面上

    怎么办??????????????

    3.在容器中放置图片,我萌新的目标对象是容器所以ondrop,ondragover对容器进行绑定

      container.ondragover=function(e){
        e.preventDefault()
      }
      container.ondrop=function(e){
    }

    4.图片信息怎么获取,dataTransfer帮大忙

    我萌先看dataTransfer中有什么???

      container.ondrop=function(e){
        console.log(e.dataTransfer);
    }

    拖拽图片进入容器松开,触发ondrop事件此时files中的内容为零;图片去哪里了,?????我萌打开files查看一下

        console.log(e.dataTransfer.files);

    明明有东西,藏着不给我看,

    取出图片信息,文件读取器读取文件:

        var f0=e.dataTransfer.files[0];
    ////    文件读取器
        var reader=new FileReader();
    ////    读取指定文件中的内容,作为“数据URL”;
        reader.readAsDataURL(f0);

    5.文件读取结束,创建IMG,添加到容器中

        reader.onload=function(){
          console.log("客户端文件读取完成");
    //      data
          var img=new Image();
          img.src=reader.result;
          container.appendChild(img);

    附上全部代码:

    HTML:

    <div id="container">
    </div>

    CSS:

      <style>
        #container{
          border: 1px solid #aaa;
          padding: 10px;
          margin: 10px;
          min-height: 500px;
          width: 500px;
        }
      </style>

    JS:

    <script>
    //  拖放目标对象--document,监听drop事件,
      document.ondragover=function(e){
        e.preventDefault();
      };
    //取消打开图片
      document.ondrop=function(e){
        e.preventDefault();
      }
      container.ondragover=function(e){
        e.preventDefault()
      }
      container.ondrop=function(e){
    ////    读取拖放进来的客户端图片内容
        var f0=e.dataTransfer.files[0];
    ////    文件读取器
        var reader=new FileReader();
    ////    读取指定文件中的内容,作为“数据URL”;
        reader.readAsDataURL(f0);
    ////    客户端文件解析完成
        reader.onload=function(){
          console.log("客户端文件读取完成");
    //      data
          var img=new Image();
          img.src=reader.result;
          container.appendChild(img);
    //    }
      }
    </script>
  • 相关阅读:
    JMeter 配置元件之HTTP Cookie Manager 介绍
    JMeter 线程组之Stepping Thread Group插件介绍
    JAVA JVM常见内存参数配置简析
    JMeter JMeter远程分布式联机性能测试
    JMeter JMeter自身运行性能优化
    SoapUI 访问代理设置
    SoapUI 利用SoapUI进行简单的接口并发测试
    JMeter Sampler之BeanShellSampler的使用
    JMeter 配置元件之计数器Counter
    JMeter 查看结果树监听器响应数据中文显示乱码解决方法
  • 原文地址:https://www.cnblogs.com/liangfc/p/7375555.html
Copyright © 2011-2022 走看看