有没有办法在纯JavaScript中以编程方式触发onmouseover
事件?或者从onmouseover
事件中“提取”该方法直接调用它?
例如
<div id="bottom-div" onmouseover="myFunction('some param specific to bottom-div');">
<div id="top-div" onmouseover="????????"></div>
</div>
top-div高于bottom-div,因此{-1}}不会在bottom-div中被触发。我需要一种从top-div调用onmouseover
的方法
答案 0 :(得分:29)
至少在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" );
答案 1 :(得分:14)
const mouseoverEvent = new Event('mouseover');
whateverElement.dispatchEvent(mouseoverEvent);
答案 2 :(得分:6)
没有太多的细节,我有一个翻转的img,即mouseout / overs将img src设置为隐藏的表单值(或者这可以在与gloabl变量不同的上下文中完成)。我使用了一些javascript来交换我的两个over / out图像值,并且我调用了名为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 );
}
}
}
答案 3 :(得分:6)
经过更多测试后,我不得不修改我的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 );
}
}
}
答案 4 :(得分:4)
我需要做类似的事情,但我正在使用jQuery,我发现这是一个更好的解决方案:
使用jQuery的触发器功能。
$j('#top-div' ).trigger( 'mouseenter' );
如果需要,您还可以为其添加参数。请参阅jQuery documentation on .trigger。
答案 5 :(得分:3)
对我来说,以下工作有效:
document.getElementById('xyz').dispatchEvent(new MouseEvent('mouseover', { 'bubbles': true }));
也:
document.getElementById('xyz').dispatchEvent(new MouseEvent('mouseover', { 'view': window, 'bubbles': true, 'cancelable': true }));
答案 6 :(得分:1)
<a href="index.html" onmouseover="javascript:alert(0);" id="help">help</a>
document.getElementById('help').onmouseover();
答案 7 :(得分:-8)
你会这样做:
document.getElementById('top-div').onmouseover();
但是,正如评论中所提到的,在被视为问题之前,值得进行测试。