Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.04.2020, 13:43
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

Как правильно ловить нажатие и перемещение мыши?
Здравствуйте. Вот такое я сделала:
var startX = 0;
var mouse;

$('.container').on('touchstart mousedown', function (e) {
  mouse = "down";
  console.log("коснулись");
  startX = e.clientX;
  console.log(startX);


  if (mouse == "down") {
  $('.container').on('touchmove mousemove', function (e) {
    console.log("при движении",e.clientX)
  })
  } else {
    console.log("не нажато")
  }


  $('.container').on('touchend mouseup', function (e) {
    console.log("отпустили");
    mouse = "up";
    return;
  })
})

Я думала остановить return'ом функцию, но я останавливаю только touchend, а мне нужно остановить всю функцию, потому что даже когда я отпускаю мышь - у меня всё равно в логах пишет положение мыши. Подскажите, как правильно организовать это?
К чему я стремилась:
мне нужно, чтобы при нажатии на экран я получала текущее положение мыши и при перемещении с зажатой клавишей я получала новые значения. Потом я буду просто считать: на какое расстояние пользователь перетащил. Как только пользователь отпускает: функция останавливается.
Ответить с цитированием
  #2 (permalink)  
Старый 09.04.2020, 14:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,111

nastya97core,
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .container {
      height: 300px;
      width: 500px;
      border: 1px solid #FF0000
  }

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
    var startX = 0;
    var endX = 0;
    var mouse;
    var txt = '';
    $('.container').on('touchstart mousedown', function(e) {
        mouse = "down";
        startX = e.clientX;
        $('p').html(txt += '<br>коснулись  ' + startX + '<br>');

        function move(e) {
            $('p').html(txt += ", при движении " + e.clientX);
        }
        function end(e)
        {
          $(document).off('touchmove mousemove', move);
          endX = e.clientX;
          $('p').html(txt += "<br>отпустили " + endX);
          mouse = "up";
        }

        $(document).on('touchmove mousemove', move)
        $(document).one('touchend mouseup', end)
    })
});
  </script>
</head>
<body>

<div  class="container"></div>
<p></p>
</body>
</html>

Последний раз редактировалось рони, 09.04.2020 в 14:36.
Ответить с цитированием
  #3 (permalink)  
Старый 09.04.2020, 14:36
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

Rise,
я не нашла там ничего для себя. Мне нужно лишь останавливать mousemove, когда мышка отпускается
Ответить с цитированием
  #4 (permalink)  
Старый 09.04.2020, 14:43
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

События touch обрабатываются совсем по другому, чем mouse.
У touchEvent нет собственных свойств типа clientX и подобных ему.
Вместо этого там есть массивы точек касания (ведь может быть много точек касания пальцами)
event.touches - массив всех точек касания экрана в данный момент
event.changedTouches - массив точек, которые изменились со времени предыдущего события
event.targetTouches - массив точек, для которых касание было на текущем элементе
А уже каждая из точек имеет свойства .screenX, .screenY, .clientX, .clientY...
Кроме того, каждая точка имеет числовой идентификатор .identifier , по которому ее можно отыскать в этих массивах

Еще отличие в том, что события touchmove и touchend всегда посылаются тому элементу, на котором было touchstart, даже если точка уже ушла с этого элемента.

Последний раз редактировалось voraa, 09.04.2020 в 15:09.
Ответить с цитированием
  #5 (permalink)  
Старый 09.04.2020, 15:16
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

рони,
Спасибо! Не знала про .off

voraa,
и вам спасибо. сейчас поняла, какую ошибку сделала. не подумала, что у тача иначе ловится позиция. но мне в любом случае нужно ловить только один палец.

Сейчас смотрю и понимаю, что лучше отдельно сделать touch и отдельно mouse. Сейчас разбираюсь с пальцем, а он мне ошибку возвращает при отпускании

var startX = 0;
    var endX = 0;
    var mouse;
    $('.container').on('touchstart', function(e) {
        mouse = "down";
        startX = e.targetTouches[0].clientX;
        console.log("Коснулись",startX)

        function move(e) {
            console.log("Движение",e.targetTouches[0].clientX)
        }
        function end(e) {
          $(document).off('touchmove', move);
          endX = e.targetTouches[0].clientX;
          console.log("отпустили",endX) // это 80-я строка
          mouse = "up";
        }

        $(document).on('touchmove', move)
        $(document).one('touchend', end)
    })


Код:
Uncaught TypeError: Cannot read property 'clientX' of undefined
    at HTMLDocument.end ((index):80)

Последний раз редактировалось nastya97core, 09.04.2020 в 15:21.
Ответить с цитированием
  #6 (permalink)  
Старый 09.04.2020, 15:18
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

PointerEvents, конечно очень хорошая штука.
Но за одним исключением - кривоватенькая реализация в Файрфоксе на десктопе (для одной точки преодолимо, для двух и более точек мне не удалось уговорить Файрфокс работать). Полное отсутствие в мобильном Файрфоксе.
Ответить с цитированием
  #7 (permalink)  
Старый 09.04.2020, 15:24
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от nastya97core Посмотреть сообщение


Код:
Uncaught TypeError: Cannot read property 'clientX' of undefined
    at HTMLDocument.end ((index):80)
Так палец то уже убрали с экрана. Вот и нет ее в e.targetTouches[0]
Да и не нужна она. Потому, что сначала уже было обработано touchmove. А при убирание пальца позиция не изменяется.
Ответить с цитированием
  #8 (permalink)  
Старый 09.04.2020, 15:28
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

voraa,
да, разобралась уже))) спасибо!

а вот по поводу разделять код для мышки и для пальца я всё думаю... Можно ли сделать так, чтобы они не конфликтовали, потому что event один, а устройства (мышь и палец) у меня 2?
Ответить с цитированием
  #9 (permalink)  
Старый 09.04.2020, 15:38
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Что бы совсем не было конфликтов, надо использовать pointerEvents. Для одной точки касания нормально будут работать и в Файрфоксе (десктоп)
Но есть один конфликт между mouse и touch, который трудно преодолеть.
Когда указатель уходит с элемента, к которому прицеплены обработчики событий, события mousеmove, mouseup перестают ему поступать. А все события touch продолжают идти тому элементу, с которого началось касание.
Ответить с цитированием
  #10 (permalink)  
Старый 09.04.2020, 17:56
Аватар для nastya97core
Аспирант
Отправить личное сообщение для nastya97core Посмотреть профиль Найти все сообщения от nastya97core
 
Регистрация: 04.04.2020
Сообщений: 60

Rise,
voraa,
простите, я немного туплю. вы говорите про css свойство pointerEvents?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно организовать подключение скриптов? s24344 Общие вопросы Javascript 0 31.12.2018 11:53
Как правильно подключить стили в webpack? s24344 Сборка проекта, утилиты 0 08.11.2018 09:00
Пасоны, как правильно парсить параметры? megaupload Оффтопик 15 05.05.2013 14:44
Как правильно прицепить обработку события slowklg Events/DOM/Window 6 15.03.2012 16:20
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14