Farenin konumu, olay eventiçin bir işleyici tarafından alınan nesneye bildirilir mousemoveve pencereye ekleyebilirsiniz (olay balonları):
(function() {
document.onmousemove = handleMouseMove;
function handleMouseMove(event) {
var eventDoc, doc, body;
event = event || window.event; // IE-ism
// If pageX/Y aren't available and clientX/Y are,
// calculate pageX/Y - logic taken from jQuery.
// (This is to support old IE)
if (event.pageX == null && event.clientX != null) {
eventDoc = (event.target && event.target.ownerDocument) || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = event.clientX +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
(doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY +
(doc && doc.scrollTop || body && body.scrollTop || 0) -
(doc && doc.clientTop || body && body.clientTop || 0 );
}
// Use event.pageX / event.pageY here
}
})();
(Bunun gövdesinin ifyalnızca eski IE'de çalışacağını unutmayın.)
Yukarıdaki eylem örneği - farenizi sayfanın üzerine sürüklerken noktalar çizer. (IE8, IE11, Firefox 30, Chrome 38'de test edilmiştir.)
Zamanlayıcı tabanlı bir çözüme gerçekten ihtiyacınız varsa, bunu bazı durum değişkenleriyle birleştirirsiniz:
(function() {
var mousePos;
document.onmousemove = handleMouseMove;
setInterval(getMousePosition, 100); // setInterval repeats every X ms
function handleMouseMove(event) {
var dot, eventDoc, doc, body, pageX, pageY;
event = event || window.event; // IE-ism
// If pageX/Y aren't available and clientX/Y are,
// calculate pageX/Y - logic taken from jQuery.
// (This is to support old IE)
if (event.pageX == null && event.clientX != null) {
eventDoc = (event.target && event.target.ownerDocument) || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = event.clientX +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
(doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY +
(doc && doc.scrollTop || body && body.scrollTop || 0) -
(doc && doc.clientTop || body && body.clientTop || 0 );
}
mousePos = {
x: event.pageX,
y: event.pageY
};
}
function getMousePosition() {
var pos = mousePos;
if (!pos) {
// We haven't seen any movement yet
}
else {
// Use pos.x and pos.y
}
}
})();
Bildiğim kadarıyla, bir olay görmeden fare konumunu alamazsınız, başka bir Yığın Taşması sorusuna bu cevabın onayladığı bir şey.
Yan not : Her 100 ms'de (10 kez / saniye) bir şey yapacaksanız, bu işlevde yaptığınız gerçek işlemi çok, çok sınırlı tutmaya çalışın . Bu, özellikle eski Microsoft tarayıcıları için çok fazla iş. Evet, modern bilgisayarlarda çok fazla görünmüyor, ancak tarayıcılarda çok şey oluyor ... Yani, örneğin, işlediğiniz son pozisyonu takip edebilir ve pozisyon yoksa, işleyiciden hemen kurtulabilirsiniz. t değişti.
eventişlev ikinci kez çağrıldığında hiçbir nesne olmayacak olmasıdır . Muhtemelen kullanmaktan başka bir olay dinlemelisinizsetTimeout.