Подтвердить что ты не робот

Как поймать событие mouse-up вне элемента?

У меня есть простой Javascript-код, похожий на этот:

var mouseIsDown = false;
...
function canvasMouseDown(e) {
  ...
  mouseIsDown = true;
}
function canvasMouseUp(e) {
  mouseIsDown = false;
}
function canvasMouseMove(e) {
  if (mouseIsDown) {
    ...
  }
}

с реализацией моего собственного пользовательского интерфейса для преобразований (трансляции, масштабирование и вращения) с холстом.

Такая реализация в canvasMouseMove() проверяет функцию mouseIsDown. Все работает отлично, если пользователь не отпускает кнопку мыши, когда курсор/указатель находится за пределами элемента холста. Если это произойдет, переменная mouseIsDown останется true и не отключена функцией canvasMouseUp.

Что такое легкое исправление или решение в чистом JavaScript (без jQuery) для этой проблемы?

4b9b3361

Ответ 1

Если вы хотите перехватить событие mouseup где-нибудь еще в документе, вы можете добавить обработчик события для этого в элемент documentelement. Обратите внимание, что это не будет реагировать на события mouseup вне области просмотра, поэтому вы можете захотеть запустить также, когда мышь снова войдет в область просмотра без нажатой кнопки.

Если вы хотите поймать мышь, покидающую элемент canvas, это немного сложнее. В то время как IE знает mouseleave событие, стандарт DOM имеет mouseout событие, которое также пожары, когда потомок вашего элемента слева (хотя холст, как правило, не имеет дочерних элементов). Подробнее об этом на quirksmode.org.

Я создал скрипку, чтобы продемонстрировать поведение (работает только с W3 DOM). Вы можете попытаться изменить documentelement на body. В Opera, то mouseup слушатель на <html> событии обнаруживает mouseup события за пределами документа, когда "перетащить" начал внутри него - я не знаю, что ли стандартное поведение.

Ответ 2

document.onmouseup будет выбрасываться даже за пределы области просмотра, что хорошо известно, что вы получаете только привязку к объекту документа. test здесь: http://jsfiddle.net/G5Xr2/

$(document).mouseup(function(e){
  alert("UP" + e.pageX);
});

Он даже получит положение мыши!

Ответ 3

Добавьте обработчик события более высокого уровня (возможно, в тело), ​​который ловит событие mouseUp и устанавливает mouseIsDown в false.

Вот демо: http://jsfiddle.net/ZFefV/

Ответ 4

window.addEventListener('mouseup', function(event){
// do logic here
})

Он обрабатывает выведение мыши даже за пределы браузера

Ответ 5

Я создал переменную, которая сохранила строку id целевого элемента после mousedown. В событии mouseup я проверяю строку, чтобы увидеть, является ли она нулевой. Если это не так, я использую строку для получения элемента и выполняю все, что захочу, в блоке кода, а затем reset переменную до нуля.

Иными словами, шаги:

1.) введите переменную, установите ее в значение null. 2.) на "mousedown", сохраните строку id или class в переменной. 3.) на "mouseup", проверьте переменную (для безопасности). Если это не пусто. затем используйте строку, чтобы захватить элемент и использовать его для чего-то. 4.) Затем reset переменная в null.

var thisTarget = null

// when I know they click in the right place, save the target. 
// you may not need parent(). I was using a UI slider and needed it.

$(".section").mousedown( function(e) {
    thisTarget = $(e.target.parent().attr('id');
    console.log(thisTarget);
});

// anywhere on the page... 
$(document).mouseup( function(e) { 
    // because I'll make it null after every mouseup event.
    if (thisTarget !== null) { 
        console.log( $("#" + thisTarget) ); // returns element
        // do something with it
        thisTarget = null;
    }
});

Ответ 6

В JavaScript это будет следующим:

myElement.addEventListener('mousedown', () => {
  const handleMouseUp = (event) => {
    // check whether outside the element with event.target and myElement

    document.removeEventListener('mouseup', handleMouseUp);
  };

  document.addEventListener('mouseup', handleMouseUp);
})