Neues Node.js-Buch
Alle Artikel

Drag&Drop-Beispiel in Firefox

Heute wies mich ein Leser darauf hin, dass es bei dem Drag&Drop-Beispiel aus Listing 12.43 (HTML) und Listing 12.44 (JavaScript) in Firefox Probleme gibt bzw. folgender Code so nicht funktioniert:

target.addEventListener('drop', function(event) {
    if(event.target.id === 'target') {
        // Funktioniert nicht in Firefox
        event.srcElement.innerHTML += event.dataTransfer.getData('text/html');
    }
    onLeave(event);
})

Der Grund dafür ist, dass die Eigenschaft srcElement eine proprietäre Eigenschaft des Internet Explorers ist und daher nicht von allen Browsern unterstützt wird. Stattdessen sollte (wie im übrigen Listing auch) die Eigenschaft target aus dem DOM Standard verwendet werden:

target.addEventListener('drop', function(event) {
    if(event.target.id === 'target') {
        // Funktioniert in Firefox und anderen Browsern
        event.target.innerHTML += event.dataTransfer.getData('text/html');
    }
    onLeave(event);
})

Alternativ lässt sich als Fallback für ältere Internet Explorer auch die Schreibweise event.target || event.srcElement verwenden.

target.addEventListener('drop', function(event) {
    let targetElement = event.target || event.srcElement;
    if(targetElement.id === 'target') {
        targetElement.innerHTML += event.dataTransfer.getData('text/html');
    }
    onLeave(event);
})

Konsequenterweise ist es dann sinnvoll, entsprechendes Konstrukt auch in den anderen Event-Listenern zu verwenden:

target.addEventListener('dragenter', function(event) {
    let targetElement = event.target || event.srcElement;
    targetElement.classList.add('dragover');
});
function onLeave(event) {
    let targetElement = event.target || event.srcElement;
    targetElement.classList.remove("dragover");
}

Merke

Die Eigenschaft srcElement ist nicht im DOM Standard definiert und sollte daher nicht bzw. wenn dann nur als Fallback in Produktivsystemen verwendet werden.