Javascript 在mousedown和mouseup上绑定和解除绑定mousedown处理程序
我有一个html表,其中包含拖放列、可调整大小的行和可调整大小的列,这些列根据mousedown、mousemove和mouseup进行更改。为了获得更好的性能,我是否应该让文档在mousemove期间不断检查“鼠标是否已放下,如果是,是否用于拖放、可调整大小的行或可调整大小的列”,或者我是否应该在mousemove位于特定位置时将mousemove处理程序附加到文档,然后在mouseup时将其卸下?单击后绑定和解除绑定处理程序的成本有多高?下面是一个文档始终检查mousedown与仅在mousedown和鼠标单击之间检查的示例:Javascript 在mousedown和mouseup上绑定和解除绑定mousedown处理程序,javascript,jquery,binding,mousemove,mousedown,Javascript,Jquery,Binding,Mousemove,Mousedown,我有一个html表,其中包含拖放列、可调整大小的行和可调整大小的列,这些列根据mousedown、mousemove和mouseup进行更改。为了获得更好的性能,我是否应该让文档在mousemove期间不断检查“鼠标是否已放下,如果是,是否用于拖放、可调整大小的行或可调整大小的列”,或者我是否应该在mousemove位于特定位置时将mousemove处理程序附加到文档,然后在mouseup时将其卸下?单击后绑定和解除绑定处理程序的成本有多高?下面是一个文档始终检查mousedown与仅在mous
/* document is always checking mousemove */
$(selector).mousedown(function(){
dropndrag = true;
});
$(document).mousemove(function(){
if (dropndrag == true) {
//do mouse move stuff
}
});
$(document).mouseup(function(){
if (dropndrag == true) {
dropndrag = false;
}
});
/* mousemove only bound to document after mousedown */
$(selector).mousedown(function(){
// attach handlers
$(document).mousemove(mousemove);
$(document).mouseup(mouseup);
});
function mousemove(){
// do mouse move stuff;
};
function mouseup() {
//unbind mousemove and mouseup handlers
$(document).off('mousemove', mousemove);
$(document).off('mouseup', mouseup);
}
实际上,最快的方法可能是事件委派:
document.addEventListener('onmousemove',myEventHandler)代码>
有一个很好的例子和讨论为什么这是最快的
更好的方法是将事件侦听器附加到特定的DOM对象,在您的示例中,是一个包装表的
或类似的对象:
document.getElementById(“mydiv”).addEventListener(“单击”,函数(){
document.getElementById(“demo”).innerHTML=“Hello World”
(示例来自。)
通过这种方式,您可以避免重复附加和删除处理程序的开销,还可以避免处理程序被不会触发任何更改的事件触发(即在鼠标向下移动页面中的其他位置时移动鼠标).毫无疑问,绑定/解除绑定是多余的操作,我确信这比存储状态的“全局”上下文中的1个变量要慢。
此外,一个好的做法是为每个事件和筛选器设置一个文档侦听器,例如“开关/案例”,它只会为某些元素启动函数,例如:
var events = ['mousedown', 'mouseup', 'mousemove'];
var dragged = false;
var eventHandler = function (e) {
switch (e.type) {
case 'mousedown':
switch (e.srcElement.id) {
case 'test-block':
if (dragged) return;
dragged = true;
console.log('you clicked on the test-block');
break;
}
break;
case 'mouseup':
break;
case 'mousemove':
break;
}
};
for (var i = 0; i < events.length; i++) {
$(document)[events[i]](eventHandler);
}
var events=['mousedown','mouseup','mousemove'];
var=false;
var eventHandler=函数(e){
开关(e型){
案例“mousedown”:
开关(e.srcElement.id){
案例“试块”:
如果(拖动)返回;
拖动=真;
log(“您单击了测试块”);
打破
}
打破
“鼠标”一案:
打破
案例“mousemove”:
打破
}
};
对于(var i=0;i
我总是喜欢检查变量,似乎更快!