在 JavaScript 中以编程方式触发 onmouseover 事件

IT技术 javascript dom-events onmouseover
2021-01-16 19:35:14

有没有办法onmouseover在纯 JavaScript 中以编程方式触发事件?或从onmouseover事件中“提取”方法以直接调用它?

例如

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

顶部 div 位于底部 div 之上,因此onmouseover不会在底部 div 中被触发。我需要一种myFunction('some param specific to bottom-div');从 top-div调用的方法

6个回答
const mouseoverEvent = new Event('mouseover');

whateverElement.dispatchEvent(mouseoverEvent);
有时鼠标悬停不起作用但mouseenter确实如此。 const evt = new Event('mouseenter'); whateverElement.dispatchEvent(evt);
2021-03-30 19:35:14
向下滚动希望我能找到这样的东西
2021-04-02 19:35:14

这至少在 IE9 中对我有用。应该跨浏览器兼容或接近它...

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

对于 onmouseover 示例,调用这样的函数

FireEvent( ElementId, "mouseover" );
initEvent根据 MDN developer.mozilla.org/en-US/docs/Web/API/Event/initEvent 的说法,它的value已被弃用,不应依赖.. 可能在else上面中的示例是:var event = new MouseEvent(EventName, { 'view': window, 'bubbles': true, 'cancelable': true }); document.getElementById(ElementId).dispatchEvent(event);
2021-03-17 19:35:14
这是 2021 年在 Chrome 上对我有用的唯一解决方案:)
2021-03-23 19:35:14
var evObj = document.createEvent('Events');evObj.initEvent(EventName, true, false); document.getElementById( ElementId ).dispatchEvent( evObj ); 这就像一个魅力:)
2021-03-29 19:35:14

对我来说以下工作:

​document.getElementById('xyz').dispatchEvent(new MouseEvent('mouseover', { 'bubbles': true }));

还:

​document.getElementById('xyz').dispatchEvent(new MouseEvent('mouseover', { 'view': window, 'bubbles': true, 'cancelable': true }));

没有详细说明,我有一个带有翻转的 img,即鼠标移出/悬停将 img src 设置为隐藏的表单值(或者这可以在具有 global 变量的不同上下文中完成)。我使用了一些 javascript 来交换我的两个过/出图像值,并调用了被调用的 FireEvent( ElementId, "mouseover" ); 来触发变化。我的 javascript 在页面上隐藏/显示元素。这导致光标有时会在我用来触发事件的 img 上 - 这与我换出的那个相同,有时在单击后光标不在 img 上。

除非您退出并重新输入元素,否则鼠标悬停/移出不会触发,因此在触发我的事件后,鼠标悬停/移出需要“重新触发”以说明新的光标位置。这是我的解决方案。在我隐藏/显示各种页面元素并按照描述进行 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 );
        }
    }
}
不要使用 setTimeout 作为 eval!相反,使用Function.prototype.bind.
2021-03-15 19:35:14

经过更多测试后,我不得不修改我的 RefreshMouseEvents 函数集。这是看似完美的版本(再次仅经过 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 );
        }
    }
}