Определить положение мыши вне событий (используя jQuery)? - PullRequest
38 голосов
/ 16 июля 2009

Мне нужно получить абсолютную позицию / координаты мыши (X и Y), используя (предпочтительно) jQuery, как в в этом уроке , но за пределами любого события JavaScript. Спасибо.

Ответы [ 4 ]

47 голосов
/ 16 июля 2009

Не возможно. Однако вы можете использовать тот же подход в руководстве, чтобы сохранить позицию в глобальной переменной и прочитать ее вне события.

Как это:

jQuery(document).ready(function(){
   $().mousemove(function(e){
      window.mouseXPos = e.pageX;
      window.mouseYPos = e.pageY;
   }); 
})

Теперь вы можете использовать window.mouseXPos и window.mouseYPos из любого места.

29 голосов
/ 13 января 2010

Это началось с комментария к Ответ Четан Шастри , но я понял, что его также стоит опубликовать в качестве ответа:

Я бы с осторожностью следил за тем, чтобы на уровне документа всегда происходило событие mousemove, даже если вы запрашиваете только позицию курсора. Это большая обработка и может привести к зависанию любого браузера, особенно медленного, такого как IE.

Подобная проблема почти наверняка поднимает вопрос о проектном решении: если вам не нужно обрабатывать событие мыши для опроса позиции курсора, вам действительно нужна позиция курсора? Есть ли лучший способ решить проблему, которую вы пытаетесь решить?

Редактировать: даже в Safari 4, который (преуменьшение) очень быстрое , это единственное mousemove событие делает каждое взаимодействие с этой страницей учебника заметно прерывистым для меня. Подумайте, как это повлияет на восприятие пользователями вашего сайта или приложения.

10 голосов
/ 16 мая 2011

Эта функция уменьшит влияние на производительность пользовательского интерфейса, получая только положение мыши с интервалом:

function getMousePosition(timeoutMilliSeconds) {
    // "one" attaches the handler to the event and removes it after it has executed once 
    $(document).one("mousemove", function (event) {
        window.mouseXPos = event.pageX;
        window.mouseYPos = event.pageY;
        // set a timeout so the handler will be attached again after a little while
        setTimeout(function() { getMousePosition(timeoutMilliSeconds) }, timeoutMilliseconds);
    });
}

// start storing the mouse position every 100 milliseconds
getMousePosition(100);

Так же, как и в другом ответе «Теперь вы можете использовать window.mouseXPos и window.mouseYPos из любого места».

Вы теряете немного точности, так как движение мыши не будет обнаружено в течение интервалов.

1 голос
/ 24 июля 2012

Я попытался использовать раствор @Chetan Sastry, но он не работает (я использую jQuery 1.6.4). Я изменяю код, а затем я работаю сейчас. Вот мой код Я надеюсь, что это поможет.



    $(document).ready(function(){
       $(document).mousemove(function(e){
          window.mouseXPos = e.pageX;
          window.mouseYPos = e.pageY;
       }); 
    });

...