Skip to content

Commit

Permalink
Prevent click events on drag in zoom behaviour.
Browse files Browse the repository at this point in the history
You have to hold the mouse quite still though (see the zoom-pan
example).  Perhaps we should have a small allowance for jittery mice?

Fixes #243.
  • Loading branch information
jasondavies committed Aug 22, 2011
1 parent 402c2e4 commit dd2d490
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 7 deletions.
21 changes: 18 additions & 3 deletions d3.behavior.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ d3.behavior.zoom = function() {
.on("mousemove.zoom", d3_behavior_zoomMousemove)
.on("mouseup.zoom", d3_behavior_zoomMouseup)
.on("touchmove.zoom", d3_behavior_zoomTouchmove)
.on("touchend.zoom", d3_behavior_zoomTouchup);
.on("touchend.zoom", d3_behavior_zoomTouchup)
.on("click.zoom", d3_behavior_zoomClick, true);
}

// snapshot the local context for subsequent dispatch
Expand All @@ -31,6 +32,7 @@ d3.behavior.zoom = function() {
function mousedown() {
start.apply(this, arguments);
d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget));
d3_behavior_zoomMoved = false;
d3.event.preventDefault();
window.focus();
}
Expand Down Expand Up @@ -76,7 +78,8 @@ var d3_behavior_zoomDiv,
d3_behavior_zoomXyz,
d3_behavior_zoomDispatch,
d3_behavior_zoomTarget,
d3_behavior_zoomArguments;
d3_behavior_zoomArguments,
d3_behavior_zoomStopClick;

function d3_behavior_zoomLocation(point) {
return [
Expand Down Expand Up @@ -155,16 +158,28 @@ function d3_behavior_zoomTouchmove() {

function d3_behavior_zoomMousemove() {
d3_behavior_zoomZooming = null;
if (d3_behavior_zoomPanning) d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning);
if (d3_behavior_zoomPanning) {
d3_behavior_zoomMoved = true;
d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning);
}
}

function d3_behavior_zoomMouseup() {
if (d3_behavior_zoomPanning) {
if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true;
d3_behavior_zoomMousemove();
d3_behavior_zoomPanning = null;
}
}

function d3_behavior_zoomClick() {
if (d3_behavior_zoomStopClick) {
d3.event.stopPropagation();
d3.event.preventDefault();
d3_behavior_zoomStopClick = false;
}
}

function d3_behavior_zoomTo(z, x0, x1) {
var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]),
x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0],
Expand Down
2 changes: 1 addition & 1 deletion d3.behavior.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions examples/zoom-pan/zoom-pan.html
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@
.attr("stroke", stroke)
.attr("fill", "none");

svg.append("svg:a")
.attr("xlink:href", "http://mbostock.github.com/d3/")
.append("svg:text")
.style("font-size", "3em")
.attr("transform", "translate(110.5, 110.5)")
.text("D3.js");

redraw();

function redraw() {
Expand Down
21 changes: 18 additions & 3 deletions src/behavior/zoom.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ d3.behavior.zoom = function() {
.on("mousemove.zoom", d3_behavior_zoomMousemove)
.on("mouseup.zoom", d3_behavior_zoomMouseup)
.on("touchmove.zoom", d3_behavior_zoomTouchmove)
.on("touchend.zoom", d3_behavior_zoomTouchup);
.on("touchend.zoom", d3_behavior_zoomTouchup)
.on("click.zoom", d3_behavior_zoomClick, true);
}

// snapshot the local context for subsequent dispatch
Expand All @@ -30,6 +31,7 @@ d3.behavior.zoom = function() {
function mousedown() {
start.apply(this, arguments);
d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget));
d3_behavior_zoomMoved = false;
d3.event.preventDefault();
window.focus();
}
Expand Down Expand Up @@ -75,7 +77,8 @@ var d3_behavior_zoomDiv,
d3_behavior_zoomXyz,
d3_behavior_zoomDispatch,
d3_behavior_zoomTarget,
d3_behavior_zoomArguments;
d3_behavior_zoomArguments,
d3_behavior_zoomStopClick;

function d3_behavior_zoomLocation(point) {
return [
Expand Down Expand Up @@ -154,16 +157,28 @@ function d3_behavior_zoomTouchmove() {

function d3_behavior_zoomMousemove() {
d3_behavior_zoomZooming = null;
if (d3_behavior_zoomPanning) d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning);
if (d3_behavior_zoomPanning) {
d3_behavior_zoomMoved = true;
d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning);
}
}

function d3_behavior_zoomMouseup() {
if (d3_behavior_zoomPanning) {
if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true;
d3_behavior_zoomMousemove();
d3_behavior_zoomPanning = null;
}
}

function d3_behavior_zoomClick() {
if (d3_behavior_zoomStopClick) {
d3.event.stopPropagation();
d3.event.preventDefault();
d3_behavior_zoomStopClick = false;
}
}

function d3_behavior_zoomTo(z, x0, x1) {
var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]),
x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0],
Expand Down

0 comments on commit dd2d490

Please sign in to comment.