マウスの位置はevent、mousemoveイベントのハンドラーが受け取ったオブジェクトで報告され、ウィンドウにアタッチできます(イベントのバブル)。
(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
}
})();
(その本体はif古いIEでのみ実行されることに注意してください。)
上記の例 -ページ上でマウスをドラッグすると、ドットが描画されます。(IE8、IE11、Firefox 30、Chrome 38でテスト済み。)
本当にタイマーベースのソリューションが必要な場合は、これをいくつかの状態変数と組み合わせます。
(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
}
}
})();
私の知る限りでは、イベントを見ないとマウスの位置を取得できません。これは、別のスタックオーバーフローの質問に対するこの回答で確認できます。
補足:100ミリ秒(10回/秒)ごとに何かを実行する場合は、その関数で実行する実際の処理を非常に制限された状態に保つようにしてください。これはブラウザ、特に古いMicrosoftのブラウザにとっては多くの作業です。はい、最近のコンピューターではそれほど多くはないように思われますが、ブラウザーでは多くのことが行われています...たとえば、最後に処理した位置を追跡し、位置がない場合はハンドラーからすぐにベイルします。変化した。
event、関数が2回目に呼び出されたときにオブジェクトが存在しないことです。おそらく、使用するよりも何らかのイベントを聞く必要がありますsetTimeout。