Sin entrar en demasiados detalles, tuve una img con vuelcos, es decir, mouseout/overs que establece el img src en valores de forma oculta (o esto podría haberlo hecho en un contexto diferente con variables gloabl). Utilicé algunos javascript para intercambiar mis valores de imagen over/out y llamé a FireEvent (ElementId, "mouseover"); para desencadenar el cambio. Mi javascript estaba ocultando/mostrando elementos en la página. Esto hizo que el cursor a veces estuviera sobre el img que utilicé para desencadenar el evento, que era el mismo que estaba intercambiando, y algunas veces el cursor no estaba sobre el img después del clic.
El mouseover/out no se dispara a menos que salga y vuelva a ingresar un elemento, por lo que después de que se activó el evento, el mouseover/out necesitaba "volver a disparar" para tener en cuenta la nueva posición del cursor. Aquí está mi solución. Después de que ocultar/mostrar varios elementos de página, y para hacer mi intercambio img src como se describe, llamo a la función RefreshMouseEvents (ElementId) en lugar de FireEvent (ElementId, "mouseover").
Esto funciona en IE9 (no estoy seguro acerca de otros navegadores).
function RefreshMouseEvents(ElementId)
{
FireEvent(ElementId, 'mouseover');
setTimeout("TriggerMouseEvent('" + ElementId + "')" , 1);
}
function TriggerMouseEvent(ElementId)
{
if(IsMouseOver(ElementId, event.clientX, event.clientY))
FireEvent(ElementId, 'mouseover');
else
FireEvent(ElementId, 'mouseout');
}
function IsMouseOver(ElementId, MouseXPos, MouseYPos)
{
if(document.getElementById(ElementId) != null)
{
var Element = document.getElementById(ElementId);
var Left = Element.getBoundingClientRect().left,
Top = Element.getBoundingClientRect().top,
Right = Element.getBoundingClientRect().right,
Bottom = Element.getBoundingClientRect().bottom;
return ((MouseXPos >= Left) && (MouseXPos <= Right) && (MouseYPos >= Top) && (MouseYPos <= Bottom))
}
else
return false;
}
function FireEvent(ElementId, EventName)
{
if(document.getElementById(ElementId) != null)
{
if(document.getElementById(ElementId).fireEvent)
{
document.getElementById(ElementId).fireEvent('on' + EventName);
}
else
{
var evObj = document.createEvent('Events');
evObj.initEvent(EventName, true, false);
document.getElementById(ElementId).dispatchEvent(evObj);
}
}
}
Puede utilizar jQuery se unen –
¿Has probado esto? El evento onmouseover _debería activarse en el evento principal también gracias a la propagación del evento. –
ok no pensé en eso, lo siento es un ejemplo un poco malo porque en mi aplicación no son elementos anidados. el div superior está absolutamente posicionado sobre varios otros elementos. – fearofawhackplanet