这是一个演示......我只是很好奇,你能检测出窗户是否被移动了吗?就像你在显示器周围移动Firefox / Chrome / IE一样?我对此表示怀疑,但我想看看,因为你可以检查调整大小和焦点/模糊窗口。
答案 0 :(得分:17)
我只能想到这个(繁重的)解决方法,在那里检查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
答案 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上测试过,没有运气。