【发布时间】:2010-09-20 17:39:42
【问题描述】:
有没有一种规范的方法来使用现有的 onmouseover、onmouseout 和某种计时器来设置 JS onHover 事件?或者当且仅当用户将鼠标悬停在元素上一定时间时才触发任意函数的任何方法。
【问题讨论】:
标签: javascript javascript-events
有没有一种规范的方法来使用现有的 onmouseover、onmouseout 和某种计时器来设置 JS onHover 事件?或者当且仅当用户将鼠标悬停在元素上一定时间时才触发任意函数的任何方法。
【问题讨论】:
标签: javascript javascript-events
这样的事情怎么样?
<html>
<head>
<script type="text/javascript">
var HoverListener = {
addElem: function( elem, callback, delay )
{
if ( delay === undefined )
{
delay = 1000;
}
var hoverTimer;
addEvent( elem, 'mouseover', function()
{
hoverTimer = setTimeout( callback, delay );
} );
addEvent( elem, 'mouseout', function()
{
clearTimeout( hoverTimer );
} );
}
}
function tester()
{
alert( 'hi' );
}
// Generic event abstractor
function addEvent( obj, evt, fn )
{
if ( 'undefined' != typeof obj.addEventListener )
{
obj.addEventListener( evt, fn, false );
}
else if ( 'undefined' != typeof obj.attachEvent )
{
obj.attachEvent( "on" + evt, fn );
}
}
addEvent( window, 'load', function()
{
HoverListener.addElem(
document.getElementById( 'test' )
, tester
);
HoverListener.addElem(
document.getElementById( 'test2' )
, function()
{
alert( 'Hello World!' );
}
, 2300
);
} );
</script>
</head>
<body>
<div id="test">Will alert "hi" on hover after one second</div>
<div id="test2">Will alert "Hello World!" on hover 2.3 seconds</div>
</body>
</html>
【讨论】:
delay === undefined的if语句,比如function( elem, callback, delay = 1000),
如果您使用 JQuery 库,您可以使用 .hover() 事件,该事件合并了 mouseover 和 mouseout 事件并帮助您处理时间和子元素:
$(this).hover(function(){},function(){});
第一个函数是悬停的开始,下一个是结束。阅读更多: http://docs.jquery.com/Events/hover
【讨论】:
我认为您不需要/想要超时。
onhover(悬停)将被定义为“over”某物的时间段。恕我直言
onmouseover = start...
onmouseout = ...end
为了记录,我已经做了一些事情来“伪造”IE6 中的悬停事件。它相当昂贵,最后我为了性能而放弃了它。
【讨论】:
你能澄清你的问题吗?在这种情况下,什么是“ohHover”,它如何对应悬停时间的延迟?
也就是说,我想你可能想要的是……
var timeout;
element.onmouseover = function(e) {
timeout = setTimeout(function() {
// ...
}, delayTimeMs)
};
element.onmouseout = function(e) {
if(timeout) {
clearTimeout(timeout);
}
};
或者addEventListener/attachEvent或者你喜欢的库的事件抽象方法。
【讨论】: