Не вдаваясь в подробности, у меня было img с ролловерами, то есть mouseout / overs, которые устанавливали для img src значения скрытой формы (или это могло бы быть сделано в другом контексте с переменными gloabl). Я использовал некоторый javascript, чтобы поменять оба моих значения изображения over / out, и я назвал так называемый FireEvent (ElementId, "mouseover"); чтобы вызвать изменение. Мой javascript скрывал / отображал элементы на странице. Это приводило к тому, что курсор иногда оказывался над изображением, которое я использовал для запуска события - которое было таким же, как тот, который я обменивал, и иногда курсор не был над изображением после щелчка.
Mouseover / out не срабатывает, если вы не выходите и не вводите элемент заново, поэтому после того, как мое событие было запущено, mouseover / out требовало «повторного запуска», чтобы учесть новую позицию курсора. Вот мое решение. После того, как я скрываю / отображаю различные элементы страницы и выполняю обмен img src, как описано, я вызываю функцию RefreshMouseEvents (ElementId) вместо FireEvent (ElementId, "mouseover").
Это работает в IE9 (не уверен в других браузерах).
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 );
}
}
}