没有jquery
基本上我正在寻找的是能够在倒计时结束时查看鼠标是否超过div
如果用户在div上方,则执行该div的操作
onmouseover
仅在鼠标超过div的阈值时触发,如果鼠标未移动则不会触发,因此无效
我需要确定鼠标当前是否在某个特定时间点的div上,如果它已经从起点移动了
我所有的狩猎只发现了onmousover
,没有什么可以看到鼠标恰好在那里开始
我没有javascript技能来确定div的整体坐标,然后映射鼠标坐标,看它是否适合那里......这是我认为我需要做的事情
答案 0 :(得分:10)
在this SO question上阅读第二个答案(有数百万个a
元素的答案)之后,我想出了这个方法,无需在页面加载时移动鼠标,而不涉及数百万个元素
<div id=t></div>
#t {
/* for illustrative purposes */
width: 10em;
height: 5em;
background-color: #0af;
}
#t:hover {
border-top-style: hidden;
}
document.addEventListener('click', function () {
var c = window.getComputedStyle(document.getElementById('t')).getPropertyValue('border-top-style');
if (c === 'hidden') {
alert('Mouse in box');
} else {
alert('Mouse not in box');
}
}, false);
如前所述,绑定到倒计时的结束事件,而不是click
上的document
事件。
你也可以使用:hover
上改变的任何CSS样式,我选择了border-top-style,因为它很显眼。如果您正在使用边框,请选择其他内容。
这是jsFiddle。
答案 1 :(得分:5)
将标志设置为true onmouseover和false onmouseleave。当倒计时结束时,如果flag为true,那么它就是元素。
HTML
<div id="div-name">the section of the code i am working with has a countdown timer, when it reaches 0 i need to know if the mouse is over a specific box</div>
<button id="notification" onclick="javascript: letsCountIt(5);">click to start countdown</button>
JS
window.ev = false;
document.getElementById('div-name').onmouseover = function () {
window.ev = true;
console.log(window.ev);
}
document.getElementById('div-name').onmouseout = function () {
window.ev = false;
console.log(window.ev);
}
window.letsCountIt = function (cdtimer) {
cdtimer--;
document.getElementById('notification').innerHTML = cdtimer;
if (cdtimer == 0) {
if (window.ev === true) {
alert('over');
} else {
alert('not over');
}
} else {
setTimeout(function(){letsCountIt(cdtimer);}, 1000);
}
}
答案 2 :(得分:1)
只是想说,我认为jQuery的mouseenter
和mouseleave
事件会让事情变得容易多了,但是如果你不能使用它们,也许这会对你有帮助。
根据您的网页布局方式,这可能不会太困难。您可以使用以下方法获取元素的位置。引用另一个answer
element.offsetLeft
和element.offsetTop
是纯粹的javascript 用于查找元素相对于其位置的属性 offsetParent;是最近的父元素,其位置为 相对或绝对
所以,如果你的元素相对于body
定位,那么好(我们不需要调整任何东西)。
现在,如果我们将事件附加到document
mousemove事件,我们可以获取鼠标的当前坐标:
document.addEventListener('mousemove', function (e) {
var x = e.clientX;
var y = e.clientY;
}, false);
现在我们只需要确定鼠标是否属于元素。为此,我们需要元素的高度和宽度。引用另一个answer
您应该使用
.offsetWidth
和.offsetHeight
属性。注意 它们属于元素,而非.style。
例如:
var element = document.getElementById('element');
var height = element.offsetHeight;
var width = element.offsetWidth;
现在我们拥有了所需的所有信息,只需要确定鼠标是否属于元素。我们可能会使用这样的东西:
var onmove = function(e) {
var minX = element.offsetLeft;
var maxX = minX + element.offsetWidth;
var minY = element.offsetTop;
var maxY = minY + element.offsetHeight;
if(e.clientX >= minX && e.clientX <= maxX)
//good horizontally
if(e.clientY >= minY && e.clientY <= maxY)
//good vertically
}
答案 3 :(得分:1)
查看document.elementFromPoint。当您将x,y
传递给elementFromPoint
时,它将返回任何元素(或<body>
,如果没有其他特定元素)。您可以轻松检查此元素是否是您想要的元素。
问题是找出你的鼠标在哪一点。 How to get the mouse position without events (without moving the mouse)?似乎在说 - 不要。至少使用mouseMove来跟踪光标。链接的问题提供了如何执行此操作的示例。 (看看得分较低的答案,因为较高的答案只会因为讽刺而得分。)
答案 4 :(得分:0)
此代码有效,但鼠标必须在页面加载后移动一次。
var coords;
var getMouseCoordinates = function (e) {
'use strict';
return {
x: e.clientX,
y: e.clientY
};
};
document.addEventListener('mousemove', function (e) {
coords = getMouseCoordinates(e);
}, false);
document.addEventListener('click', function () {
var divCoords = document.getElementById('t').getBoundingClientRect();
if (coords.x >= divCoords.left && coords.x <= divCoords.right && coords.y >= divCoords.top && coords.y <= divCoords.bottom) {
alert('Mouse in box');
} else {
alert('Mouse not in box');
}
}, false);
您不会绑定click
的{{1}}事件,而是结束倒计时的结束事件。
这是一个example。尝试单击输出窗口。