Я пытался что-то придумать, но это стало немного многословно ...
Все сводится к созданию Box
функции, экземпляры которой представляют собой блоки. При рисовании вы перебираете их и рисуете. Функции select
и unselect
экземпляра Box
могут использоваться для его выбора; затем вы можете использовать selectedBox
для доступа к выбранному в данный момент блоку и установки свойств. Практически это довольно бессмысленный пример, но я надеюсь, что он выведет вас на правильный путь.
http://jsfiddle.net/pimvdb/eGjak/82/
var cv = $('#cv');
var ctx = cv.get(0).getContext('2d');
var Box = function(x, y, w, h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.color = 'red';
};
Box.prototype.select = function() {
if(selectedBox === this) {
selectedBox = null;
$('#status').html('unselected');
} else {
selectedBox = this;
$('#status').html('selected');
}
};
Box.prototype.unselect = function() {
selectedBox = null;
$('#status').html('unselected');
};
var boxes = [];
var downCoords = [];
var isMoving = false;
var selectedBox;
cv.mousedown(function(e) {
downCoords = [e.offsetX, e.offsetY];
isMoving = false;
}).mousemove(function() {
isMoving = true;
}).mouseup(function(e) {
var minx = Math.min(downCoords[0], e.offsetX);
var maxx = Math.max(downCoords[0], e.offsetX);
var miny = Math.min(downCoords[1], e.offsetY);
var maxy = Math.max(downCoords[1], e.offsetY);
boxes.push(new Box(minx, miny, maxx - minx, maxy - miny));
draw();
}).click(function(e) {
if(isMoving) return;
isMoving = false;
var x = e.offsetX,
y = e.offsetY;
for(var i = boxes.length - 1; i >= 0; i--) {
var box = boxes[i];
if(between(x, box.x, box.x + box.w)
&& between(y, box.y, box.y + box.h)) {
box.select();
break;
}
}
draw();
});
$('button').click(function() {
if(!selectedBox) return;
selectedBox.color = 'blue';
selectedBox.unselect();
draw();
});
function between(x, a, b) {
return x > a && x < b;
}
function draw() {
ctx.clearRect(0, 0, 400, 400);
for(var i = 0; i < boxes.length; i++) {
var box = boxes[i];
ctx.beginPath();
ctx.rect(box.x, box.y, box.w, box.h);
if(selectedBox && box != selectedBox) {
ctx.globalAlpha = 0.25;
}
ctx.fillStyle = box.color;
ctx.fill();
ctx.stroke();
ctx.globalAlpha = 1;
}
}