有没有办法触发 mousemove 并获取 event.pageX、event.pageY?

Posted

技术标签:

【中文标题】有没有办法触发 mousemove 并获取 event.pageX、event.pageY?【英文标题】:Is there a way to trigger mousemove and get event.pageX, event.pageY? 【发布时间】:2011-12-08 00:05:40 【问题描述】:

那么,就像问题所指出的那样,有没有办法在 jQuery 中触发 mousemove 事件,该事件还将鼠标坐标发送到事件对象?

到目前为止,我的代码可以使用 .trigger(event) 函数触发 mousemove,但 event.pageX 和 event.pageY 未定义。

【问题讨论】:

一旦你可以做的就是保存最后一个真正的 mousemove 事件的事件数据,然后当你触发它时,如果不存在新的事件数据,则以编程方式重用它。如果没有触发真正的 mousemove 事件,则意味着鼠标没有移动,因此最后一次真正的 mousemove 中的 eventData 应该仍然具有当前位置。 【参考方案1】:

需要在触发事件前直接设置pageXpageY。要设置这些属性,请创建一个 jQuery.Event 对象。

// create a jQuery event
e = $.Event('mousemove');

// set coordinates
e.pageX = 100;
e.pageY = 100;

// trigger event - must trigger on document
$(document).trigger(e);

See it in jsFiddle.

【讨论】:

这不起作用,因为 jQuery 在调用 trigger 时会忽略 pageX 和 pageY 参数。 是什么让你得出这个结论?查看this jsfiddle。 我同意,这种方法对我来说是最好的,很容易自己定义事件,只需自己更改 pageX/pageY 道具【参考方案2】:

我不相信可以通过 javascript / jQuery 按需获取鼠标坐标;但是,如果您将位置绑定到全局变量,则可以在整个文档中随时访问它们,如下所示:

$(document).ready(function()
   $().mousemove(function(e)
      window.xPos = e.pageX;
      window.yPos = e.pageY;
   ); 
);

对于 CPU 密集度较低的选项,您可以添加超时,但您可以用性能换取知道鼠标位置的轻微延迟:

function getMousePosition(timeoutMilliSeconds) 
    $(document).one("mousemove", function (event) 
        window.xPos = event.pageX;
        window.yPos = event.pageY;
        setTimeout("getMousePosition(" + timeoutMilliSeconds + ")", timeoutMilliSeconds);
    );

getMousePosition(100);

您现在应该能够使用任一解决方案从文档中的任何位置访问 window.xPos 和 window.yPos,而无需触发虚假事件。

【讨论】:

-1 这并没有解决问题,它涉及手动触发的事件。 我知道如何通过在对象上绑定 mousemove 来获取鼠标的坐标。但是说鼠标不动,但是我想用jQuery中的trigger函数来触发一个虚拟的mousemove,仍然得到坐标。 @geossj5 - 如果您已经在跟踪鼠标,并且鼠标不再移动,那么无论最后记录的坐标是什么,情况肯定仍然如此......? @JamesAllardice - 是的,这就是我现在所拥有的,但我认为会有一种更高效且 CPU 密集度更低的方式。不过,感谢您的洞察力。【参考方案3】:

我不确定我是否完全理解这个问题。你可以这样做:

$('.someClass').mousemove(function(event)
    console.log(event.pageX);
    console.log(event.pageY);
);

现在,每当鼠标移到someClass 上时,它都会注册 xy 坐标。这是jsfiddle 来查看它的实际效果和jquery documentation。

【讨论】:

我知道如何通过在元素上绑定 mousemove 来获取鼠标的坐标。但是说鼠标不动,但是我想用jQuery中的trigger函数来触发一个虚拟的mousemove,仍然得到坐标。 你是如何用 Javascript 移动鼠标的?【参考方案4】:

如果这是您所要求的,您不能移动鼠标。但是您可以使用所需的任何上下文和参数调用函数。例如:

function foobar(e)

  this.className = 'whatever'; // this == element


someElement.onmousemove = foobar;

var obj = whatever:'you want';
foobar.call(someElement, obj); // calls foobar(obj) in context of someElement

【讨论】:

【参考方案5】:

我想我知道你的问题。您正在尝试以编程方式查询鼠标位置。也许你有这样的代码:

$(document).one('mousemove.myModule', function (e) 
    // e.pageY and e.pageX is undefined.
    console.log('e.pageY: ' + e.pageY + ', e.pageX: ' + e.pageX); 
        ).trigger('mousemove.myModule');

那么你是完全正确的。不会定义事件对象的 pageY 和 pageX 属性。实际上,事件对象中有很多不存在的东西,不仅仅是.pageY.pageX。可能是 jQuery 中的一些错误。无论如何,只是不要链接该调用来触发 在 $(window) 上触发事件。不要问我为什么它有效,但对我来说它确实有效:

$(document).one('mousemove.myModule', function (e) 
    console.log('e.pageY: ' + e.pageY + ', e.pageX: ' + e.pageX);  );

// Now e.pageY and e.pageX will be defined!
$(window).trigger('mousemove.myModule');

【讨论】:

【参考方案6】:

这是我能想到的最好的方法,它不会影响您设置全局变量。 click 事件仍将捕获坐标,因此您可以将该事件传递给 mousemove。

$(element).click(function(e)
  $(element).trigger('mousemove',e);
);

然后,该事件对象将成为 mousemove 函数中的第二个参数;第一个是实际的 mousemove 事件或 jQuery created 事件。

$(element).mousemove(function(e,clickEvent)
  if typeof e.pageX === 'undefined' e = clickEvent;
  // or if you prefer, clickEvent.pageX;
);

【讨论】:

以上是关于有没有办法触发 mousemove 并获取 event.pageX、event.pageY?的主要内容,如果未能解决你的问题,请参考以下文章

使用Jquery或Javascript触发mousemove事件

使用 Jquery 或 Javascript 触发 mousemove 事件

鼠标单击并拖动事件 WPF

仅当鼠标悬停在元素上至少特定时间时,如何触发 MouseMove 事件?

鼠标移动到一个元素上,会触发该元素的一个世界,jquery中表示该事件的方法是?

js 实现拖拽元素