2013-07-30 16 views
9

Mam prostą konstrukcję olii i chcę dodać do niej drag'n'drop. Dodatkowo chcę podświetlić element pozycji i dragover w różnych kolorach. Jest to jednak nietypowy błąd w WebKit.: Najedź myszą na element na przeciągnij i upuść

  1. Zrób ostatni przedmiot.
  2. Przeciągnij do góry.
  3. Upuść go do pierwszego elementu.

I ostatni element przechwytuje pseudoklaskę Hover! Czemu? Jak mogę temu zapobiec?

Hover bug

To jest przykład:

http://jsfiddle.net/zFk2V/3/

var lis = document.querySelectorAll("li"), 
    ol = document.querySelector("ol"), 
    dragged = false, 
    dragover = false; 
ol.addEventListener("drop", function(event) { 
    ol.insertBefore(dragged,dragover); 
    this.classList.remove("insistent"); 
}, false); 
for (var i=0, n = lis.length; i < n; i++) { 
    lis[i].addEventListener("dragstart", function(event) { 
     dragged = this; 
     ol.classList.add("insistent"); 
    }, false); 
    lis[i].addEventListener("dragover", function(event) { 
     if (dragover) { 
      dragover.classList.remove("dragover"); 
     } 
     event.preventDefault(); 
     dragover = this; 
     this.classList.add("dragover"); 
    }, false); 
} 
+0

Jaką przeglądarkę widzisz w szczególności? Jsfiddle nie łamie się dla mnie. – TimHayes

+0

Mam ten sam problem na krawędzi chrome (35.0.1916.153). Jest to denerwujące i musi być błędem. Nie jestem usatysfakcjonowany z używania JS do wykonywania zawisu, myślę, że jest bardziej chirurgiczne rozwiązanie. – SimplGy

Odpowiedz

4

Można po prostu dodać i funkcję .onmouseover.onmouseout i dodaj/usuń klasę o nazwie hovered zamiast używać CSS na :hover. Oto updated jsFiddle

Javascript by dodać (wewnątrz pętli for)

lis[i].onmouseover = function() { 
    // Adds the 'hovered' class 
    this.className = this.className + " hovered"; 
} 
lis[i].onmouseout = function() { 
    // Removes the 'hovered' class 
    this.className = this.className.split(' ').filter(function(v) { 
     return v!='hovered' 
    }).join(' '); 
} 

CSS nocie

.hovered { 
    background: #fc9; 
} 

Side: dodam id do ol jak id='dragableList' i zmienić linię var lis = document.querySelectorAll("li") do var lis = document.getElementById('dragableList').querySelectorAll("li") na wszelki wypadek, jeśli później będziesz miał inną listę w swoim projekcie. Here to jsFiddle z dołączonym

+0

Opierając się na tym rozwiązaniu, które po prostu zastępuje zachowanie css z zachowaniem JS, próbowałem wielu rzeczy, aby przeglądarka zauważyła, że ​​mysz faktycznie nie unosiła żadnego elementu, włączając w to wyzwalanie 'mouseleave' i innych zdarzeń, odczytywanie wysokości elementów do wywołać reflow i przełączyć klasę, która powinna mieć efekt wizualny. To jest błąd webkita, prawda? Jak to się dzieje po roku? – SimplGy

+0

@SimpleAsCouldBe Jestem ciekawy, dlaczego opierasz się działającemu rozwiązaniu tylko dlatego, że używa javascript ... Błąd jest błędem, wielu przeoczono –

+0

Przewiduję obniżenie wydajności z powiązaniem z 'mouseover',' mouseout' i modyfikacją klasy struktura dla każdego elementu listy. Moja aplikacja ma kilka typów list, które mają pewne zachowanie. Większość typów elementów listy w aplikacji reaguje na zawijanie css, niektóre mogą klikać, aby wybrać, a niektóre są "[przeciągalne]". ': hover' działa świetnie, jest prawdopodobnie najszybszy i nie wymaga czyszczenia zdarzeń. Dla mnie znacznie lepiej byłoby opróżnić błędne ': hover' niż nadpisać zachowanie css w/js na całym świecie. – SimplGy

0

Oto jak to rozwiązałem. Musiałem uciekać się do odrobiny JS niestety.

Moja strona zawiera zwinięte rekordy, które wyróżniają się po najechaniu myszą. Kliknięcie rekordu spowoduje jego rozwinięcie i wyłączenie podświetlania. Ponowne kliknięcie spowoduje ponowne zwijanie i wznawianie zawieszania:

$(document).on('click', ".container.clickable", function(e){ 
    var $this = $(this); 
    $this.toggleClass('expandable'); 
    if ($this.hasClass('expandable')) { 
    $this.on('mouseenter', function(){ 
     // workaround to stop a stuck :hover 
     $this.addClass('hilitable'); 
     $this.off('mouseenter'); 
    }) 
    } else { 
    $this.removeClass('hilitable'); 
    } 
}); 
+0

Doświadczyłem błędów w przeglądarce (niewyraźne niestandardowe granice SVG w FF 50.0.0), ale zdecydowanie nie zalecam łatania rzeczy na stronie: błąd przeglądarki musi zostać rozwiązany w przeglądarce. Zgłoszenie im błędu i umożliwienie mu naprawy dla wszystkich jest bardziej wydajne. – Xenos

Powiązane problemy