Heim  >  Artikel  >  Web-Frontend  >  HTML5-Drag-and-Drop-API-Implementierung des Beispielcodes für die Drag-and-Drop-Sortierung

HTML5-Drag-and-Drop-API-Implementierung des Beispielcodes für die Drag-and-Drop-Sortierung

黄舟
黄舟Original
2017-05-14 17:50:071709Durchsuche

HTML5 bietet eine direkte Drag-and-Drop-API, die es uns erheblich erleichtert, den Drag-and-Drop-Effekt zu erzielen. Wir müssen nicht viel schreiben js, wir müssen nur auf die Elemente hören. Das Drag-and-Drop-Ereignis kann verschiedene Drag-and-Drop-Funktionen realisieren.

Vorwort

HTML5 bietet eine direkte Drag-and-Drop-API, die uns das Erreichen des Drag-and-Drop-Effekts erheblich erleichtert Schreiben Sie einfach viele JS. Durch Abhören der Drag-and-Drop-Ereignisse von Elementen können verschiedene Drag-and-Drop-Funktionen implementiert werden.

Wenn Sie ein Element per Drag & Drop verschieben möchten, müssen Sie das ziehbare -Attribut des Elements auf „true“ setzen. Wenn dieses Attribut „false“ ist, ist Drag & Drop nicht zulässig. Sowohl für das img-Element als auch für das a-Element ist das Draggable-Attribut standardmäßig auf true gesetzt, sodass sie direkt per Drag & Drop verschoben werden können. Wenn Sie diese beiden Elemente nicht per Drag & Drop verschieben möchten, setzen Sie das Attribut einfach auf false.

Drag-and-Drop-Ereignisse

Drag-and-Drop-Ereignisse werden von verschiedenen Elementen generiert. Wenn ein Element per Drag-and-Drop verschoben wird, durchläuft es möglicherweise viele Elemente, bevor es schließlich das Element erreicht, das Sie platzieren möchten. Hier bezeichne ich das per Drag & Drop gezogene Element vorübergehend als Quell--Objekt , das übergebene Element als Prozessobjekt und das angekommene Element als Zielobjekt. Verschiedene Objekte erzeugen unterschiedliche Drag-and-Drop-Ereignisse.

Quellobjekt:

  1. Dragstart: Das Quellobjekt beginnt mit dem Ziehen und Ablegen.

  2. Ziehen: Während des Drag-and-Drop-Vorgangs des Quellobjekts.

  3. ZiehenEnde: Das Ziehen und Ablegen des Quellobjekts endet.

Prozessobjekt:

  1. dragenter: Das Quellobjekt beginnt, in den Bereich des Prozessobjekts einzutreten.

  2. Dragover: Das Quellobjekt bewegt sich innerhalb des Geltungsbereichs des Prozessobjekts.

  3. dragleave: Das Quellobjekt verlässt den Gültigkeitsbereich des Prozessobjekts.

Zielobjekt:

  1. Drop: Das Quellobjekt wird per Drag & Drop in das Zielobjekt gezogen.

<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>

dataTransfer-Objekt

Stellt ein Datenübertragungsobjekt dataTransfer in allen Drag-and-Drop-Ereignissen bereit, das für die Übertragung zwischen dem Quellobjekt und verwendet wird das Ziel Daten zwischen Objekten weitergeben. Als Nächstes lernen wir die Methoden und Eigenschaften dieses Objekts kennen, um zu verstehen, wie es Daten überträgt.

setData()

Diese Methode speichert Daten im dataTransfer-Objekt. Empfängt zwei Parameter. Der erste ist eine -Zeichenfolge , die den Typ der zu speichernden Daten angibt:

  1. text/plain: Text .

  2. text/html: HTML-Text.

  3. text/xml: XML-Text.

  4. text/uri-list: URL-Liste, jede URL ist eine Zeile.

Der zweite Parameter sind die zu speichernden Daten. Zum Beispiel:

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

getData()

Diese Methode liest Daten aus dem dataTransfer-Objekt. Der Parameter ist der in setData angegebene Datentyp. Zum Beispiel:

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

clearData()

Diese Methode löscht die im dataTransfer-Objekt gespeicherten Daten. Der Parameter ist optional und entspricht dem Datentyp. Wenn der Parameter leer ist, werden alle Datentypen gelöscht. Zum Beispiel:

event.dataTransfer.clearData();

setDragImage()

Diese Methode legt das Drag-and-Drop-Symbol mithilfe des img-Elements fest. Empfängt drei Parameter, der erste ist das Symbolelement, der zweite ist die X-Achsenverschiebung des Symbolelements vom Mauszeiger und der dritte ist die Y-Achsenverschiebung des Symbolelements vom Mauszeiger. Zum Beispiel:

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)

effectAllowed- und dropEffect-Attribute

Diese beiden Attribute werden kombiniert, um den visuellen Effekt von Drag & Drop festzulegen.

Es ist erwähnenswert: IE unterstützt keine dataTransfer-Objekte. Ja, es wird unabhängig von der IE-Version nicht unterstützt.

Drag-and-Drop-Sortierung implementieren

Die oben genannten Personen sind bereits mit der Verwendung der Drag-and-Drop-API vertraut. Lassen Sie uns ein einfaches Drag-and-Drop implementieren Sortieren, was auch in Projekten üblich ist. Lassen Sie uns zunächst die Idee klären:

  1. In einer Liste kann jedes Element per Drag-and-Drop verschoben werden. Setzen Sie daher zunächst das Draggable-Attribut für jedes Element auf „true“.

  2. Hören Sie sich das Dragstart-Ereignis jedes Elements an und formatieren Sie das Quellobjekt, um es zu unterscheiden.

  3. Hören Sie sich das Dragenter-Ereignis jedes Elements an. Wenn das Quellobjekt in das aktuelle Element eintritt, fügen Sie das Quellobjekt vor dem Element hinzu. Auf diese Weise werden die folgenden Elemente vom Quellobjekt verdrängt, wodurch ein Sortiereffekt erzielt wird.

  4. Aber Sie werden feststellen, dass das Quellobjekt nicht an letzter Stelle, sondern nur an vorletzter Stelle stehen kann. Zu diesem Zeitpunkt müssen Sie das Dragleave-Ereignis abhören. Wenn das Prozessobjekt das letzte Element ist, verlässt das Quellobjekt das Prozessobjekt und fügt dann das Quellobjekt am Ende hinzu.

Der Hauptcode lautet wie folgt:

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();}

Vollständige Codeadresse: Drag-Demo

Kompatibel mit

主要是在IE中的兼容不太好,不过至少在IE10中能兼容上面的拖动排序。

而且在我简单的试验中发现,就是在 IE 中元素不设置 height 的时候,不会触发 dragleave 事件。

更重要的一点是在 ios 和安卓上,完全不兼容。不过还好,有一个插件能让它在移动端完美兼容。  

插件地址:ios-html5-drag-drop-shim    

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

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

Das obige ist der detaillierte Inhalt vonHTML5-Drag-and-Drop-API-Implementierung des Beispielcodes für die Drag-and-Drop-Sortierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn