Nie wdając się w zbyt wiele szczegółów, miałem img z najazdów, tj. mouseout/overs, które ustawiają img src na ukryte wartości formularzy (lub może to zrobić w innym kontekście ze zmiennymi gloabl). Użyłem trochę javascript do zamiany obu moich wartości obrazu over/out i zadzwoniłem do Call FireEvent (ElementId, "mouseover"); aby wywołać zmianę. Mój javascript ukrywał/wyświetlał elementy na stronie. To spowodowało, że kursor czasami był nad obrazem, którego użyłem do wywołania zdarzenia - który był taki sam jak ten, który wymieniłem, a czasami kursor nie był nad obrazem po kliknięciu.
Mysz/wyjście nie uruchamia się, dopóki nie wyjdziesz i nie wrócisz do elementu, więc po uruchomieniu mojego zdarzenia, przesunięcie kursora na mysz wymaga "ponownego uruchomienia" w celu uwzględnienia nowej pozycji kursora. Oto moje rozwiązanie. Po ukryciu/wyświetleniu różnych elementów strony i wykonaniu zamiany img src zgodnie z opisem, wywołuję funkcję RefreshMouseEvents (ElementId) zamiast FireEvent (ElementId, "mouseover").
Działa to w IE9 (nie mam pewności co do innych przeglądarek).
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);
}
}
}
Można użyć jQuery wiążą –
Próbował pan jest? Zdarzenie onmouseover _should_ powinno wywołać zdarzenie nadrzędne również dzięki propagacji zdarzeń. –
ok, nie myślałem o tym, przykro mi, to jest zły przykład, ponieważ w mojej aplikacji nie są to elementy zagnieżdżone. górny div jest bezwzględnie umieszczony nad wieloma innymi elementami. – fearofawhackplanet