gpt4 book ai didi

javascript - 响应IE浏览器窗口外的onmousemove事件

转载 作者:行者123 更新时间:2023-12-02 22:46:19 28 4
gpt4 key购买 nike

在 Internet Explorer 7 中,body onmousemovedocument.onmousemove 事件似乎仅在鼠标位于浏览器窗口内时触发,而不是在鼠标位于浏览器窗口外时触发。然而,在 Firefox 中,当我移出浏览器窗口时,onmousemove 事件会被正确调用。

如何设置在 IE 浏览器窗口外部调用的事件?

Google Maps在 IE 中执行此操作。如果按住鼠标按钮并将鼠标移到浏览器窗口之外,您可以看到 map 仍在移动。

最佳答案

(注意:此答案专门指 mousedown -> mousemove -> mouseup 的“标准”拖动实现。它不适用于 HTML5 drag specification )。

允许在浏览器窗口之外拖动是一个老问题,不同的浏览器通过两种方式解决了这个问题。

除了 IE 之外,当用户通过 mousedown 发起拖动操作时,浏览器做了一些巧妙的事情(这一切都只是来自观察):一种状态机启动来处理特殊的情况鼠标移动到窗口外的情况:

  1. 用户在文档内触发mousedown事件
  2. 用户触发mousemove事件。即使从文档外部(即窗口)触发,事件也会触发
  3. 用户触发 mouseup 事件(在文档内部或外部)。从文档外部触发的 mousemove 事件不再触发

IE 和旧版本的 Firefox [最新版本 2.0.20] 不会表现出此行为。拖动到窗口之外是行不通的1

IE和FF2的问题实际上在于元素是否“可选择”(参见 herehere )。如果拖动实现不执行任何操作(从而允许通过鼠标进行选择),则所述实现不必考虑窗口外的移动;浏览器将继续并正确触发mousemove,并且允许用户在窗口外自由拖动。不错。

但是,通过让浏览器决定在 mousemove 上执行什么操作,您会得到这样的效果:浏览器认为用户正在尝试“选择”某些内容(例如元素),而不是移动它,并继续疯狂地尝试突出显示当鼠标在拖动过程中移入或移出元素时,元素或其中的文本。

我见过的大多数拖动实现都会采取一些技巧来使被拖动的元素“不可选择”,从而完全控制 mousemove 来模拟拖动:

elementToDrag.unselectable = "on";
elementToDrag.onselectstart = function(){return false};
elementToDrag.style.userSelect = "none"; // w3c standard
elementToDrag.style.MozUserSelect = "none"; // Firefox

这很好用,但是会破坏窗口外的拖动2

无论如何,要回答您的问题,要让 IE(所有版本)允许在窗口外拖动,请使用 setCapture (当释放鼠标时,反之 releaseCapture )。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Simple drag demo</title>
<style>
#dragme {
position:absolute;
cursor:move;
background:#eee;
border:1px solid #333;
padding:10px;
}
</style>

<script>
function makeDraggable(element) {

/* Simple drag implementation */
element.onmousedown = function(event) {

document.onmousemove = function(event) {
event = event || window.event;
element.style.left = event.clientX + 'px';
element.style.top = event.clientY + 'px';
};

document.onmouseup = function() {
document.onmousemove = null;

if(element.releaseCapture) { element.releaseCapture(); }
};

if(element.setCapture) { element.setCapture(); }
};

/* These 3 lines are helpful for the browser to not accidentally
* think the user is trying to "text select" the draggable object
* when drag initiation happens on text nodes.
* Unfortunately they also break draggability outside the window.
*/
element.unselectable = "on";
element.onselectstart = function(){return false};
element.style.userSelect = element.style.MozUserSelect = "none";
}
</script>
</head>
<body onload="makeDraggable(document.getElementById('dragme'))">

<div id="dragme">Drag me (outside window)</div>

</body>
</html>

Demo can be seen here .

这正是 Google map 所做的事情(正如我在 2004 年首次发布 Google map 时对它进行逆向工程时发现的那样)。

<小时/>

1我相信它实际上只有在文本节点上启动拖动操作(即mousedown)时才会中断。元素/容器节点不表现出相同的行为,并且可以在文档内部或外部拖动,前提是用户将鼠标放在元素的“空”部分上

2同样,用于文本节点上的拖动启动。

关于javascript - 响应IE浏览器窗口外的onmousemove事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1685326/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com