Запуск события onmouseover программно в JavaScript

Есть ли способ программно вызвать событие onmouseover в простом JavaScript? или «извлечь» метод из события onmouseover, чтобы вызвать его напрямую?

eg

<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'); из верхнего div


person fearofawhackplanet    schedule 09.02.2010    source источник
comment
Вы пробовали это? Событие onmouseover должно срабатывать в родительском событии также благодаря распространению события.   -  person Tatu Ulmanen    schedule 09.02.2010
comment
хорошо, я не подумал об этом, извините, это немного плохой пример, потому что в моем приложении они на самом деле не являются вложенными элементами. верхний div абсолютно расположен над рядом других элементов.   -  person fearofawhackplanet    schedule 09.02.2010
comment
@Piskvor: я пытался сократить очень сложный фрагмент html до простого примера и допустил ошибку. Извините, если это вас оскорбляет.   -  person fearofawhackplanet    schedule 07.07.2010
comment
@fearofawhackplanet: прошу прощения за высокомерный комментарий, удален. (фактическая часть: перекрытие элементов != вложенность элементов)   -  person Piskvor left the building    schedule 07.07.2010
comment
Однострочная версия (проверено в консоли Chrome)   -  person Tom    schedule 22.07.2019
comment
@fearofawhackplanet Обычно я рекомендую не поддаваться давлению сверстников, но только на этот раз я предлагаю вам подумать об изменении вашего принятого ответа на этот вопрос.   -  person SteeveDroz    schedule 03.11.2020


Ответы (7)


Вы бы сделали это примерно так:

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

Однако, как упоминалось в комментариях, стоило бы протестировать, прежде чем рассматривать проблему.

person Yacoby    schedule 09.02.2010
comment
я не знала, что это так просто! я уверен, что пытался сделать подобное с onclick раньше, и это не работает. может у меня память плохая. - person fearofawhackplanet; 09.02.2010
comment
Я не уверен, работало ли это когда-либо, но я считаю, что это должно быть по крайней мере без префикса «включено». - person Ja͢ck; 23.02.2013
comment
Не работает Uncaught TypeError: e.previousElementSibling.onmouseover is not a function(…) - person Green; 27.05.2016
comment
@fearofawhackplanet Пожалуйста, рассмотрите возможность принятия другого ответа. Это не будет работать в большинстве случаев и не рекомендуется  — оно будет работать только тогда, когда функция привязана к свойству onmouseover, но addEventListener предпочтительнее. Этот ответ не работает для этого стандартного API, однако ответ, получивший наибольшее количество голосов, будет работать для любого подхода. - person Sebastian Simon; 16.04.2018

Это работало для меня, по крайней мере, в 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" );
person Jonathan    schedule 01.12.2012
comment
Что бы это ни стоило, initEvent устарело и на него не следует полагаться в соответствии с MDN developer.mozilla.org/en-US/docs/Web/API/Event/initEvent .. и пример, который может быть в блоке else выше: var event = new MouseEvent(EventName, { 'view': window, 'bubbles': true, 'cancelable': true }); document.getElementById(ElementId).dispatchEvent(event); - person james; 05.04.2016
comment
это было единственное решение, которое сработало для меня в Chrome в 2021 году :) - person Csa77; 21.02.2021

Для меня сработало следующее:

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

Также:

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

Не вдаваясь в подробности, у меня был 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 );
        }
    }
}
person Jonathan    schedule 02.12.2012
comment
Не используйте setTimeout как eval! Вместо этого используйте Function.prototype.bind. - person Jack Giffin; 11.09.2017

Мне пришлось пересмотреть набор функций 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 );
        }
    }
}
person Jonathan    schedule 06.12.2012

Мне нужно было сделать что-то подобное, но я использую jQuery и считаю это лучшим решением:

Используйте триггерную функцию jQuery.

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

Вы также можете добавить к нему параметры, если вам нужно. См. документацию jQuery на .trigger.

person thephatp    schedule 24.08.2012
comment
Я нахожу это забавным, когда люди голосуют против ответа и не говорят. Итак, кто бы ни проголосовал за мой ответ, объясните, почему, чтобы я мог узнать что-то новое. Я не утверждаю, что мой ответ лучший, но он сработал для меня. Если вы обнаружили проблему с этим, добавьте комментарий, чтобы мы могли знать, почему, или еще лучше, чтобы я мог улучшить свой ответ. - person thephatp; 24.12.2015
comment
Возможно, потому что ОП говорит, что они ищут решение в простом Javascript? - person bigsee; 20.12.2018

person    schedule
comment
Пролистал вниз в надежде найти что-то подобное - person ESR; 09.01.2019
comment
Иногда наведение мыши не работает, но mouseenter работает. const evt = new Event('mouseenter'); whateverElement.dispatchEvent(evt); - person brianf; 27.02.2019