Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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 D3拖动事件多久触发一次?_Javascript_Performance_Events_D3.js_Onmousemove - Fatal编程技术网

Javascript D3拖动事件多久触发一次?

Javascript D3拖动事件多久触发一次?,javascript,performance,events,d3.js,onmousemove,Javascript,Performance,Events,D3.js,Onmousemove,我有一个关于拖拽的非常普通的低级问题。我特别感兴趣的是学习D3.js v4中何时触发拖动事件的确切决定因素。例如,如果我非常缓慢地移动被拖动的对象,则拖动事件将激发我移动的每个像素。但是,如果我移动得相当快,拖动事件不会与我移动的像素量以一对一的关系触发 我目前正在研究这个问题,主要是Chrome开发性能标签;我想这会(希望)给我一些启示。我也知道有一些去抖动功能可以限制事件的调用次数;然而,我不知道或看不到D3有这个。我认为拖动调用减少的原因可能与Chrome内部的某些东西有关,也许它只是根据

我有一个关于拖拽的非常普通的低级问题。我特别感兴趣的是学习D3.js v4中何时触发拖动事件的确切决定因素。例如,如果我非常缓慢地移动被拖动的对象,则拖动事件将激发我移动的每个像素。但是,如果我移动得相当快,拖动事件不会与我移动的像素量以一对一的关系触发

我目前正在研究这个问题,主要是Chrome开发性能标签;我想这会(希望)给我一些启示。我也知道有一些去抖动功能可以限制事件的调用次数;然而,我不知道或看不到D3有这个。我认为拖动调用减少的原因可能与Chrome内部的某些东西有关,也许它只是根据鼠标移动的速度使用某种算法来调用拖动。这似乎是最有可能的答案,但如果有人能给我一些关于这种行为到底是如何决定的见解,我将不胜感激

最后一件事:我还意识到,有时当您快速移动鼠标光标,使其“退出”正在拖动的对象时,不应调用拖动事件。但是,即使我没有“离开”正在拖动的对象,根据我移动鼠标光标的速度,仍有较少的拖动调用


p、 当我使用D3时,这个问题很可能只是一般的拖动问题,而不是D3特有的问题…

您看到的问题与D3没有什么关系,它是一个一般的JavaScript行为,或者更好的是,一个与浏览器相关的行为:您看到的是
mousemove
的一个特性

如果查看,您将看到“拖动”事件使用
mousemove
(或
touchmove
用于触摸设备):

拖动-活动指针移动后(在mousemove或touchmove上)

现在是重要信息:
mousemove
由浏览器生成。更重要的是,浏览器没有义务以任何特定的速率生成事件,无论是与距离还是时间有关。此外,其他因素可能会影响
mousemove
的频率,例如您使用的硬件

因此,如果我们假设(只是为了简化)浏览器每100ms生成一个
mousemove
事件,那么您可以对所描述的行为进行简单的解释:

假设
speed=distance/time
,如果您将鼠标移动得更快,则从A点到B点的事件将更少(即,从
mousemove
事件到下一个事件的距离将更大)。如果您将鼠标移动得较慢,则从A点到B点的事件会更多(也就是说,从
mousemove
事件到下一个事件的距离会更小)。如果您以低于1px/100ms的速度移动鼠标(在我们假设的场景中),则每像素将有1个事件

最后,这里是一个非常简单的演示。单击并拖动SVG中的任意位置:

var计数=0;
d3.select(“svg”).call(d3.drag().on(“start”,function()){
log(“拖动已启动”)
}).on(“拖动”,函数(){
++计数;
console.log(“拖动事件”+计数)
}).on(“结束”,函数(){
计数=0;
console.log(“拖动结束”)
}))
。作为控制台包装{最大高度:20%!重要;}
svg{
边框:1px纯黑;
}


非常感谢您的及时回复。你说的和我怀疑的差不多;我还做了一个类似的测试,就像您代码中的测试一样(谢谢)。很高兴确认它是一个由浏览器控制的东西,而不是像删除的事件或某种异步类型的计时器操作…或D3库的函数(不是双关语)。好吧,我想这也会帮助我看看W3。根据他们的说法(在第5.7.5节拖放处理模型中),拖动事件每350毫秒触发一次……之后会有更多信息;长话短说它肯定回答了我的问题。再次感谢。