Canvas をレンダラーとして Dojo の gfx にラバーバンド選択ボックスを実装しようとしています。私の意図は、マウスをクリックしてドラッグすると選択ボックスが描画され、マウスが離されると消えることです。残念ながら、私は問題に遭遇しました。
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 が「動かなくなった」後にクリックしても何も起こらない場合、これらのイベントのデバッグ行やレポーターへの変更はありません。stopPropagation、stopImmediatePropagation、preventDefault を追加しようとしましたが、役に立ちませんでした。
onmousemove でボックスを再描画するために、「getShape -> プロパティの編集 -> setShape」の両方を試し、形状を削除してまったく新しい形状を作成しました。これらの方法のどちらも問題を止めず、それらの間に大きな違いはありませんでした.
私は Dojo 1.8.3 を使用しています。これは Chrome (v25) と Firefox (v19) の両方で発生し、キャンバスまたは SVG をレンダラーとして使用します。
考え?ここで明らかな何かが欠けていますか?