Antecedentes
Me encontré con esta pregunta mientras intentaba escribir pruebas automatizadas, para verificar que un cierto conjunto de elementos en una página determinada todos reciban algún conjunto de propiedades css establecidas por css para eventos de desplazamiento.
Si bien la respuesta anterior explica perfectamente por qué no es posible simplemente activar el evento de desplazamiento por JS y luego probar algún valor css de interés, responde la pregunta inicial "¿Cómo simulo un mouseover en JavaScript puro que activa el CSS" :flotar"?" sólo en parte.
Descargo de responsabilidad
Esta no es una solución eficaz. Lo usamos solo para pruebas automatizadas, donde el rendimiento no es una preocupación.
Solución
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();
}
}
Explicación
generateEvent lee todos los archivos css, reemplaza: hover con una cadena vacía y lo aplica. Esto tiene el efecto de que se aplican todos los estilos: hover. Ahora se puede probar un estilo aullado y volver al estado inicial deteniendo la simulación.
¿Por qué aplicamos el efecto de desplazamiento para todo el documento y no solo para el elemento de interés obteniendo el de las hojas y luego realizamos un element.css (...)?
Hecho así, el estilo se aplicaría en línea, esto anularía otros estilos, que podrían no ser anulados por el estilo de desplazamiento css original.
¿Cómo simularía ahora el desplazamiento para un solo elemento?
Esto no funciona, así que mejor no lo haga. Si debe hacerlo, puede verificar con element.is (selectorOfInterest) si el estilo se aplica a su elemento y solo usar esos estilos.
Ejemplo
En Jasmine puedes, por ejemplo, realizar ahora:
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");
});
});
:hover
estado de un elemento.