在页面加载后,是否可以使用JavaScript获取鼠标位置,而无需任何鼠标移动事件(不需要移动鼠标)?
在页面加载后,是否可以使用JavaScript获取鼠标位置,而无需任何鼠标移动事件(不需要移动鼠标)?
真实答案:不可能。
好的,我刚想到一种方法。在页面上覆盖一个覆盖整个文档的
<a>
元素(使用已调整大小的<img>
元素的绝对定位,我想),每次缩小矩形。是的,这很荒谬,但在第一次鼠标移动之前无法获得此信息也是如此。 - Darius Bacon编辑于2020年:这种方法不再有效。看起来,浏览器厂商已经将其修补掉了。因为大多数浏览器依赖于Chromium,可能是它的核心问题。
旧回答: 您还可以挂钩mouseenter事件(此事件在页面重新加载后,在鼠标光标位于页面内部时触发)。扩展Corrupted的代码应该可以解决问题:
var x = null;
var y = null;
document.addEventListener('mousemove', onMouseUpdate, false);
document.addEventListener('mouseenter', onMouseUpdate, false);
function onMouseUpdate(e) {
x = e.pageX;
y = e.pageY;
console.log(x, y);
}
function getMouseX() {
return x;
}
function getMouseY() {
return y;
}
你也可以在mouseleave事件上将x和y设置为null,这样你就可以检查用户是否用鼠标在你的页面上。
你可以创建变量来存储光标的x
和y
坐标,在鼠标移动时更新它们,并在一定时间间隔内调用一个函数来处理所存储的位置。
当然,缺点是需要至少一次初始鼠标移动才能使其起作用。只要光标至少更新其位置一次,我们就可以找到其位置,而不管它是否再次移动。
var cursor_x = -1;
var cursor_y = -1;
document.onmousemove = function(event)
{
cursor_x = event.pageX;
cursor_y = event.pageY;
}
setInterval(check_cursor, 1000);
function check_cursor(){console.log('Cursor at: '+cursor_x+', '+cursor_y);}
上述代码每秒更新一次,显示您光标所在的位置信息。
cursorX/Y
变量。 - polkovnikov.ph<a>
元素时性能不佳:
好吧,我刚想到一种方法。用一个覆盖整个文档的div叠加在你的页面上。在这个div里面,创建2,000 x 2,000个元素(这样:hover伪类会在IE6中生效),每个元素大小为1像素。 为这些元素创建一个CSS :hover规则,该规则将更改一个属性(比如font-family)。 在您的加载处理程序中,遍历所有4百万个元素,检查currentStyle / getComputedStyle(),直到找到带有悬停字体的那个元素。从该元素向后推导以获取文档内的坐标。
N.B. 不要这样做。
但是你并不需要一次性渲染4百万个元素,可以使用二分查找。只需要使用4个<a>
元素:
<a>
元素getComputedStyle()
函数确定鼠标悬停在哪个矩形中这样你最多需要重复这些步骤11次,考虑到你的屏幕宽度不超过2048像素。
因此,你只需要生成最多11 x 4 = 44个<a>
元素。
如果你不需要精确确定鼠标位置到像素级别,而是可以接受10像素精度。你最多需要重复这些步骤8次,所以你只需要绘制最多8 x 4 = 32个<a>
元素。
<a>
元素时,我遇到了鼠标悬停状态的问题,然后您必须等待浏览器在悬停状态下渲染元素,这需要一个浏览器周期。浏览器通常以大约60帧每秒的速度运行,所以为了使这个示例更精确,将await sleep(50)
更改为17
,因为1/60约为17毫秒。如果您想更全面地享受可视化效果,将该数字设置为约500。 - undefined您可以尝试类似于Tim Down提出的方法-但是不是为屏幕上的每个像素创建元素,而是创建只有2-4个元素(方框),并动态更改它们的位置、宽度和高度以通过递归将屏幕上可能的位置分成2-4部分,从而快速找到鼠标的实际位置。
例如-首先将元素占据屏幕的左右两边,然后是屏幕的上下两半部分。现在我们已经知道鼠标位于屏幕的哪个四分之一位置,能够重复操作-发现这个空间的哪个四分之一......
(function () {
window.currentMouseX = 0;
window.currentMouseY = 0;
// Guess the initial mouse position approximately if possible:
var hoveredElement = document.querySelectorAll(':hover');
hoveredElement = hoveredElement[hoveredElement.length - 1]; // Get the most specific hovered element
if (hoveredElement != null) {
var rect = hoveredElement.getBoundingClientRect();
// Set the values from hovered element's position
window.currentMouseX = window.scrollX + rect.x;
window.currentMouseY = window.scrollY + rect.y;
}
// Listen for mouse movements to set the correct values
window.addEventListener('mousemove', function (e) {
window.currentMouseX = e.pageX;
window.currentMouseY = e.pageY;
}, /*useCapture=*/true);
}())
Composr CMS源代码:https://github.com/ocproducts/composr/commit/a851c19f925be20bc16bfe016be42924989f262e#diff-b162dc9c35a97618a96748639ff41251R1202
这是关于Composr CMS的源代码链接。$(':hover').last().offset()
结果: {top: 148, left: 62.5}
该结果取决于最近元素的大小,并且在用户切换选项卡时返回undefined
setTimeout
起作用了。我在使用jsfiddle时,你说得对,它从未触发悬停事件,因为每次单击播放时都会重新绘制DOM。我建议为其他人添加此提示。 - tresf可以实现。
如果在文档中添加“mouseover”事件,它将立即触发,您可以获取鼠标位置,当然,前提是鼠标指针位于文档上方。
document.addEventListener('mouseover', setInitialMousePos, false);
function setInitialMousePos( event ) {
console.log( event.clientX, event.clientY);
document.removeEventListener('mouseover', setInitialMousePos, false);
}
以前通过 window.event
可以读取鼠标的位置,但是现在已经被废弃了。
var x = 0;
var y = 0;
document.addEventListener('mousemove', onMouseMove, false)
function onMouseMove(e){
x = e.clientX;
y = e.clientY;
}
function getMouseX() {
return x;
}
function getMouseY() {
return y;
}
document.body.addEventListener('click',function(e)
{
console.log("cursor-location: " + e.clientX + ',' + e.clientY);
});