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