2015-09-20 1 views
0

У меня проблема с удалением прослушивателя событий из моего документа. В настоящее время я добавляю функцию в документ в свою функцию «drag_delta» и удаляю ее в своей функции «drag_stop». Я пытаюсь получить дельту мыши, перетаскивая изображение, используя данные clientY, и сравнивая его с clientY от события «начать перетаскивание». Текущий код выполняется до функции drag_stop, полностью игнорируя его (я попробовал распечатать слово «run», чтобы узнать, признает ли его даже его подтверждение). Я написал это в JSX, поскольку я использую React.- ДжастинEvent Listener не удаляется

//Creation of class, and initial state set 
var Knob = React.createClass({ 
    getInitialState: function(){ 
    return{season: 1}; 
    }, 

drag_start: function(data){ 
    var startPos = data.clientY; 
    console.log(startPos); 
    document.addEventListener("mousemove",this.drag_delta); 
}, 

    drag_delta: function(data){ 
    console.log(data.clientY); 
    this.setState({season: data.clientY}); 
    document.addEventListener("mouseup",this.drag_stop); 
    }, 

    drag_stop: function(data){ 
    document.removeEventListener("mousemove",this.drag_stop); 
    console.log("run"); 
    }, 

render: function(){ 
    return(
      <div> 
      <img src = "../style/img/wood-bg.png" /> 
      <img src ={ '../style/img/Seasons/sprites_cut/'+this.state.season+'.png'} ref = "season" onDragStart = {this.drag_start} /> 
      </div> 
    );//Ed 
    } //end render function 
}); //end knob class 

React.render(<Knob />, mountNode); 
+1

Проблема в том, что события перетаскивания отличаются от событий мыши. Если вы слушаете 'dragstart', тогда вы должны слушать« dragover »и« dragend »(или« drop'). 'mouseover' и' mouseup' не будут запущены. Я предлагаю прочитать больше о перетаскивании на MDN: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Drag_and_drop. Или вы предотвращаете перетаскивание, и в этом случае вы могли бы использовать обычные события мыши ... –

+0

ОК, так почему же «mousemove» срабатывает и печатает на консоли при каждом движении мыши? Я запускаю «onDragStop» в JSX, а затем использую «mouseup» в классе React как простой javascript. –

+1

Я сделал скрипку здесь: https://jsfiddle.net/5oohsd3q/. Вы правы, «mousemove» запускается, но только * один раз *, а не непрерывно. Освобождение кнопки мыши не вызывает «мыши». Вы можете видеть, что вместо событий 'mousemove' продолжают срабатывать, пока вы не нажмете (' mousedown' + ** 'mouseup' **) еще раз. По крайней мере, это поведение, которое я наблюдаю в Chrome и Firefox. –

ответ

0

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

модель события отличается от модели событий в ОС (windows/mac, они могут вступить в силу сразу), процесс события обновляется только после завершения текущего круга процессов, то, что изменилось для обработки событий, только начнет действовать в следующий круг обработки событий.