Prevent click events on drag in zoom behaviour.

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.
This commit is contained in:
Jason Davies 2011-08-22 21:48:21 +01:00
Родитель 402c2e4922
Коммит dd2d490524
4 изменённых файлов: 44 добавлений и 7 удалений

Просмотреть файл

@ -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
@ -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();
}
@ -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 [
@ -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],

2
d3.behavior.min.js поставляемый
Просмотреть файл

@ -1 +1 @@
(function(){function p(a,b,c){function m(a,b){var c=a.__domain||(a.__domain=a.domain()),d=a.range().map(function(a){return(a-b)/l});a.domain(c).domain(d.map(a.invert))}var d=Math.pow(2,(f[2]=a)-c[2]),e=f[0]=b[0]-d*c[0],j=f[1]=b[1]-d*c[1],k=d3.event,l=Math.pow(2,a);d3.event={scale:l,translate:[e,j],transform:function(a,b){a&&m(a,e),b&&m(b,j)}};try{g.apply(h,i)}finally{d3.event=k}k.preventDefault()}function o(){b&&(n(),b=null)}function n(){c=null,b&&p(f[2],d3.svg.mouse(h),b)}function m(){var a=d3.svg.touches(h);switch(a.length){case 1:var b=a[0];p(f[2],b,d[b.identifier]);break;case 2:var c=a[0],e=a[1],g=[(c[0]+e[0])/2,(c[1]+e[1])/2],i=d[c.identifier],j=d[e.identifier],k=[(i[0]+j[0])/2,(i[1]+j[1])/2,i[2]];p(Math.log(d3.event.scale)/Math.LN2+i[2],g,k)}}function l(){var a=d3.svg.touches(h),b=-1,c=a.length,e;while(++b<c)d[(e=a[b]).identifier]=j(e);return a}function k(){a||(a=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var b=d3.event,c;try{a.scrollTop=1e3,a.dispatchEvent(b),c=1e3-a.scrollTop}catch(d){c=b.wheelDelta||-b.detail}return c*.005}function j(a){return[a[0]-f[0],a[1]-f[1],f[2]]}d3.behavior={},d3.behavior.zoom=function(){function w(){s.apply(this,arguments);var b=l(),c,f=Date.now();b.length===1&&f-e<300&&p(1+Math.floor(a[2]),c=b[0],d[c.identifier]),e=f}function v(){s.apply(this,arguments);var b=d3.svg.mouse(h);p(d3.event.shiftKey?Math.ceil(a[2]-1):Math.floor(a[2]+1),b,j(b))}function u(){s.apply(this,arguments),c||(c=j(d3.svg.mouse(h))),p(k()+a[2],d3.svg.mouse(h),c)}function t(){s.apply(this,arguments),b=j(d3.svg.mouse(h)),d3.event.preventDefault(),window.focus()}function s(){f=a,g=q.zoom.dispatch,h=this,i=arguments}function r(){this.on("mousedown.zoom",t).on("mousewheel.zoom",u).on("DOMMouseScroll.zoom",v).on("dblclick.zoom",v).on("touchstart.zoom",w),d3.select(window).on("mousemove.zoom",n).on("mouseup.zoom",o).on("touchmove.zoom",m).on("touchend.zoom",l)}var a=[0,0,0],q=d3.dispatch("zoom");r.on=function(a,b){q[a].add(b);return r};return r};var a,b,c,d={},e=0,f,g,h,i})()
(function(){function r(a,b,c){function m(a,b){var c=a.__domain||(a.__domain=a.domain()),d=a.range().map(function(a){return(a-b)/l});a.domain(c).domain(d.map(a.invert))}var d=Math.pow(2,(f[2]=a)-c[2]),e=f[0]=b[0]-d*c[0],j=f[1]=b[1]-d*c[1],k=d3.event,l=Math.pow(2,a);d3.event={scale:l,translate:[e,j],transform:function(a,b){a&&m(a,e),b&&m(b,j)}};try{g.apply(h,i)}finally{d3.event=k}k.preventDefault()}function q(){j&&(d3.event.stopPropagation(),d3.event.preventDefault(),j=!1)}function p(){b&&(d3_behavior_zoomMoved&&(j=!0),o(),b=null)}function o(){c=null,b&&(d3_behavior_zoomMoved=!0,r(f[2],d3.svg.mouse(h),b))}function n(){var a=d3.svg.touches(h);switch(a.length){case 1:var b=a[0];r(f[2],b,d[b.identifier]);break;case 2:var c=a[0],e=a[1],g=[(c[0]+e[0])/2,(c[1]+e[1])/2],i=d[c.identifier],j=d[e.identifier],k=[(i[0]+j[0])/2,(i[1]+j[1])/2,i[2]];r(Math.log(d3.event.scale)/Math.LN2+i[2],g,k)}}function m(){var a=d3.svg.touches(h),b=-1,c=a.length,e;while(++b<c)d[(e=a[b]).identifier]=k(e);return a}function l(){a||(a=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var b=d3.event,c;try{a.scrollTop=1e3,a.dispatchEvent(b),c=1e3-a.scrollTop}catch(d){c=b.wheelDelta||-b.detail}return c*.005}function k(a){return[a[0]-f[0],a[1]-f[1],f[2]]}d3.behavior={},d3.behavior.zoom=function(){function x(){t.apply(this,arguments);var b=m(),c,f=Date.now();b.length===1&&f-e<300&&r(1+Math.floor(a[2]),c=b[0],d[c.identifier]),e=f}function w(){t.apply(this,arguments);var b=d3.svg.mouse(h);r(d3.event.shiftKey?Math.ceil(a[2]-1):Math.floor(a[2]+1),b,k(b))}function v(){t.apply(this,arguments),c||(c=k(d3.svg.mouse(h))),r(l()+a[2],d3.svg.mouse(h),c)}function u(){t.apply(this,arguments),b=k(d3.svg.mouse(h)),d3_behavior_zoomMoved=!1,d3.event.preventDefault(),window.focus()}function t(){f=a,g=j.zoom.dispatch,h=this,i=arguments}function s(){this.on("mousedown.zoom",u).on("mousewheel.zoom",v).on("DOMMouseScroll.zoom",w).on("dblclick.zoom",w).on("touchstart.zoom",x),d3.select(window).on("mousemove.zoom",o).on("mouseup.zoom",p).on("touchmove.zoom",n).on("touchend.zoom",m).on("click.zoom",q,!0)}var a=[0,0,0],j=d3.dispatch("zoom");s.on=function(a,b){j[a].add(b);return s};return s};var a,b,c,d={},e=0,f,g,h,i,j})()

Просмотреть файл

@ -47,6 +47,13 @@ svg.append("svg:rect")
.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() {

Просмотреть файл

@ -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
@ -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();
}
@ -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 [
@ -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],