7 Stimmen

Browser-"Drag and Drop"-Ereignisse: Kann jemand die Lücken ausfüllen?

Bis jetzt hatte ich noch nie das Bedürfnis, irgendwelche Ziehfunktionen zu verwenden, also möchte ich Ihnen erzählen, was ich bisher entdeckt habe:

  • Ziehereignisse sind Ereignisse, die auftreten, wenn der Benutzer ein Objekt zieht. Dies ist "richtiges" OS-Ziehen, z.B.: Hiliting eines Textes und Ziehen desselben, oder sogar das Ziehen von etwas von außerhalb des Browsers.
  • Während des Ziehens werden, soweit ich das beurteilen kann, keine anderen Browser-Ereignisse ausgelöst. (onmouseover wird zum Beispiel ignoriert). Die einzigen Ereignisse, die funktionieren, sind Ziehereignisse.
  • In allen modernen Browsern scheinen onDragEnter und onDragOver zu funktionieren... aber in Firefox fehlt "onDragLeave".
  • Zum Ablegen verwendet FF "onDragDrop", während IE und andere "onDrop" verwenden, während Safari dies nicht zu unterstützen scheint.
  • Ereignisse scheinen nur bei "abwerfbaren" Elementen wie Textarea und Text zu funktionieren. Bei anderen Elementen nur einige Veranstaltungen arbeiten.
  • Verschiedene andere Macken für jeden Browser, die ich nicht einmal aufzählen möchte.
  • Über diese Ereignisse gibt es nur sehr wenige Unterlagen.

Ja, ich muss tatsächlich Drag+Drop verwenden und nicht simulieren können.

Meine Fragen:

  • Gibt es eine Möglichkeit, "ondragleave" oder ähnliches in FF zu erkennen?
  • Gibt es eine Möglichkeit, "ondragdrop" oder ähnliches in Safari zu erkennen?
  • Haben Sie etwas über Drag + Drop hinzuzufügen?

Hier ist eine schnelle und schmutzige Vorlage, die Drag-and-Drop-Ereignisse demonstriert:

<script>
    addEvent = function(obj, eventname, fn){
        if (document.addEventListener) obj.addEventListener(eventname, fn, false);
        else obj.attachEvent('on'+eventname, fn);
    }

    window.onload = function(){
        var logger = document.getElementById("logger");
        var log = function(str){ logger.value = str + logger.value; }

        //log a variety of drag events for the textarea
        var obj = document.getElementById("tarea");
        var events = ["dragenter","dragover","dragout","dragleave","dragdrop","drop"];
        for (var i=0; i<events.length; i++){
            (function(event){//create a closure to remove variable scope
                addEvent(obj, event, function(){ log("textarea: " + event + "\n"); });
            })(events[i]);
        }

        //log events on the div
        obj = document.getElementById("div");
        events = ["mouseover","mouseout","mouseup","mousedown","click","dblclick",
                "dragenter","dragover","dragout","dragleave","dragdrop","drop"];
        for (var i=0; i<events.length; i++){
            (function(event){//create a closure to remove variable scope
                addEvent(obj, event, function(){ log("div: " + event + "\n"); });
            })(events[i]);
        }
    }
</script>
Life's a drag when doing cross browser stuff.<br><br>
<div id="div" style="width: 100px; height: 100px; background: green; float: left;">
</div>
<textarea id="tarea" style="width: 100px; height: 100px; float: left; margin: 0px 5px;">
</textarea>

<textarea id="logger" style="width: 200px; height: 400px; float: left;">
</textarea>

6voto

sam Punkte 21993

Ich habe einen Weg gefunden, onDragLeave über Ereignisdelegation zu behandeln.

Fügen Sie einfach ein Ereignis hinzu, um das "Dragover" auf dem gesamten Dokument zu überwachen. Wenn die Ereignisquelle das betreffende Element wird, setzen Sie eine Markierung, und sobald die Ereignisquelle nicht mehr dieses Element ist, lösen Sie das Ereignis "dragleave" aus.

Nota:

  • Wird geändert werden müssen, so dass "e.source==obj" eigentlich "obj.childOf(e.source)" ist ... da das Quellelement ein Nachkomme des fraglichen Objekts sein kann.
  • Erfordert, dass das Ereignisbehandlungs-Framework herausfindet, was die "Quelle" je nach Browser ist.

Leider sieht es so aus, als ob das Fehlen von "ondrop" in Safari nicht behoben werden kann... es wird einfach nie ausgelöst.

Wie erreicht man "dragleave" in FF (na ja, in allen Browsern):

var setOnDragLeave = function(obj, fn){
    var on=false;
    var dragover = function(e){
        if (on){
            if (e.source!=obj){
                on = false;
                e.eventname = "dragleave";
                fn.call(obj, e);
            }
            return;
        }else{
            if (e.source==obj) on = true;
            return;
        }
    }
    addEvent(document.documentElement, "dragover", dragover);
}
setOnDragLeave(obj, function(e){ logEvent(e); });

Ich hoffe aufrichtig, dass jemand anderes auf diesem Planeten dies nutzen kann...

0voto

Schöner Artikel. Auch ich bin auf der Suche nach einer Entsprechung von ondrop/ondragdrop in Safari. Es gibt jedoch einen möglichen Workaround für den "internen" Drag-Drop-Fall, d. h. die Drag-Quelle und das Drop-Ziel befinden sich im selben Dokument.

Der IE unterstützt die Ereignisse "ondragstart", "ondrag" und "ondragend" für das Element der Ziehquelle. Safari 3 löst diese Ereignisse ebenfalls aus. Firefox3 löst ondrag und ondragend aus, aber nicht ondragstart (obwohl die Dokumentation darauf hindeutet, dass es das sollte). Wie auch immer, je nach Szenario können Sie ondragend verwenden, um zu erkennen, wann der Drag-Drop-Vorgang abgeschlossen ist.

0voto

Firefox implementiert das Ereignis "dragleave" als "dragexit", so scheint es. Ich habe das jetzt erst gelernt. Und es funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X