Захват мыши в Firefox - PullRequest
       16

Захват мыши в Firefox

4 голосов
/ 04 мая 2009

В IE существует .setCapture (); Функции .releaseCapture (). Что эквивалентно этим функциям в Firefox без использования jQuery? (мой клиент не хочет его использовать)

Ответы [ 10 ]

12 голосов
/ 24 мая 2009

Как уже было сказано выше, Firefox не предлагает эту функциональность, и вы можете обойти ее, отслеживая события во всем документе. Чтобы быть уверенным, что лучшего трюка нет, я только что проверил пользовательский интерфейс jQuery, и похоже, что они используют тот же подход. Так, например, если вы хотите фиксировать движения мыши, когда мышь не работает в jQuery, вы должны сделать:

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

function captureMouseMove(event)
{
    // ...
}
8 голосов
/ 12 декабря 2012

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

setCapture и releaseCapture были добавлены в Firefox 4 (с выпуском Gecko 2) 22 марта 2011 года. Однако в WebKit (Chrome / Safari) все еще отсутствуют эти функции.

2 голосов
/ 24 мая 2013

@ Решение 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);
}                       
2 голосов
/ 15 мая 2012

Я думаю, что element.setCapture () и document.releaseCapture () были добавлены в Firefox начиная с FF4: https://developer.mozilla.org/en/DOM/element.setCapture

"Вызвать метод element.setCapture () во время обработки события mousedown, чтобы перенаправить все события мыши на этот элемент, пока кнопка мыши не будет отпущена или не будет вызван document.releaseCapture ()."

2 голосов
/ 20 сентября 2011

Захват мыши в любое время - плохое поведение, я думаю, поэтому setCapture не предусмотрено.

Однако, чтобы захватить мышь для перетаскивания, вам просто нужно обработать события мыши (мышь {вверх, вниз, перемещение}) объекта document, которые могут срабатывать при перетаскивании даже за пределы клиентская зона.

<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>
1 голос
/ 04 мая 2009

Использовать всплывающее окно событий: добавьте прослушиватели событий для всплывающих событий мыши в контейнер высокого уровня (возможно, даже document) и используйте переменную для отслеживания того, какой элемент должен быть захватывающим.

Без дополнительной информации о том, что вы пытаетесь сделать, больше нечего сказать.

0 голосов
/ 14 августа 2014

Используйте true в качестве третьего параметра метода addEventListener для захвата. Например:

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

Используйте removeEventListener с теми же параметрами для разблокировки:

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

Ссылки

0 голосов
/ 04 мая 2009

setCapture () и releaseCapture () являются нестандартными методами, специфичными для Internet Explorer. В Firefox нет реализации. Существует фреймворк под названием Gimme, который дает вам некоторые функции захвата мыши. http://www.codeplex.com/gimme/

0 голосов
/ 04 мая 2009

SetCapture и ReleaseCapture являются частными функциями IE, как вы обнаружили. В Firefox нет собственного способа манипулировать меню контента таким же образом.

Кажется, что это возможно с Gimme, который можно найти по адресу http://www.codeplex.com/gimme/Wiki/Recent.aspx. Здесь есть запись в блоге: http://blog.stchur.com/2007/11/21/setcapture-with-gimme, которая описывает один сценарий использования этого для замены функций.

0 голосов
/ 04 мая 2009

В FF / JavaScript такой функции нет. Функции захвата существуют только в JScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...