Подтвердить что ты не робот

Обнаружение, если окно браузера перемещено с помощью JavaScript?

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

4b9b3361

Ответ 1

Я могу только подумать об этом (тяжелом) обходе, где вы проверяете, изменились ли 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 всеми браузерами

Ответ 2

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

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 + Space и обнаруживаете, что размеры окон игнорируются, я бы рекомендовал добавить дополнительный уровень обнаружения через события keypress.

Ответ 3

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

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 даст вам событие изменения размера, но также изменится номинальное положение окна.

Ответ 4

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

Ответ 5

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

Ответ 6

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