Its a known issue https://github.com/kangax/fabric.js/issues/1188 due to an 'optimization'.
I solved it by commenting out the first if statement in _searchPossibleTargets,
fabric.util.object.extend(fabric.Canvas.prototype, {
_searchPossibleTargets: function(e) {
// Cache all targets where their bounding box contains point.
var target,
pointer = this.getPointer(e);
/*
if (this._activeObject && this._checkTarget(e, this._activeObject, pointer)) {
this.relatedTarget = this._activeObject;
return this._activeObject;
}
*/
var i = this._objects.length;
while(i--) {
if (this._checkTarget(e, this._objects[i], pointer)){
this.relatedTarget = this._objects[i];
target = this._objects[i];
break;
}
}
return target;
}
});
The purpose of the if is to return the current active object it the mouse is within it, regardless of object order. Its an optimization if you have a ton of objects and prevents you from checking all objects before it.