Обнаружить, перемещено ли окно браузера с помощью JavaScript? - PullRequest
13 голосов
/ 01 декабря 2010

Это для демонстрации ... и мне было просто любопытно, вы можете определить, было ли окно перемещено?Например, если вы перемещаете Firefox / Chrome / IE вокруг своего монитора?Я сомневаюсь в этом, но я хотел видеть, так как вы можете проверить размер и фокус / размытые окна.

Ответы [ 6 ]

17 голосов
/ 01 декабря 2010

Я могу думать только об этом (тяжелом) обходном пути, когда вы проверяете, менялись ли window.screenX и window.screenY каждые x миллисекунд

var oldX = window.screenX,
    oldY = window.screenY;

var interval = setInterval(function(){
  if(oldX != window.screenX || oldY != window.screenY){
    console.log('moved!');
  } else {
    console.log('not moved!');
  }

  oldX = window.screenX;
  oldY = window.screenY;
}, 500);

Хотя я бы не рекомендовал это - ономожет быть медленным, и я не уверен, что screenX и screenY поддерживаются всеми браузерами

8 голосов
/ 10 сентября 2013

Потенциально более оптимизированная версия - проверять движение окна только тогда, когда за пределами окна в сочетании с ответом Хармена:

var interval;
window.addEventListener("mouseout", function(evt){ 
  if (evt.toElement === null && evt.relatedTarget === null) {
    //if outside the window...
    if (console) console.log("out");
    interval = setInterval(function () {
      //do something with evt.screenX/evt.screenY
    }, 250);
  } else {
    //if inside the window...
    if (console) console.log("in");
    clearInterval(interval);
  }
});

Если используется jQuery, в этом случае он может нормализовать screenX / Y, поэтомуна этом стоит провести несколько тестов.Jquery будет использовать этот формат вместо addEventListener:

$(window).on('mouseout', function () {});

Если вы перемещаете окно в ОС Windows через alt + Пробел и находите эти окнаизменения размера игнорируются, я бы рекомендовал добавить дополнительный уровень обнаружения с помощью событий keypress.

4 голосов
/ 01 августа 2013

Первый ответ: я использую «положение окна опроса» в производственном коде. Это очень легкая вещь. Запрос пары свойств объекта дважды в секунду ничего не замедлит. Кросс-браузерная позиция окна задается как:

function get_window_x_pos()
{
   var winx;

   if(window.screenX)
      winx=window.screenX;
   else if(window.screenLeft)
      winx=window.screenLeft;

   return winx;
}

и аналогично для вертикального положения. В моем коде я использую это для запуска события AJAX на сервере, чтобы сохранить положение и размер окна, чтобы в следующий раз оно открывалось там, где оно было в последний раз (я, вероятно, скоро перейду к локальному хранилищу HTML5). морщина, которую вы, возможно, захотите скрыть, не создает ложных обновлений во время перетаскивания окна. Способ справиться с этим - зарегистрироваться, когда окно было перемещено в первый раз, и запускать обновление только тогда, когда два последующих опроса положения окна возвращают одинаковое значение. Еще одним осложнением являются окна, которые позволяют изменять размеры со всех сторон. Если перетащить левую или верхнюю сторону, DOM выдаст вам событие изменения размера, но также изменится и номинальная позиция окна.

0 голосов
/ 01 декабря 2010

К сожалению, нет. Хотя я нашел эту страницу , которая утверждает, что есть такая вещь. Я проверил это в IE, Chrome и FireFox, не повезло.

0 голосов
/ 01 декабря 2010

К сожалению нет.DOM уведомляется только о размерах окна, позициях курсора, «фокусе» и «размытии» и т. Д .;все, что влияет на рисунок .Поскольку перемещение окна не обязательно требует перерисовки какого-либо содержимого (в смысле движка Javascript / Html), DOM, следовательно, не должен знать об этом.

0 голосов
/ 01 декабря 2010

Нет.Это не то, о чем знает DOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...