Maison  >  Article  >  interface Web  >  Tutoriel HTML5 pour implémenter le tri par glisser-déposer via l'API

Tutoriel HTML5 pour implémenter le tri par glisser-déposer via l'API

巴扎黑
巴扎黑original
2017-08-08 16:27:501470parcourir

HTML5 fournit une API de glisser-déposer direct, ce qui nous facilite grandement la réalisation d'effets de glisser-déposer. Nous n'avons pas besoin d'écrire beaucoup de js. Il nous suffit d'écouter le glisser-déposer. événements d'éléments pour réaliser diverses fonctions de glisser-déposer.

Avant-propos

HTML5 fournit une API de glisser-déposer direct, ce qui nous facilite grandement l'obtention de l'effet glisser-déposer. écrivez beaucoup de js, juste Diverses fonctions de glisser-déposer peuvent être implémentées en écoutant les événements glisser-déposer des éléments.

Si vous souhaitez glisser et déposer un élément, vous devez définir l'attribut draggable de l'élément sur true. Lorsque l'attribut est faux, le glisser-déposer ne sera pas autorisé. L'élément img et l'élément a ont tous deux l'attribut draggable défini sur true par défaut, ils peuvent donc être glissés et déposés directement. Si vous ne souhaitez pas glisser-déposer ces deux éléments, définissez simplement l'attribut sur false.

Les événements glisser-déposer

Les événements glisser-déposer sont générés par différents éléments. Lorsqu'un élément est glissé et déposé, il peut traverser de nombreux éléments avant d'atteindre finalement l'élément que vous souhaitez placer. Ici, j'appelle temporairement l'élément glissé l'objet source, l'élément passé l'objet de processus et l'élément arrivé l'objet cible. Différents objets génèrent différents événements de glisser-déposer.

Objet source :

  1. dragstart : L'objet source commence à glisser-déposer.

  2. glisser : pendant le processus de glisser-déposer de l'objet source.

  3. dragend : Le glisser-déposer de l'objet source se termine.

Objet de processus :

  1. dragenter : L'objet source commence à entrer dans la portée de l'objet de processus.

  2. dragover : L'objet source se déplace dans la portée de l'objet processus.

  3. dragleave : L'objet source quitte la portée de l'objet processus.

Objet cible :

  1. drop : L'objet source est glissé et déposé dans l'objet cible.


<p id="source" draggable="true">a元素</p>
<p id="process">b元素</p>
<p id="target">c元素</p>

