检测浏览器窗口是否随JavaScript移动?

时间:2010-11-30 22:45:25

标签: javascript windows browser dom-events

这是一个演示......我只是很好奇,你能检测出窗户是否被移动了吗?就像你在显示器周围移动Firefox / Chrome / IE一样?我对此表示怀疑,但我想看看,因为你可以检查调整大小和焦点/模糊窗口。

6 个答案:

答案 0 :(得分:17)

我只能想到这个(繁重的)解决方法,在那里检查window.screenXwindow.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

答案 1 :(得分:8)

一个可能更优化的版本是仅在窗口外检查窗口移动并结合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 () {});

如果您通过 alt + Space 在Windows操作系统中移动窗口,并发现窗口调整大小被忽略,我建议通过{添加额外的检测级别{1}}事件。

答案 2 :(得分:4)

回答第一个答案:我在生产代码中使用'轮询窗口位置'。这是一个非常轻量级的事情。每秒两次请求几个对象属性不会减慢任何速度。跨浏览器窗口位置由:

给出
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将为您提供调整大小事件,但标称窗口位置也会发生变化。

答案 3 :(得分:0)

没有。这不是DOM所知道的。

答案 4 :(得分:-1)

不幸的是没有。 DOM仅被通知窗口大小,光标位置,“焦点”和“模糊”等;影响绘图的任何事情。由于移动窗口并不一定需要“重绘”任何内容(在Javascript / Html引擎中有意义),因此DOM不需要知道它。

答案 5 :(得分:-1)

可悲的是,没有。虽然我确实发现this page声称存在这样的事情。我在IE,Chrome和FireFox上测试过,没有运气。