Edytuj: Jest teraz naprawiony w Chrome 72!

Jsfiddle: https://jsfiddle.net/r8wxpujg/1/

Na każdej kompletnej operacji przeciągnij i upuść, spodziewam się zdarzenia dragstart i dragend, aby zostać zwolnionym na przeciągnięciu elementu. Demo powiązane z powyższym pokazuje ten efekt, licząc imprezy dragstart i dragend. Gdy obraz jest przemieszczany przez operacje przeciągania i kropli dragstart i dragend ogień zdarzenia i przyrosty licznika zgodnie z oczekiwaniami. Po kliknięciu przycisku, aby zamiast przesunąć obraz wokół, zamiast tego przesuwa się iframe Licznik przestaje zwiększyć, co wskazuje, że wydarzenie dragend nigdy nie jest zwolnione.

W jakiś sposób w chromie, poruszanie się z iframe w Domu anuluje zdarzenie dragend od wystrzelenia.

Przetestowałem to w Firefoksie i IE11, a obie mają oczekiwane zachowanie podczas przenoszenia iframe s.

Badałem to przez kilka dni i nie mogłem znaleźć żadnych informacji, więc chciałem zapytać, czy ktoś wpadnie do tego przed lub jeśli ktoś ma rozwiązanie. Czy to może być błąd w Chrome? Albo właśnie coś brakuje.

Edytuj : Jest to potwierdzony błąd w chromu, raport błędów można znaleźć tutaj: https://bugs.chromium.org/p/chromium/issues/detail?id=737691.

Patrz poniżej odpowiedź Pawła, aby obejść, aż problem zostanie naprawiony.

8
z2oh 26 czerwiec 2017, 19:30

3 odpowiedzi

Najlepsza odpowiedź

Jest to naprawione teraz w Chrome 72.

1
David Spiess 30 styczeń 2019, 08:56

Obejście, które kiedyś użyłem, zamiast słuchać wydarzenia dragEnd, słuchałem imprezy {X1}}, która służyła odpowiednio moimi potrzebami, choć może nie działać dla wszystkich.

0
jenming 17 sierpień 2017, 23:36

Zgadzam się, że jest to Chrome Bug I nie mieć rozwiązanie tego. Ale w niektórych przypadkach możesz pracować wokół błędu, opóźniając ruch IFrame, dopóki zdarzenia przeciągania. Działa w Ten widelec twoich skrzypce. Wystarczy zastąpić

if(element.id === 'div1drag') {
    document.getElementById('div1').appendChild(item);
}
else if(element.id === 'div2drag') {
    document.getElementById('div2').appendChild(item);
}

Z tym

if(element.id === 'div1drag') {
    window.setTimeout(function() {
        document.getElementById('div1').appendChild(item);
    }, 0)
}
else if(element.id === 'div2drag') {
    window.setTimeout(function() {
        document.getElementById('div2').appendChild(item);
    }, 0)
}

Również dzięki za zgłoszenie tego błędu. Dzisiaj jadł mnie do szału.

5
Paul 7 sierpień 2017, 23:01