<script>
    var source = document.getElementById(&#39;source&#39;),     // a元素
        process = document.getElementById(&#39;process&#39;),   // b元素
        target = document.getElementById(&#39;target&#39;);     // c元素
    
    source.addEventListener(&#39;dragstart&#39;,function(ev){   // dragstart事件由a元素产生
        console.log(&#39;a元素开始被拖动&#39;);
    },false)

    process.addEventListener(&#39;dragenter&#39;,function(ev){  // dragenter事件由b元素产生
        console.log(&#39;a元素开始进入b元素&#39;);
    },false)
    process.addEventListener(&#39;dragleave&#39;,function(ev){  // dragleave事件由b元素产生
        console.log(&#39;a元素离开b元素&#39;);
    },false)

    target.addEventListener(&#39;drop&#39;,function(ev){        // drop事件由c元素产生
        console.log(&#39;a元素拖放到c元素了&#39;);
        ev.preventDefault();
    },false)
    document.ondragover = function(e){e.preventDefault();}
</script>

objet dataTransfer

Fournit un objet de transfert de données dans tous les événements de glisser-déposer dataTransfer , utilisé pour transférer des données entre les objets source et les objets cible. Voyons ensuite les méthodes et les propriétés de cet objet pour comprendre comment il transfère les données.

setData()

Cette méthode stocke les données dans l'objet dataTransfer. Reçoit deux paramètres. Le premier est une chaîne indiquant le type de données à stocker. Actuellement, les types suivants sont pris en charge :

  1. text/plain : texte texte.

  2. text/html : texte HTML.

  3. text/xml : texte XML.

  4. text/uri-list : liste d'URL, chaque URL est une ligne.

Le deuxième paramètre est les données à stocker. Par exemple :


event.dataTransfer.setData(&#39;text/plain&#39;,&#39;Hello World&#39;);

getData()

Cette méthode lit les données de l'objet dataTransfer. Le paramètre est le type de données spécifié dans setData. Par exemple :


event.dataTransfer.getData(&#39;text/plain&#39;);

clearData()

Cette méthode efface les données stockées dans l'objet dataTransfer. Le paramètre est facultatif et correspond au type de données. Si le paramètre est vide, tous les types de données seront effacés. Par exemple :


event.dataTransfer.clearData();

setDragImage()

Cette méthode définit l'icône glisser-déposer à l'aide de l'élément img. Reçoit trois paramètres, le premier est l'élément icône, le second est le déplacement sur l'axe X de l'élément icône à partir du pointeur de la souris et le troisième est le déplacement sur l'axe Y de l'élément icône à partir du pointeur de la souris. Par exemple :


var source = document.getElementById(&#39;source&#39;),
    icon = document.createElement(&#39;img&#39;);

icon.src = &#39;img.png&#39;;

source.addEventListener(&#39;dragstart&#39;,function(ev){
    ev.dataTransfer.setDragImage(icon,-10,-10)
},false)

propriétés effectAllowed et dropEffect

Ces deux propriétés sont combinées pour définir l'effet visuel du glisser et baisse.

Il convient de noter : IE ne prend pas en charge les objets dataTransfer. Oui, il n'est pas pris en charge quelle que soit la version d'IE.

Implémenter le tri par glisser-déposer

Les personnes ci-dessus sont déjà familiarisées avec l'utilisation de l'API par glisser-déposer. Implémentons un simple glisser-déposer. le tri, qui est également plus courant dans les projets. Voyons d'abord l'idée :

  1. Dans une liste, chaque élément peut être glissé et déposé. Ensuite, vous devez d'abord définir l'attribut draggable sur true pour chaque élément.

  2. Écoutez l'événement dragstart de chaque élément et stylisez l'objet source pour le distinguer.

  3. Écoutez l'événement dragenter de chaque élément. Lorsque l'objet source entre dans l'élément actuel, ajoutez l'objet source avant l'élément. De cette façon, les éléments suivants seront évincés par l'objet source, obtenant ainsi un effet de tri.

  4. Mais vous constaterez que l'objet source ne peut pas être classé en dernier, mais ne peut être classé qu'en avant-dernier. À ce stade, vous devez écouter l'événement dragleave. Lorsque l'objet de processus est le dernier élément, l'objet source quitte l'objet de processus, puis l'objet source est ajouté à la fin.

Le code principal est le suivant :


var source = document.querySelectorAll(&#39;.list&#39;),
    dragElement = null;

for(var i = 0; i < source.length; i++){
    source[i].addEventListener(&#39;dragstart&#39;,function(ev){
        dragElement = this;
    },false);

    source[i].addEventListener(&#39;dragenter&#39;, function(ev){
        if(dragElement != this){
            this.parentNode.insertBefore(dragElement,this);
        }
    }, false)

    source[i].addEventListener(&#39;dragleave&#39;, function(ev){
        if(dragElement != this){
            if(this == this.parentNode.lastElementChild || this == this.parentNode.lastChild){
                this.parentNode.appendChild(dragElement);
            }
        }
    }, false)
};

document.ondragover = function(e){e.preventDefault();}
document.ondrop = function(e){e.preventDefault();}

Adresse complète du code : drag-demo

Compatible

Principalement parce que la compatibilité dans IE n'est pas très bonne, mais au moins elle est compatible avec le tri par glisser-déposer ci-dessus dans IE10.

Et dans mon expérience simple, j'ai découvert que lorsque la hauteur de l'élément n'est pas définie dans IE, l'événement dragleave ne sera pas déclenché.

Le point le plus important est qu'ils sont totalement incompatibles sur iOS et Android. Heureusement, il existe un plug-in qui le rend parfaitement compatible avec les appareils mobiles.

Adresse du plug-in : ios-html5-drag-drop-shim

只需要在原有的代码中引入该插件,即可在移动端上实现拖动了。


<script>
var iosDragDropShim = { enableEnterLeave: true }
</script>
<script src="vendor/ios-drag-drop.js"></script>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn