在Firefox中捕获鼠标

时间:2009-05-04 13:09:55

标签: javascript html

在IE中存在.setCapture(); .releaseCapture()函数。  在不使用jQuery的情况下,Firefox中的这些功能相当于什么? (我的客户不想使用它)

10 个答案:

答案 0 :(得分:12)

如上所述,Firefox不提供此功能,您可以通过监控整个文档上的事件来解决此问题。为了确保没有更好的技巧,我刚刚检查了jQuery UI,看起来他们使用相同的方法。因此,例如,如果你想在jQuery中关闭鼠标时捕获鼠标移动,你可以这样做:

$("#someElement").
    mousedown(function() { $(document).mousemove(captureMouseMove) }).
    mouseup(function() { $(document).unbind("mousemove", captureMouseMove) });

function captureMouseMove(event)
{
    // ...
}

答案 1 :(得分:8)

https://developer.mozilla.org/en-US/docs/DOM/element.setCapture

setCapture和releaseCapture已于2011年3月22日添加到Firefox 4(随Gecko 2发布)。但是,WebKit(Chrome / Safari)仍缺乏这些功能。

答案 2 :(得分:2)

在任何时候捕获鼠标都不是好行为,我认为这就是为什么不提供setCapture的原因。

但是,要捕获鼠标进行拖放操作,您只需要处理document对象的鼠标事件(鼠标{up,down,move}),这可能会在拖动时触发甚至在客户区外。

<html>
<head>
    <title>Capture test</title>
</head>
<body>
<script type="text/javascript">
    document.onmousedown = function () {
        state.innerHTML = "Dragging started";
    };
    document.onmousemove = function (e) {
        coord.innerHTML = e.clientX + ',' + e.clientY;
    }
    document.onmouseup = function (e) {
        state.innerHTML = "Dragging stopped";
    }
</script>
<p id="state">.</p>
<p id="coord">.</p>
</body>
</html>

答案 3 :(得分:2)

我认为从FF4开始,将element.setCapture()和document.releaseCapture()添加到Firefox: https://developer.mozilla.org/en/DOM/element.setCapture

“在处理mousedown事件期间调用element.setCapture()方法,将所有鼠标事件重新定位到此元素,直到释放鼠标按钮或调用document.releaseCapture()为止。”

答案 4 :(得分:2)

@ JanZich的解决方案效果很好,但如果鼠标位于元素之外,它不会捕获鼠标按下事件。这对我来说效果更好:

$("#someElement").mousedown(function() { 
    $(document).mousemove(captureMouseMove); 
    $(document).mouseup(captureMouseUp);
});

function captureMouseMove(event) {
    console.log("mouse move");
}                       

function captureMouseUp(event) {
    console.log("mouse up");
    $(document).unbind("mousemove", captureMouseMove);
    $(document).unbind("mouseup", captureMouseUp);
}                       

答案 5 :(得分:1)

使用事件冒泡:将冒泡鼠标事件的事件侦听器添加到高级容器(甚至可能是document)并使用变量来跟踪哪个元素应该是捕获的。

如果没有关于你要做什么的进一步信息,那就没有什么可说的了。

答案 6 :(得分:0)

SetCapture和ReleaseCapture是您发现的IE专有功能。在Firefox中没有以相同方式操作内容菜单的原生方式。

Gimme似乎可以在http://www.codeplex.com/gimme/Wiki/Recent.aspx找到它。这里有一篇博文:http://blog.stchur.com/2007/11/21/setcapture-with-gimme描述了使用它来替换函数的一种情况。

答案 7 :(得分:0)

setCapture()和releaseCapture()是Internet Explorer特有的非标准方法。 Firefox中没有实现。有一个名为Gimme的框架,它为您提供了一些鼠标捕获功能。 http://www.codeplex.com/gimme/

答案 8 :(得分:-1)

使用true作为要捕获的addEventListener方法的第三个参数。例如:

document.addEventListener("click", function(event){location.hash=event.target}, true)

使用具有相同参数的removeEventListener来发布:

document.removeEventListener("click", function(event){location.hash=event.target}, true);

<强>参考

答案 9 :(得分:-3)

FF / JavaScript中没有这样的功能。捕获函数仅存在于JScript中。