1

Я пытаюсь обнаружить события старта/перетаскивания событий на элементе. Иногда эти события, похоже, не срабатывают. Источник находится на JSFiddle. Попробуйте удерживать мышь в оранжевой полосе и перетаскивать ее, чтобы создать интервалы (синим цветом). В Chrome попробуйте сделать это 3 раза. В третий раз, я замечаю почти всегда, событие mouseup не запускается, что делает эффект странным. Даже когда мышь не будет нажата, событие перетаскивания еще срабатываетСобытия мыши не запускаются после нескольких щелчков по элементу

Video on Screenr

$ -> 
    isMouseDown = false 
    isDragging = false 
    $draggedInterval = undefined 
    $test = $("#test") 
    $test 
     # code related to attaching handlers to trigger custom events 
     .on "mousedown", -> 
      isMouseDown = true 
     .on "mouseup", (evt) -> 
      isMouseDown = false 
      if isDragging 
       $test.trigger("x-stopDrag", evt) 
       isDragging = false 
      else 
       $test.trigger("x-click", evt) 
     .on "mousemove", (evt) -> 
      console.log isMouseDown, isDragging 
      if isMouseDown && not isDragging 
       $test.trigger("x-startDrag", evt) 
       isDragging = true 
      if isDragging 
       $test.trigger("x-drag", evt) 
     .on "mouseleave", (evt) -> 
      isMouseDown = false 
      if isDragging 
       isDragging = false 
       $test.trigger("x-cancelDrag", evt) 
     # handlers for custom events 
     .on "x-startDrag", (x, evt) -> 
      console.log("started dragging") 
      $draggedInterval = $("<div>", { 
       class: "interval" 
       css: 
        left: evt.clientX 
      }).appendTo($test) 
     .on "x-stopDrag", (x, evt) -> 
      console.log("stopped dragging") 
      $draggedInterval = undefined 
     .on "x-cancelDrag", -> 
      console.log("canceled dragging") 
      $draggedInterval.remove() 
      $draggedInterval = undefined 
     .on "x-click", (x, evt) -> 
      console.log("click") 
     .on "x-drag", (x, evt) -> 
      console.log("drag") 
      $draggedInterval.css("width", evt.clientX - $draggedInterval.position().left) 

Появляется работать в Firefox и IE10

ответ

4

Проблема в том, что вы должны использовать user-select свойство и установить это до none, так что div нельзя выбрать и вести себя нормально для событий мыши (это то, что обычно делается для сложных элементов пользовательского интерфейса).

http://www.w3.org/TR/2000/WD-css3-userint-20000216#user-select:

ни: Ни одно из содержимого элемента может быть выбран. Это очень важное значение значение user-select для элементов пользовательского интерфейса в в частности. Это значение является одним из аспектов поведения кнопки. Пользователь не может выбрать любое содержимое внутри кнопки. Если для примера пользователь использует указательное устройство для клика по элементу с помощью user-select: none, что происходит, когда кнопка указывающего устройства «вниз» адресуется свойством пользователя, тогда как при этом указывая кнопка устройства «освобождена», это свойство гарантирует, что выбор содержимого элемента может отсутствовать . Другой способ: объяснить, что пользователь выбирает: none - это то, что дает кнопку «push-button-springy». Значение «none» также полезно для статических текстовых меток в пользовательском интерфейсе, которые не предназначены для выбора . Например, в заголовке окна сообщения электронной почты не может быть выбрана часть , в которой указано «Имя:», тогда как это может быть содержимое . Такая статическая текстовая метка также имеет пользовательский ввод: none.

Я видел эту ошибку из-за не разрешенные курсора: not-allowed cursor

Вот исправленный JS-скрипка: http://jsfiddle.net/r8Phv/7/

пользователь выберите еще не реализован в браузерах, но префиксы для разработчиков работают для Firefox2 +, Chrome 6+, Opera 15 и IE 10.

Ниже приведены таблицы поддержки для пользовательского выбора: http://caniuse.com/user-select-none

Смежные вопросы