我正在尝试提高我的鼠标事件知识,所以这个问题是关于为什么我正在做的事情并没有比我是否可以使用拖放模块更有效。
我正在使用 Dojo,并且已连接到 mousedown 和 mouseup 事件。当有一个不是右键单击的 mousedown 事件时,我为 mousemove 设置了一个连接。在随后的 mouseup 事件中,我断开了该事件。这就是代码的样子:编辑(制作应该是一个自包含的例子)
obj = {
init: function(){
var c;
dojo.connect(dojo.doc, "mousedown", this, function(evt){
this.down(evt);
if(evt.button != dojo.mouseButtons.RIGHT){
this._isDown = true;
c = dojo.connect(dojo.doc, "mousemove", this, "drag");
}
});
dojo.connect(dojo.doc, "mouseup", this, function(evt){
dojo.disconnect(c);
this._isDown = false;
this.up(evt);
});
},//end init
drag: function(evt){
console.log("Mouse drag",evt);
},
up: function(evt){
console.log("Mouse up",evt);
},
down: function(evt){
console.log("Mouse down",evt);
}
}//end obj
编辑:要尝试这一点,请使用控制台在任何页面(带有 img)上注入 dojo,然后创建此 obj 并运行 obj.init()。注入 1.5:
document.documentElement.firstChild
.appendChild(document.createElement("script"))
.src='http://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js';
如果我单击文档的大部分内容,它对我来说看起来是对称的并且可以正常工作。但是,如果我单击一个图标并拖动它,“拖动”函数只会被调用一次(连接应该已经完成,所以光标的每次移动都会调用它),并且当我释放鼠标时不会调用 mouseup 事件.
然后下次我用鼠标按下它时,它会用新的连接覆盖 c ,这样我就永远无法断开前一个连接,因此我打算只用于拖动的活动变成了一个永久事件。
我实施的一个糟糕的解决方案是在连接“mousedown”连接之前断开连接。这样可以确保我不会收到永久的“拖动”呼叫,但仍然会给我留下“拖动”的恶意呼叫,直到我再次单击以取消设置。
关于为什么会发生这种情况的任何提示?