2010-02-09 14 views
18

Czy istnieje sposób programowego wywołania zdarzenia onmouseover w zwykłym kodzie JavaScript? lub "wyodrębnić" metodę ze zdarzenia onmouseover, aby wywołać ją bezpośrednio?Zdarzenie wyzwalacza onmouseover programowo w kodzie JavaScript

np

<div id="bottom-div" onmouseover="myFunction('some param specific to bottom-div');"> 
    <div id="top-div" onmouseover="????????"></div> 
</div> 

najwyższego div jest powyżej dolnej div, więc onmouseover nie zostanie zwolniony w dolnej div. Potrzebuję sposób nazywając myFunction('some param specific to bottom-div'); od górnej div

+0

Można użyć jQuery wiążą –

+2

Próbował pan jest? Zdarzenie onmouseover _should_ powinno wywołać zdarzenie nadrzędne również dzięki propagacji zdarzeń. –

+0

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

Odpowiedz

-3

Można by zrobić to tak:

document.getElementById('top-div').onmouseover(); 

Jednakże, jak wspomniano w komentarzach, warto byłoby rozważyć testowanie przed problemem.

+0

Nie zdawałem sobie sprawy, że to takie proste! Jestem pewien, że próbowałem wcześniej zrobić podobne z onclick i to nie działa. może moja pamięć jest zła. – fearofawhackplanet

+2

Nie jestem pewien, czy to zadziałało, ale uważam, że powinno być przynajmniej bez prefiksu "on". –

+13

Nie działa "Uncaught TypeError: e.previousElementSibling.onmouseover nie jest funkcją (...)' – Green

1
​<a href="index.html" onmouseover="javascript:alert(0);" id="help"​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​>help</a>​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

​document.getElementById('help').onmouseover();​​​​​​​ 
2

muszę zrobić coś podobnego, ale używam jQuery i uważam, że jest to lepsze rozwiązanie: funkcja wyzwalania

użyć jQuery za.

$j('#top-div').trigger('mouseenter'); 

Jeśli chcesz, możesz również dodać do niego parametry. Zobacz jQuery documentation on .trigger.

+1

Uważam za zabawne, gdy ludzie w dół głosują na odpowiedź i nie mówią sposób. Tak więc każdemu, kto nie głosował za moją odpowiedzią, proszę wyjaśnij, dlaczego mogę nauczyć się czegoś nowego. Nie sugeruję, że moja odpowiedź jest najlepsza, ale to zadziałało. Jeśli napotkasz na problem, dodaj komentarz, abyśmy mogli dowiedzieć się, dlaczego lub jeszcze lepiej, aby móc poprawić moją odpowiedź. – thephatp

24

To zadziałało dla mnie przynajmniej w IE9. Powinny być kompatybilne z różnymi przeglądarkami lub blisko niego ...

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); 
     } 
    } 
} 

Na przykład onmouseover, wywołać funkcję takiego

FireEvent(ElementId, "mouseover"); 
+4

Co jest warte, "initEvent" jest przestarzałe i nie należy polegać na MDN https://developer.mozilla.org/en-US/docs/Web/API/Event/initEvent .. i przykład, który mógłby być w powyższym bloku 'else' jest:' var event = new MouseEvent (EventName, {'view': window, 'bubbles': true, 'cancelable': true}); document.getElementById (ElementId) .dispatchEvent (event); ' – jamez14

6

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); 
     } 
    } 
} 
+0

Nie używaj setTimeout jako eval! Zamiast tego użyj 'Function.prototype.bind'. –

5

Musiałem zmienić mój zestaw funkcji RefreshMouseEvents po kolejnych testach. Oto wersja pozornie dopracowane (znowu tylko przetestowane IE9):

function RefreshMouseEvents(ElementId) 
{ 
    FireEvent(ElementId, 'mouseover'); 
    setTimeout("TriggerMouseEvent('" + ElementId + "', '" + event.clientX + "', '" + event.clientY + "')", 1); 
} 

function TriggerMouseEvent(ElementId, MouseXPos, MouseYPos) 
{ 
    if(IsMouseOver(ElementId, (1*MouseXPos), (1*MouseYPos))) 
     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); 
     } 
    } 
} 
Powiązane problemy