Answers:
原始(正确)答案:
您可以使用is()并检查选择器:hover。
var isHovered = $('#elem').is(":hover"); // returns true or false
示例:http://jsfiddle.net/Meligy/2kyaJ/3/
(这仅在选择器最多匹配一个元素时有效。有关更多信息,请参见“编辑3”。)
。
编辑1(2013年6月29日):(仅适用于jQuery 1.9.x,因为它与1.10+兼容,请参阅下一个编辑2)
在回答问题时,此答案是最好的解决方案。这个':hover'选择器.hover()在jQuery 1.9.x中被删除了。
有趣的是,“ allicarn”最近的回答显示,:hover当您为选择器添加前缀时,可以将其用作CSS选择器(与Sizzle相对)$($(this).selector + ":hover").length > 0。
另外,另一个答案中提到的hoverIntent插件看起来也很好。
编辑2(2013年9月21日): .is(":hover") 作品
根据另一条评论,我注意到我发布的原始方式.is(":hover")实际上仍然可以在jQuery中使用,因此。
它在jQuery 1.7.x中有效。
当有人向我报告它时,它在1.9.1中停止工作,我们都认为它与jQuery删除该hover版本中事件处理的别名有关。
它在jQuery 1.10.1和2.0.2(也许是2.0.x)中再次起作用,这表明1.9.x中的失败是一个错误,或者不是我们先前所想的故意行为。
如果要在特定的jQuery版本中进行测试,只需在此答案的开头打开JSFidlle示例,更改为所需的jQuery版本,然后单击“运行”。如果颜色在悬停时发生变化,则可以使用。
。
如@Wilmer在评论中所示,他有一个小提琴,甚至无法针对我和其他人对其进行测试的jQuery版本进行测试。当我尝试查找有关他的案子的特殊之处时,我注意到他正在尝试一次检查多个要素。这是投掷的Uncaught Error: Syntax error, unrecognized expression: unsupported pseudo: hover。
所以,他的小提琴的工作,但这不工作:
var isHovered = !!$('#up, #down').filter(":hover").length;
虽然这DOES工作:
var isHovered = !!$('#up,#down').
filter(function() { return $(this).is(":hover"); }).length;
它也适用于包含单个元素的jQuery序列,例如原始选择器仅匹配一个元素,或者您调用.first()了结果等。
我的JavaScript + Web开发技巧和资源时事通讯也对此进行了引用。
Syntax Error, unrecognized expression: hover. jquery-1.7.js line 4179。
用:
var hovered = $("#parent").find("#element:hover").length;
jQuery 1.9以上
它在jQuery 1.9中不起作用。根据user2444818的答案制作了此插件。
jQuery.fn.mouseIsOver = function () {
return $(this).parent().find($(this).selector + ":hover").length > 0;
};
在悬停时设置标志:
var over = false;
$('#elem').hover(function() {
over = true;
},
function () {
over = false;
});
然后只需检查您的标志即可。
mouseleave一个元素时,我想检查一下鼠标是否进入了另一个特定元素。
e.fromElement和e.toElement。那对你有用吗?
.data()。
经过一段时间的研究后,夫妇进行了更新以添加:
我们使用了hoverIntent https://github.com/briancherne/jquery-hoverIntent为我们解决了这个问题。本质上,它会触发鼠标移动是否更加刻意。(要注意的是,它将在鼠标进入元素并离开时触发—如果您只想使用一次构造函数的空函数)
扩展@Mohamed的答案。您可以使用一些封装
像这样:
jQuery.fn.mouseIsOver = function () {
if($(this[0]).is(":hover"))
{
return true;
}
return false;
};
像这样使用它:
$("#elem").mouseIsOver();//returns true or false
分叉的小提琴:http : //jsfiddle.net/cgWdF/1/
我喜欢第一反应,但对我来说很奇怪。尝试在页面加载后立即检查鼠标时,我必须至少延迟500毫秒才能使其正常工作:
$(window).on('load', function() {
setTimeout(function() {
$('img:hover').fadeOut().fadeIn();
}, 500);
});
为kinakuta的答案设置一个标志似乎是合理的,您可以在身上放置一个侦听器,以便可以检查在特定时刻是否悬停了任何元素。
但是,您如何处理子节点?您也许应该检查该元素是否是当前悬停元素的祖先。
<script>
var isOver = (function() {
var overElement;
return {
// Set the "over" element
set: function(e) {
overElement = e.target || e.srcElement;
},
// Return the current "over" element
get: function() {
return overElement;
},
// Check if element is the current "over" element
check: function(element) {
return element == overElement;
},
// Check if element is, or an ancestor of, the
// current "over" element
checkAll: function(element) {
while (overElement.parentNode) {
if (element == overElement) return true;
overElement = overElement.parentNode;
}
return false;
}
};
}());
// Check every second if p0 is being hovered over
window.setInterval( function() {
var el = document.getElementById('p0');
document.getElementById('msg').innerHTML = isOver.checkAll(el);
}, 1000);
</script>
<body onmouseover="isOver.set(event);">
<div>Here is a div
<p id="p0">Here is a p in the div<span> here is a span in the p</span> foo bar </p>
</div>
<div id="msg"></div>
</body>