Trigger onmouseover event programmatically in JavaScript

前端 未结 8 682
庸人自扰
庸人自扰 2020-11-27 18:58

Is there a way to programmatically trigger the onmouseover event in plain JavaScript? or \"extract\" the method from the onmouseover event to call

8条回答
  •  再見小時候
    2020-11-27 19:30

    Without going into too much detail, I had an img with rollovers, i.e. mouseout/overs that set the img src to hidden form values (or this could have done in a different context with gloabl variables). I used some javascript to swap both of my over/out image values and I called the called FireEvent( ElementId, "mouseover" ); to trigger the change. My javascript was hiding / displaying elements on the page. This caused the cursor to sometimes be over the img I used to trigger the event - which was the same as the one I was swapping out, and sometimes the cursor was not over the img after the click.

    Mouseover/out does not fire unless you exit and re-enter an element, so after my event was triggered the mouseover/out needed "retriggering" to account for the new cursor position. Here is my solution. After I hide / display various page elements, and to do my img src swapping as described, I call the function RefreshMouseEvents( ElementId ) instead of FireEvent( ElementId, "mouseover" ).

    This works in IE9 (not sure about other browsers).

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

提交回复
热议问题