Aplicación de HTML5 Drag and Drop API


prefacio

Drag and drop api es una api muy común en nuestro front-end.Arrastrar
y soltar (Drag and Drop) es una característica muy común. Es cuando agarras algo y lo arrastras a una ubicación diferente.
Este artículo utiliza principalmente un caso para ayudar a todos a entender cómo usarlo.


1. Arrastra y suelta eventos relacionados

1. ondragstart

Disparado una vez cuando comienza el arrastre

2. ondragover

Se activa cuando se arrastra sobre un elemento determinado, siempre se activará

3.portador

Activado al arrastrar sobre ciertos elementos, solo se activará una vez

4.ondrop

Activado cuando el arrastre ha terminado

2. Caso curricular

1. Preparación de la página

Lo primero es preparar nuestra página.

inserte la descripción de la imagen aquí

2. Darse cuenta de la capacidad de arrastre de los elementos

Solo necesita escribir draggable="true" en el elemento que debe arrastrarse, y el elemento se encuentra en un estado arrastrable.

 <li draggable="true" class="colorRed item">前端开发</li>
<li draggable="true" class="colorBlue item">思想道德</li>
<li draggable="true" class="ColorGreen item">软件工程</li>

3. Realización de funciones

1. Bloquea el evento predeterminado

En este momento, descubrimos que cuando nos movíamos a elementos como div, table y td, el navegador nos bloqueaba de forma predeterminada.
En este momento usamos el método preventDefault() para evitar el evento predeterminado

// 拖拽事件,当拖拽到莫个元素之上时触发,会一直触发
    container.ondragover=(e)=>{
    
    
        // 由于默认是不能托到表格上面的,阻止默认行为
        e.preventDefault()
    }

2. Agregue un evento y modifique el estado del mouse para copiar

Aquí podemos usar eventos personalizados para marcar el elemento como arrastrable
inserte la descripción de la imagen aquí

// 拖拽事件,当拖拽开始时触发一次
  container.ondragstart=(e)=>{
    
    
    // 修改状态鼠标状态为复制
    e.dataTransfer.effectAllowed = e.target.dataset.state
    }

3. Darse cuenta de arrastrar a un cambio de color de fondo de elemento

Agregue un atributo personalizado a cada elemento td, para que se pueda distinguir de si se puede arrastrar al elemento.
inserte la descripción de la imagen aquí

// 拖拽到某个元素上清除前面所以加的元素
    function clearOverList(){
    
    
        document.querySelectorAll(".over").forEach((node)=>{
    
    
             node.classList.remove('over')
        })
    }
// 获得最外层元素节点
    function getNode(node){
    
    
        while(node){
    
    
            if(node.dataset.drop){
    
    
                return node
            }
            //获得父节点
            node = node.parentNode
        }
    }
// 拖拽事件,当拖拽到莫个元素之上时触发,只会触发一次
    container.ondragenter=(e)=>{
    
    
        clearOverList()
        const dropNode = getNode(e.target)
//    判断是否能够变色
        if( dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed){
    
    
        e.target.classList.add('over')
            
        }
    }

4. Realizar la función final

inserte la descripción de la imagen aquí

 // 拖拽事件,当结束拖拽的时候会触发一个元素
    container.ondrop = (e)=>{
    
    
        //清除样式
        clearOverList()
        const dropNode = getNode(e.target)
        if( dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed){
    
    
          if(dropNode.dataset.drop === 'copy'){
    
    
            dropNode.innerHTML = ''
            console.log(souce)
            // 深度复制
            const cloned =  souce.cloneNode(true)
            dropNode.appendChild(cloned)
          }
            
        }
    }

