我希望在网页加载时检测鼠标是否悬停在元素上。看起来这在jQuery中不可能实现- mouseover,hover等需要鼠标移动;获取当前鼠标位置(以与元素边界进行比较)也是如此。
我没有看到过这个具体的问题,但我已经看到人们说这些各种小细节都不可能实现...
我没有看到过这个具体的问题,但我已经看到人们说这些各种小细节都不可能实现...
#el:hover {background-color: transparent; }
jQuery:
if ($('#el').css('background-color') == 'transparent')
/** detect if the mouse was hovering over and element when the page loaded */
function detectHoverOnLoad(options) {
var sel = options.selector
if ($(sel + ':hover').length) {
console.log('loaded while HOVERING over ' + sel)
} else {
console.log('loaded, but NOT hovering over ' + sel)
}
}
然后我这样调用它:
detectHoverOnLoad({selector: '#headerNav'})
通过更多的测试,我发现有时如果鼠标在移动,它并没有总是检测到悬停状态,因此我添加了一个备选方案来检测鼠标是否移动到了这个元素上:
function detectHoverOnLoad(options) {
var sel = options.selector
if ($(sel + ':hover').length) {
console.log('loaded while HOVERING over ' + sel)
} else {
console.log('NOT hovering')
$(sel).one('mousemove', function (e) {
if ($(e.target).parents(sel).length) {
console.log('MOUSEMOVEed over ' + sel)
}
});
}
}
为什么不呢!:)
这是我的一个解决方案:
来自演示的代码:
function handler(ev) {
var target = $(ev.target);
var elId = target.attr('id');
if( target.is(".el") ) {
alert('The mouse was over'+ elId );
}
}
$(".el").mouseleave(handler);
编辑:经过测试,我得出结论,这种方法行不通。省点时间,试试其他方法吧。
我认为你实际上可以让元素边界框起作用。
这是一种有点取巧的方法,但策略是使用element.offset()获取元素相对于文档的坐标,以及element.width()和element.height()来创建鼠标位置的边界框。然后,您可以将事件的.pageX和.pageY值与此边界框进行比较。
正如您所说,您需要一个事件来获取这些坐标,但这对您不起作用,因为您希望立即获得它们。尽管如此,您是否考虑通过在文档加载后调用$('#some-element').trigger('click')来模拟鼠标单击事件?您可以先通过$('#some-element).click()注册一个函数来检查边界框并查看它的效果。
我发现世界上可能最简单的方法! 忘记JQ hover,使用它的.mouseover和.mouseleave,并为两者定义函数,在加载和加载后都不会出现任何问题!
$('li').mouseover(function () {
codes
}
$('li').mouseleave(function () {
codes
}