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");
});
});
:hoverstan na elemencie.