Skip to content

Commit

Permalink
Fix touch events if canvas is inside a scrolled container (see issue #…
Browse files Browse the repository at this point in the history
…123).

Fix bug if mouse moves over absolute scrolled element while object scaling (see issue #385). Also if mouse is moved over documentElement (fabric.document) while scaling object is fixed (same issue like #385).

Tested with Safari 5.1.7, 6.1, Firefox 18, 3.6.28, Chrome 24/25beta, Opera 12.12 and iPhone iOS 6.1, iPad iOS 6.1 in non-scrolled and scrolled containers.
  • Loading branch information
Kienz committed Feb 1, 2013
1 parent 69f1b20 commit ddaf8ba
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 12 deletions.
4 changes: 2 additions & 2 deletions src/canvas.class.js
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@
_setupCurrentTransform: function (e, target) {
var action = 'drag',
corner,
pointer = getPointer(e);
pointer = getPointer(e, target.canvas.upperCanvasEl);

corner = target._findTargetCorner(e, this._offset);
if (corner) {
Expand Down Expand Up @@ -774,7 +774,7 @@
* @return {Object} object with "x" and "y" number values
*/
getPointer: function (e) {
var pointer = getPointer(e);
var pointer = getPointer(e, this.upperCanvasEl);
return {
x: pointer.x - this._offset.left,
y: pointer.y - this._offset.top
Expand Down
4 changes: 2 additions & 2 deletions src/canvas_events.mixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@

// We initially clicked in an empty area, so we draw a box for multiple selection.
if (groupSelector !== null) {
pointer = getPointer(e);
pointer = getPointer(e, this.upperCanvasEl);

groupSelector.left = pointer.x - this._offset.left - groupSelector.ex;
groupSelector.top = pointer.y - this._offset.top - groupSelector.ey;
Expand Down Expand Up @@ -323,7 +323,7 @@
}
else {
// object is being transformed (scaled/rotated/moved/etc.)
pointer = getPointer(e);
pointer = getPointer(e, this.upperCanvasEl);

var x = pointer.x,
y = pointer.y;
Expand Down
2 changes: 1 addition & 1 deletion src/object_interactivity.mixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
_findTargetCorner: function(e, offset) {
if (!this.hasControls || !this.active) return false;

var pointer = getPointer(e),
var pointer = getPointer(e, this.canvas.upperCanvasEl),
ex = pointer.x - offset.left,
ey = pointer.y - offset.top,
xpoints,
Expand Down
28 changes: 21 additions & 7 deletions src/util/dom_event.js
Original file line number Diff line number Diff line change
Expand Up @@ -172,27 +172,41 @@
* @method getPointer
* @memberOf fabric.util
* @param {Event} event
* @param {HTMLCanvasElement} upperCanvasEl <canvas> element on which object selection is drawn
*/
function getPointer(event) {
function getPointer(event, upperCanvasEl) {
event || (event = fabric.window.event);

var element = event.target || (typeof event.srcElement !== 'unknown' ? event.srcElement : null),
body = fabric.document.body || {scrollLeft: 0, scrollTop: 0},
docElement = fabric.document.documentElement,
orgElement = element,
scrollLeft = 0,
scrollTop = 0,
firstFixedAncestor;

while (element && element.parentNode && !firstFixedAncestor) {
element = element.parentNode;
element = element.parentNode;

if (element !== fabric.document && fabric.util.getElementPosition(element) === 'fixed') firstFixedAncestor = element;
if (element !== fabric.document && fabric.util.getElementPosition(element) === 'fixed') firstFixedAncestor = element;

if (element !== fabric.document && orgElement !== upperCanvasEl && fabric.util.getElementPosition(element) === 'absolute') {
scrollLeft = 0;
scrollTop = 0;
}
else if (element === fabric.document && orgElement !== upperCanvasEl) {
scrollLeft = body.scrollLeft || docElement.scrollLeft || 0;
scrollTop = body.scrollTop || docElement.scrollTop || 0;
}
else {
scrollLeft += element.scrollLeft || 0;
scrollTop += element.scrollTop || 0;
}
}

return {
x: pointerX(event) + scrollLeft,
y: pointerY(event) + scrollTop
x: pointerX(event) + scrollLeft,
y: pointerY(event) + scrollTop
};
}

Expand All @@ -209,10 +223,10 @@

if (fabric.isTouchSupported) {
pointerX = function(event) {
return event.touches && event.touches[0] && event.touches[0].pageX || event.clientX;
return (event.touches && event.touches[0] ? (event.touches[0].pageX - (event.touches[0].pageX - event.touches[0].clientX)) || event.clientX : event.clientX);
};
pointerY = function(event) {
return event.touches && event.touches[0] && event.touches[0].pageY || event.clientY;
return (event.touches && event.touches[0] ? (event.touches[0].pageY - (event.touches[0].pageY - event.touches[0].clientY)) || event.clientY : event.clientY);
};
}

Expand Down

0 comments on commit ddaf8ba

Please sign in to comment.