Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 事件侦听器未删除_Javascript_Javascript Events_Reactjs_React Jsx - Fatal编程技术网

Javascript 事件侦听器未删除

Javascript 事件侦听器未删除,javascript,javascript-events,reactjs,react-jsx,Javascript,Javascript Events,Reactjs,React Jsx,我遇到一个问题,涉及从文档中删除事件侦听器。目前,我在“drag_delta”函数中将该函数添加到文档中,并在“drag_stop”函数中将其删除。我试图通过使用clientY数据获取鼠标拖动图像的增量,并将其与“on drag start”事件中的clientY进行比较。当前代码一直执行到drag_stop函数,完全忽略它(我试着打印“run”一词,看它是否确认)。我用JSX写的,因为我用的是React-Justin //Creation of class, and initial state

我遇到一个问题,涉及从文档中删除事件侦听器。目前,我在“drag_delta”函数中将该函数添加到文档中,并在“drag_stop”函数中将其删除。我试图通过使用clientY数据获取鼠标拖动图像的增量,并将其与“on drag start”事件中的clientY进行比较。当前代码一直执行到drag_stop函数,完全忽略它(我试着打印“run”一词,看它是否确认)。我用JSX写的,因为我用的是React-Justin

//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);
//创建类和初始状态集
变量旋钮=React.createClass({
getInitialState:函数(){
返回{季节:1};
},
拖放开始:函数(数据){
var startPos=data.clientY;
console.log(startPos);
document.addEventListener(“mousemove”,this.drag_delta);
},
拖动增量:函数(数据){
console.log(data.clientY);
this.setState({seasure:data.clientY});
document.addEventListener(“mouseup”,此为.drag_-stop);
},
拖放停止:函数(数据){
document.removeEventListener(“mousemove”,this.drag_-stop);
控制台日志(“运行”);
},
render:function(){
返回(
);//埃德
}//结束渲染函数
}); //末端旋钮类
React.render(,mountNode);

> p>这与浏览器中的事件处理有关,在鼠标移动中间将鼠标绑定起来,这意味着直到当前鼠标移动事件完成,事件处理模型才会更新。所以,当您完成移动事件(拖动并向上移动鼠标)时,新的向上移动事件将生效,这一点已被Felix的观察所证实


事件模型不同于操作系统中的事件模型(windows/mac,它们可以立即生效),事件进程仅在完成当前进程循环时更新,您为事件处理所做的更改将仅在下一个事件处理循环中开始生效。

问题在于拖动事件与鼠标事件不同。如果听
dragstart
,则必须听
dragover
dragend
(或
drop
mouseover
mouseup
不会被激发。我建议阅读更多关于MDN上拖放的内容:。或者防止拖动,在这种情况下,您可以使用正常的鼠标事件…好吧,那么为什么每次移动鼠标时“mousemove”都会触发并打印到控制台?我在JSX中启动“onDragStop”,然后在React类中使用“mouseup”作为普通javascript。没错,
mousemove
会被触发,但只会触发一次,不会连续触发。释放鼠标按钮也不会触发
mouseup
。您可以看到,
mousemove
事件继续被触发,直到您再次单击(
mousedown
+
mouseup
)。至少这是我在Chrome和Firefox中观察到的行为。对,这是我的问题,我只需要在用户移动鼠标和按住鼠标按钮时使用该客户端。一旦发布,事件侦听器应该被删除并停止更新clientY位置。正如我所说的,您可能需要收听
dragover
dragend
。你试过了吗?