3. Todos los códigos

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>课程表</title>
    <style type="text/css">
        *{
    
    
            padding: 0;
            margin: 0;
        }
      #head {
    
    
        font-size: 26px;
        background-color: #5645bf;
        color: white;
      }
      .headerDate {
    
    
        background-color: #dcdcdc;
      }
      .colorYellow {
    
    
        background-color: yellow;
      }
      .colorBlue {
    
    
        background-color: #7ac5cd;
      }
      .colorRed {
    
    
        background-color: #cd5c5c;
      }
      .ColorGreen {
    
    
        background-color: #66cdaa;
      }
      .tongshi {
    
    
        background-color: #a15dd0;
      }
      table {
    
    
        border: 1px solid;
      }
      .box{
    
    
        margin: 20px auto;
      }
      .contLis{
    
    
        width: 100px;
        height: 680px;
        background-color: #dcdcdc;
        margin: 20px auto;
      }
      .item{
    
    
        width: 80px;
        text-align: center;
        line-height: 50px;
        height: 50px;
        list-style: none;
        margin: 10px auto;
      }
      table td{
    
    
        width: 80px;
      }
      .container{
    
    
        display: flex;
      }
      .over{
    
    
        background-color: #bebebe;
      }
      
    </style>
  </head>
  <body>
    <div class="container">
        <div class="contLis" data-drop="more">
            <ul>
                <li data-state="copy" draggable="true" class="colorRed item">前端开发</li>
                <li data-state="copy" draggable="true" class="colorBlue item">思想道德</li>
                <li data-state="copy" draggable="true" class="ColorGreen item">软件工程</li>
            </ul>
        </div>
        <table class="box" width="400px" height="680px">
          <thead>
            <tr class="headerDate">
              <th>10</th>
              <th><div class="item">周一</div></th>
              <th><div class="item">周二</div></th>
              <th><div class="item">周三</div></th>
              <th><div class="item">周四</div></th>
              <th><div class="item">周五</div></th>
              <th><div class="item">周六</div></th>
              <th><div class="item">周七</div></th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <th class="colorYellow">1</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
            </tr>
            <tr>
              <th class="colorYellow">2</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>    
            </tr>
            <tr>
              <th class="colorYellow">3</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
            </tr>
            <tr>
              <th class="colorYellow">4</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
            </tr>
            <tr>
              <th class="colorYellow">5</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
            </tr>
            <tr>
              <th class="colorYellow">6</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
            </tr>
            <tr>
              <th class="colorYellow">7</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy">
         
              </td>
            </tr>
            <tr>
              <th class="colorYellow">8</th>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
              <td data-drop="copy"></td>
            </tr>
          </tbody>
        </table>
    </div>
   
   <script>
    // 清除函数
    function clearOverList(){
    
    
        document.querySelectorAll(".over").forEach((node)=>{
    
    
             node.classList.remove('over')
        })
    }
    // 获得node节点
    function getNode(node){
    
    
        while(node){
    
    
            if(node.dataset.drop){
    
    
                return node
            }
            node = node.parentNode
        }
    }
    let souce = null;
    const container = document.querySelector('.container')
    // 拖拽事件,当拖拽开始时触发一次
    container.ondragstart=(e)=>{
    
    
        // 修改状态鼠标状态为复制
        e.dataTransfer.effectAllowed = e.target.dataset.state
        souce = e.target
        console.log(souce)
    }
    // 拖拽事件,当拖拽到莫个元素之上时触发,会一直触发
    container.ondragover=(e)=>{
    
    
        // 由于默认是不能托到表格上面的阻止默认行为
        e.preventDefault()
        // console.log(e.target)
    }
    // 拖拽事件,当拖拽到莫个元素之上时触发,只会触发一次
    container.ondragenter=(e)=>{
    
    
        clearOverList()
        const dropNode = getNode(e.target)
    //    判断是否能够变色
        if( dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed){
    
    
        e.target.classList.add('over')
            
        }
    }
    // 拖拽事件,当结束拖拽的时候会触发一个元素
    container.ondrop = (e)=>{
    
    
        clearOverList()
      
        const dropNode = getNode(e.target)

        if( dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed){
    
    
          if(dropNode.dataset.drop === 'copy'){
    
    
            dropNode.innerHTML = ''
            console.log(souce)
            // 深度复制
            const cloned =  souce.cloneNode(true)
            dropNode.appendChild(cloned)
          }
            
        }
    }
    
   </script>
  </body>
</html>

Resumir

Lo anterior es de lo que quiero hablar hoy. Este artículo solo presenta brevemente el uso de la API de arrastrar y soltar. Hemos dominado los métodos básicos de uso al escribir un caso simple.

Supongo que te gusta

Origin blog.csdn.net/m0_63831957/article/details/130714895
Recomendado
Clasificación