我试图在Canvas中用Canvas作为渲染器在Dojo的gfx中实现橡皮筋选择框。我的意图是在鼠标点击并拖动时绘制选择框,然后在释放鼠标后消失。不幸的是我遇到了一个问题。Dojo gfx:onmousemove连接到一个形状clobbering onmouseup?
的jsfiddle例如:http://jsfiddle.net/7F9fy/
的主要问题是在某处的OnMouseMove(或与其相关的):
whiteRect.connect("onmousemove",function(e) {
if(isMouseDown) {
if(whiteRect.groupSelector_) {
pStat.innerHTML = "dragging...";
console.debug("dragging...");
e.stopImmediatePropagation();
e.preventDefault();
var ex = (e.x ? e.x : e.clientX);
var ey = (e.y ? e.y : e.clientY);
if(groupSelector) {
// Also tried getShape, editing that shape, and setShape on groupSelector--same
// behavior, though.
var rectX = (ex - cnvDiv.offsetLeft < whiteRect.groupSelector_.x ? ex - cnvDiv.offsetLeft : whiteRect.groupSelector_.x);
var rectY = (ey - cnvDiv.offsetTop < whiteRect.groupSelector_.y ? ey - cnvDiv.offsetTop : whiteRect.groupSelector_.y);
surface.remove(groupSelector);
groupSelector = surface.createRect({
x: rectX,
y: rectY,
width: Math.abs(ex - cnvDiv.offsetLeft - whiteRect.groupSelector_.x),
height: Math.abs(ey - cnvDiv.offsetTop - whiteRect.groupSelector_.y)
}).setStroke({color: "blue", width: 3});
} else {
groupSelector = surface.createRect({
x: whiteRect.groupSelector_.x,
y: whiteRect.groupSelector_.y,
width: Math.abs(ex - cnvDiv.offsetLeft - whiteRect.groupSelector_.x),
height: Math.abs(ey - cnvDiv.offsetTop - whiteRect.groupSelector_.y)
}).setStroke({color: "blue", width: 3});
}
e.stopPropagation();
}
}
});
如果我按住形状/组中的鼠标左键(白色正方形在上面的例子中),我的鼠标事件连接到并开始拖动,框开始绘制,跟随我的拖动。当我释放鼠标时,有时候框会消失,有时它不会。如果没有,盒子会不断被绘制,并按照鼠标移动的方式进行拖动。
在jsFiddle中,如果您在画布下观看console.debug或段落记者,您会发现有时,当您释放鼠标时,onmouseup不会触发(我也检查过mouseup,但那有同样的问题)。在onmouseup从不发射的情况下,onmousemove继续发射。如果再次点击,有时会点击一个完整的鼠标点击(向下,向上,点击和移动),然后使绘制的矩形消失。但有时候这并不会发生,而且onmousemove一直在开火。如果在拖动/ onmousemove变为'卡住'并且没有任何事情发生后单击,则没有调试行或针对这些事件对记录进行更改,因此就像除了onmousemove之外的所有鼠标事件都被压制一样。我尝试添加stopPropagation,stopImmediatePropagation和preventDefault,但这没有帮助。我也尝试使用Dojo事件的停止,但这并没有改变行为。
为了重新绘制onmousemove中的框,我尝试了'getShape - >编辑属性 - > setShape'以及删除形状并制作一个全新的形状;这些方法都不能阻止这个问题,它们之间没有任何明显的区别。
我使用的是Dojo 1.8.3,这种情况发生在Chrome(v25)和Firefox(v19)中,Canvas或SVG作为渲染器。
想法?我在这里错过了很明显的东西吗