He estado tratando de encontrar código para simular mouseover
en Chrome, pero aunque el oyente "mouseover" se activa, la declaración CSS "hover" nunca se establece.
Intenté también hacer:
//Called within mouseover listener
theElement.classList.add("hover");
Pero nada parece cambiar el elemento a lo que se declara en su hover
declaración.
es posible?
javascript
jquery
css
Don Rhummy
fuente
fuente
:hover
estado de un elemento.Respuestas:
No puedes. No es un evento confiable .
Tienes que agregar una clase y agregar / eliminar eso en los eventos de mouseover / mouseout manualmente.
fuente
Puede simular el evento de mouseover como este:
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);
fuente
temp0.dispatchEvent(new MouseEvent('mouseover', {bubbles: true}))
Muy útil para diseñar información sobre herramientas u otro contenido que solo aparece al pasar el mouse.:hov
botón en la parte superior del inspector de estilo en devtools. Le permite activar cualquier pseudoclase que desee en el elemento que se está inspeccionando.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"); }); });
fuente
Lo que suelo hacer en este caso es agregar una clase usando javascript ... y adjuntar lo mismo
CSS
que:hover
a esta claseIntenta usar
theElement.addEventListener('onmouseover', function(){ theElement.className += ' hovered' });
O para navegadores más antiguos:
theElement.onmouseover = function(){theElement.className += ' hovered'};
por supuesto, tendrá que usar
onmouseout
para eliminar la clase "flotante" cuando deje el elemento ...fuente
attachEvent()
se usaría el (casi) equivalente .addEventListener
y es la mejor manera de adjuntar eventos, el shimmingattachEvent
solo es necesario en IE8 (y más abajo). Yotam, si agrega otro controlador aonmouseover
estableciendo el atributo directamente (en lugar de agregar el detector de eventos), anulará el evento configurado actualmente. Vea esta pregunta sobre la diferencia.Puede usar pseudo: styler , una biblioteca que puede aplicar pseudoclases CSS a elementos.
(async () => { let styler = new PseudoStyler(); await styler.loadDocumentStyles(); document.getElementById('button').addEventListener('click', () => { const element = document.getElementById('test') styler.toggleStyle(element, ':hover'); }) })();
Descargo de responsabilidad: soy coautor de esta biblioteca. Lo diseñamos para admitir adicionalmente hojas de estilo de origen cruzado, específicamente para su uso en extensiones de Chrome donde es probable que no tenga control sobre las reglas CSS de la página.
fuente
window.getComputedStyle(<youElement>)
después de establecer el pseudo estilo. ¡Gracias!Supongo que desea inspeccionar el CSS después de la manipulación de dom, pero tan pronto como mueva el mouse de regreso a devtools, el evento ya no está activo en ese elemento html. Probablemente le gustaría tener algo como la opción: hover en devtools para sus eventos javascript. Eso no existe, pero puedes simularlo.
Dado que JavaScript está deshabilitado, no tiene la oportunidad de volver a modificar los elementos. Puede ir a devtools e inspeccionar css y html como si estuviera flotando, haciendo clic o haciendo otra cosa con él. Una vez que haya terminado, vaya al panel de comandos nuevamente y seleccione 'habilitar javascript'.
fuente
:hov
botón en la parte superior del inspector de estilo (junto al cuadro de entrada "Filtro"). Al hacer clic:hov
se expande una serie de casillas de verificación, cada uno marcado con un pseudoclass::active
,:focus
,:focus-within
,:hover
, y:visited
. Y al marcar cualquiera de estas casillas, se activa su respectiva pseudoclase en el elemento que se está inspeccionando.