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

这是一个演示…我只是好奇,你能检测窗口是否已经被移动? 就像你在你的显示器周围移动Firefox / Chrome / IE一样? 我怀疑,但我想看看,因为你可以检查resize和重点/模糊的窗口。

我只能想到这个(重)解决方法,你检查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

一个潜在的更优化的版本是只在窗口外面结合哈门的答案时检查窗口的移动:

 var interval; window.addEventlistner("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将使用这种格式,而不是addEventlistner

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

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

重新回答第一个问题:我在生产代码中使用“轮询窗口位置”。 这是一个非常轻量级的事情。 每秒要求两次对象属性不会减慢速度。 跨浏览器的窗口位置由下式给出:

 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会给你一个调整大小的事件,但标称的窗口位置也会改变。

不,这不是DOM所知道的。

不幸的是, DOM只被通知窗口大小,光标位置,“焦点”和“模糊”等; 任何影响绘图的东西。 因为移动一个窗口不一定需要“重绘”任何内容(在一个Javascript / Html引擎的意义上),所以DOM不需要知道它。

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