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.