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");
});
});
:hovereinem Element den Status aufzwingen .