События мыши не запускаются после нескольких кликов по элементу

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

Видео на 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


person Jiew Meng    schedule 11.07.2013    source источник


Ответы (1)


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

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

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

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

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

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

Вот таблицы поддержки для выбора пользователем: http://caniuse.com/user-select-none< /а>

person edi9999    schedule 11.07.2013