Próbowałem znaleźć kod do symulacji mouseover
w Chrome, ale mimo że detektor „najechania myszą” zostaje uruchomiony, deklaracja CSS „najechanie kursorem” nigdy nie jest ustawiona!
Próbowałem też zrobić:
//Called within mouseover listener
theElement.classList.add("hover");
Ale wydaje się, że nic nie zmienia elementu na to, co jest zadeklarowane w jego hover
deklaracji.
czy to możliwe?
javascript
jquery
css
Don Rhummy
źródło
źródło
:hover
stan na elemencie.Odpowiedzi:
Nie możesz. To nie jest zaufane wydarzenie .
Musisz dodać klasę i ręcznie dodać / usunąć ją przy zdarzeniach najechania myszą / myszy.
źródło
Możesz zasymulować zdarzenie najechania myszą w następujący sposób:
HTML
<div id="name">My Name</div>
JavaScript
var element = document.getElementById('name'); element.addEventListener('mouseover', function() { console.log('Event triggered'); }); var event = new MouseEvent('mouseover', { 'view': window, 'bubbles': true, 'cancelable': true }); element.dispatchEvent(event);
źródło
temp0.dispatchEvent(new MouseEvent('mouseover', {bubbles: true}))
Bardzo przydatne do stylizowania podpowiedzi lub innych treści, które pojawiają się tylko po najechaniu myszą.:hov
przycisk u góry inspektora stylów w devtools. Pozwala aktywować dowolną pseudoklasę na kontrolowanym elemencie.tło
Natknąłem się na to pytanie, próbując napisać testy automatyczne, aby sprawdzić, czy określony zestaw elementów na danej stronie, które wszystkie otrzymują, ma pewien zestaw właściwości css ustawionych przez css dla zdarzeń po najechaniu.
Chociaż powyższa odpowiedź doskonale wyjaśnia, dlaczego nie można po prostu wywołać zdarzenia najechania kursorem przez JS, a następnie sondować jakąś interesującą wartość css, odpowiada ona na wstępne pytanie „Jak zasymulować najechanie kursorem myszy w czystym JavaScript, który aktywuje CSS” :unosić się"?" tylko częściowo.
Zrzeczenie się
To nie jest wydajne rozwiązanie. Używamy go tylko do testów automatycznych, gdzie wydajność nie jest problemem.
Rozwiązanie
simulateCssEvent = function(type){ var id = 'simulatedStyle'; var generateEvent = function(selector){ var style = ""; for (var i in document.styleSheets) { var rules = document.styleSheets[i].cssRules; for (var r in rules) { if(rules[r].cssText && rules[r].selectorText){ if(rules[r].selectorText.indexOf(selector) > -1){ var regex = new RegExp(selector,"g") var text = rules[r].cssText.replace(regex,""); style += text+"\n"; } } } } $("head").append("<style id="+id+">"+style+"</style>"); }; var stopEvent = function(){ $("#"+id).remove(); }; switch(type) { case "hover": return generateEvent(":hover"); case "stop": return stopEvent(); } }
Wyjaśnienie
geneEvent odczytuje wszystkie pliki css,, zastępuje: hover pustym ciągiem znaków i stosuje go. W efekcie stosowane są style all: hover. Teraz można zbadać styl howered i wrócić do stanu początkowego, zatrzymując symulację.
Dlaczego stosujemy efekt najechania na cały dokument, a nie tylko na interesujący nas element, pobierając z arkuszy i wykonując element.css (...)?
W ten sposób styl zostałby zastosowany w tekście, co spowodowałoby zastąpienie innych stylów, które mogą nie zostać zastąpione przez oryginalny styl najechania css.
Jak mógłbym teraz zasymulować najechanie na pojedynczy element?
To nie jest wydajne, więc lepiej tego nie robić. Jeśli musisz, możesz sprawdzić za pomocą elementu element.is (selectorOfInterest), czy styl ma zastosowanie do twojego elementu i używać tylko tych stylów.
Przykład
W Jasmine możesz teraz np. Wykonać:
describe("Simulate CSS Event", function() { it("Simulate Link Hover", function () { expect($("a").css("text-decoration")).toBe("none"); simulateCssEvent('hover'); expect($("a").css("text-decoration")).toBe("underline"); simulateCssEvent('stop'); expect($("a").css("text-decoration")).toBe("none"); }); });
źródło
To, co zwykle robię w tym przypadku, to dodanie klasy za pomocą javascript .. i dołączenie tego samego
CSS
co:hover
do tej klasySpróbuj użyć
theElement.addEventListener('onmouseover', function(){ theElement.className += ' hovered' });
Lub w przypadku starszych przeglądarek:
theElement.onmouseover = function(){theElement.className += ' hovered'};
będziesz oczywiście musiał użyć,
onmouseout
aby usunąć klasę „najechaną” po opuszczeniu elementu ...źródło
attachEvent()
zostanie użyty (prawie) odpowiednik .addEventListener
i jest to najlepszy sposób na dołączanie zdarzeń, shimmingattachEvent
jest potrzebny tylko w IE8 (i niższych). Yotam, jeśli doda kolejną procedurę obsługionmouseover
przez bezpośrednie ustawienie atrybutu (zamiast dodawania detektora zdarzeń), nadpisuje aktualnie ustawione zdarzenie. Zobacz to pytanie na temat różnicy.Możesz użyć pseudo: styler , biblioteki, która może nakładać pseudoklasy CSS na elementy.
(async () => { let styler = new PseudoStyler(); await styler.loadDocumentStyles(); document.getElementById('button').addEventListener('click', () => { const element = document.getElementById('test') styler.toggleStyle(element, ':hover'); }) })();
Zastrzeżenie: jestem współautorem tej biblioteki. Zaprojektowaliśmy go tak, aby dodatkowo obsługiwał arkusze stylów z różnych źródeł, szczególnie do użytku w rozszerzeniach Chrome, w których prawdopodobnie brakuje kontroli nad regułami CSS strony.
źródło
window.getComputedStyle(<youElement>)
po ustawieniu pseudo stylu. Dzięki!Zakładam, że chcesz sprawdzić CSS po manipulacji w domenie, ale gdy tylko przesuniesz mysz z powrotem do devtools, zdarzenie nie jest już aktywne dla tego elementu html. Prawdopodobnie chciałbyś mieć opcję: hover w devtools dla zdarzeń javascript. To nie istnieje, ale możesz to zasymulować.
Ponieważ javascript jest wyłączony, nie ma szansy na ponowne zmodyfikowanie elementu (ów). Możesz przejść do devtools i sprawdzić css i html, tak jakbyś najechał kursorem, kliknął lub zrobił coś innego. Gdy skończysz, ponownie przejdź do panelu poleceń i wybierz opcję „włącz javascript”.
źródło
:hov
u góry inspektora stylów (obok pola wprowadzania „Filtr”) znajduje się przycisk. Kliknięcie:hov
rozszerza serię wyboru, każdy znakowany pseudoclass::active
,:focus
,:focus-within
,:hover
, i:visited
. Zaznaczenie któregokolwiek z tych pól aktywuje odpowiednią pseudoklasę na kontrolowanym elemencie.