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

检测浏览器窗口是否使用JavaScript移动?,javascript,windows,browser,dom-events,Javascript,Windows,Browser,Dom Events,这是一个演示。。。我只是好奇,你能检测出窗户是否被移动了吗?比如在显示器周围移动Firefox/Chrome/IE?我对此表示怀疑,但我想看看,因为您可以检查调整大小和聚焦/模糊窗口。否。DOM没有意识到这一点。不幸的是,没有。DOM只被告知窗口大小、光标位置、“焦点”和“模糊”等信息;任何影响绘画的东西。由于移动窗口不一定需要“重画”任何内容(在Javascript/Html引擎的某种意义上),因此DOM不需要知道它。遗憾的是,不需要。尽管我确实发现有这样的说法。我在IE、Chrome和Fir

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

否。DOM没有意识到这一点。

不幸的是,没有。DOM只被告知窗口大小、光标位置、“焦点”和“模糊”等信息;任何影响绘画的东西。由于移动窗口不一定需要“重画”任何内容(在Javascript/Html引擎的某种意义上),因此DOM不需要知道它。

遗憾的是,不需要。尽管我确实发现有这样的说法。我在IE、Chrome和FireFox中测试了这一点,运气不好。

我只能想到这项(繁重的)工作,检查
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。这是第一个答案:我在产品代码中使用“轮询窗口位置”。这是一件非常轻巧的事情。每秒请求两次对象属性并不会降低任何速度。跨浏览器窗口位置由以下公式给出:

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

此操作的一个可能更优化的版本是,仅在窗口外与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+空格移动窗口,并且发现忽略了窗口的大小调整,我建议您通过
按键
事件添加额外级别的检测。

如图所示,但我想问一下。我想问一下,调整大小不是DOM的一部分,是吗?重新调整大小直接影响视口,因此onresize有事件侦听器。但是移动桌面窗口不会改变浏览器中的任何内容。窗口对象的
移动
事件只存在于Netscape 4中。@Tim Down:sad,sad browser那是一个。。谢谢你的信息screenX
screenY
,IE具有类似但并非完全等效的
窗口
属性
screenLeft
screenTop
。聪明的黑客!从来没有想过。
screenX
screenY
从IE9()开始就受到支持。你让我重新思考我的问题。我不会在用户拖动窗口时试图隐藏某些内容,而是将其隐藏在鼠标外,然后在鼠标内将其恢复。Windows用户可以通过键盘(Alt+Space)移动窗口。你的代码可能会错过这些动作。很高兴知道!有什么线索可以查到吗?啊,我明白了,因为它不在时间间隔内。。。添加了立即修复的想法。用户仍然可以通过键盘快捷键操作窗口,例如在不同大小状态和监视器之间的Windows
[Meta]
+
[Right']
|
[Left]