Ich habe versucht, Code zu finden, der mouseover
in Chrome simuliert werden kann, aber obwohl der Listener "mouseover" ausgelöst wird, wird die CSS-Deklaration "hover" nie festgelegt!
Ich habe auch versucht:
//Called within mouseover listener
theElement.classList.add("hover");
Aber nichts scheint das Element an dem zu ändern, was in seiner hover
Deklaration deklariert ist .
Ist das möglich?
javascript
jquery
css
Don Rhummy
quelle
quelle
:hover
einem Element den Status aufzwingen .Antworten:
Das kannst du nicht. Es ist kein vertrauenswürdiges Ereignis .
Sie müssen eine Klasse hinzufügen und diese manuell zu den Mouseover- / Mouseout-Ereignissen hinzufügen / entfernen.
quelle
Sie können das Mouseover-Ereignis folgendermaßen simulieren:
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);
quelle
temp0.dispatchEvent(new MouseEvent('mouseover', {bubbles: true}))
sehr nützlich sein, um Tooltips oder andere Inhalte zu gestalten, die nur mit der Maus angezeigt werden.:hov
Schaltfläche oben im Stilinspektor in devtools überprüfen. Hiermit können Sie eine beliebige Pseudoklasse für das zu untersuchende Element aktivieren.Hintergrund
Ich bin auf diese Frage gestoßen, als ich versucht habe, automatisierte Tests zu schreiben, um zu überprüfen, ob ein bestimmter Satz von Elementen auf einer bestimmten Seite, die alle empfangen, die vom CSS für On-Hover-Ereignisse festgelegten CSS-Eigenschaften aufweist.
Während die obige Antwort perfekt erklärt, warum es nicht möglich ist, das Hover-Ereignis einfach durch JS auszulösen und dann einen CSS-Wert von Interesse zu prüfen, beantwortet sie die anfängliche Frage "Wie simuliere ich ein Mouseover in reinem JavaScript, das das CSS aktiviert?" :schweben"?" nur teilweise.
Haftungsausschluss
Dies ist keine performante Lösung. Wir verwenden es nur für automatisierte Tests, bei denen die Leistung keine Rolle spielt.
Lösung
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(); } }
Erläuterung
generateEvent liest alle CSS-Dateien, ersetzt: Hover durch eine leere Zeichenfolge und wendet sie an. Dies hat zur Folge, dass alle: Hover-Stile angewendet werden. Jetzt kann man nach einem verwöhnten Stil suchen und durch Stoppen der Simulation in den Ausgangszustand zurückkehren.
Warum wenden wir den Hover-Effekt für das gesamte Dokument und nicht nur für das interessierende Element an, indem wir den aus den Blättern abrufen und dann eine element.css (...) ausführen?
Wenn Sie dies tun, wird der Stil inline angewendet. Dies würde andere Stile überschreiben, die möglicherweise nicht vom ursprünglichen CSS-Hover-Stil überschrieben werden.
Wie würde ich jetzt den Schwebeflug für ein einzelnes Element simulieren?
Dies ist nicht performant, also besser nicht. Wenn Sie müssen, können Sie mit element.is (selectorOfInterest) prüfen, ob der Stil für Ihr Element gilt, und nur diese Stile verwenden.
Beispiel
In Jasmine können Sie zB jetzt Folgendes ausführen:
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"); }); });
quelle
Was ich in der Regel in diesem Fall zu tun ist das Hinzufügen einer Klasse mit Hilfe von Javascript .. und Anbringen der gleichen
CSS
wie die:hover
für diese KlasseVersuchen Sie es mit
theElement.addEventListener('onmouseover', function(){ theElement.className += ' hovered' });
Oder für ältere Browser:
theElement.onmouseover = function(){theElement.className += ' hovered'};
Sie müssen natürlich verwenden
onmouseout
, um die "schwebende" Klasse zu entfernen, wenn Sie das Element verlassen ...quelle
attachEvent()
verwendet.addEventListener
und es ist der beste Weg, Ereignisse anzuhängen. ShimmingattachEvent
ist nur in IE8 (und darunter) erforderlich. Yotam, wenn er einen weiteren Handler hinzufügt,onmouseover
indem er das Attribut direkt setzt (anstatt den Ereignis-Listener hinzuzufügen), wird das aktuell eingestellte Ereignis überschrieben. Siehe diese Frage zum Unterschied.Sie können pseudo: styler verwenden , eine Bibliothek, die CSS-Pseudoklassen auf Elemente anwenden kann.
(async () => { let styler = new PseudoStyler(); await styler.loadDocumentStyles(); document.getElementById('button').addEventListener('click', () => { const element = document.getElementById('test') styler.toggleStyle(element, ':hover'); }) })();
Haftungsausschluss: Ich bin Mitautor dieser Bibliothek. Wir haben es so konzipiert, dass es zusätzlich originalübergreifende Stylesheets unterstützt, insbesondere für die Verwendung in Chrome-Erweiterungen, bei denen Sie wahrscheinlich keine Kontrolle über die CSS-Regeln der Seite haben.
quelle
window.getComputedStyle(<youElement>)
dem Pseudo-Stil kombiniert wird . Vielen Dank!Ich gehe davon aus, dass Sie das CSS nach der Dom-Manipulation überprüfen möchten, aber sobald Sie Ihre Maus zurück zu den devtools bewegen, ist das Ereignis für dieses HTML-Element nicht mehr aktiv. Sie möchten wahrscheinlich so etwas wie die Option: hover in devtools für Ihre Javascript-Ereignisse haben. Das gibt es nicht, aber Sie können es simulieren.
Da Javascript deaktiviert ist, besteht keine Möglichkeit, die Elemente wieder zu ändern. Sie können zu den Devtools gehen und CSS und HTML überprüfen, als ob Sie schweben, klicken oder etwas anderes damit machen würden. Wenn Sie fertig sind, rufen Sie erneut das Befehlsfeld auf und wählen Sie "Javascript aktivieren".
quelle
:hov
Schaltfläche (neben dem Eingabefeld "Filter"). Durch Klicken:hov
erweitert eine Reihe von Kontrollkästchen, die jeweils mit einer Pseudo gekennzeichnet::active
,:focus
,:focus-within
,:hover
, und:visited
. Wenn Sie eines dieser Kontrollkästchen aktivieren, wird die entsprechende Pseudoklasse für das zu untersuchende Element aktiviert.