diff --git a/d3.behavior.js b/d3.behavior.js index 0300e7962908c..a2638f345bde1 100644 --- a/d3.behavior.js +++ b/d3.behavior.js @@ -3,10 +3,7 @@ // TODO unbind listener? d3.behavior.zoom = function() { - // https://bugs.webkit.org/show_bug.cgi?id=40441 - var bug40441 = /WebKit\/533/.test(navigator.userAgent) ? -1 : 0, - bug40441Last = 0, - x = 0, + var x = 0, y = 0, z = 0, listeners = [], @@ -53,6 +50,20 @@ d3.behavior.zoom = function() { } } + // mousewheel events are totally broken! + // https://bugs.webkit.org/show_bug.cgi?id=40441 + // not only that, but Chrome and Safari differ in re. to acceleration! + var inner = document.createElement("div"), + outer = document.createElement("div"); + outer.style.visibility = "hidden"; + outer.style.top = "0px"; + outer.style.height = "0px"; + outer.style.width = "0px"; + outer.style.overflowY = "scroll"; + inner.style.height = "2000px"; + outer.appendChild(inner); + document.body.appendChild(outer); + function mousewheel(d, i) { var e = d3.event; @@ -72,16 +83,17 @@ d3.behavior.zoom = function() { if (e.type === "dblclick") { z = e.shiftKey ? Math.ceil(z - 1) : Math.floor(z + 1); } else { - var delta = (e.wheelDelta / 120 || -e.detail) * .1; - - /* Detect fast & large wheel events on WebKit. */ - if (bug40441 < 0) { - var now = Date.now(), since = now - bug40441Last; - if ((since > 9) && (Math.abs(e.wheelDelta) / since >= 50)) bug40441 = 1; - bug40441Last = now; + var delta = e.wheelDelta || -e.detail; + if (delta) { + try { + outer.scrollTop = 1000; + outer.dispatchEvent(e); + delta = 1000 - outer.scrollTop; + } catch (error) { + // Derp! Hope for the best? + } + delta *= .005; } - if (bug40441 === 1) delta *= .03; - z += delta; } diff --git a/d3.behavior.min.js b/d3.behavior.min.js index 84616107cc1f9..2c5ae7dafbd5a 100644 --- a/d3.behavior.min.js +++ b/d3.behavior.min.js @@ -1 +1 @@ -(function(){d3.behavior={},d3.behavior.zoom=function(){function m(a,b){function i(a,b){var c=a.__domain||(a.__domain=a.domain()),d=a.range().map(function(a){return(a-b)/h});a.domain(c).domain(d.map(a.invert))}var g=d3.event,h=Math.pow(2,e);d3.event={scale:h,translate:[c,d],transform:function(a,b){a&&i(a,c),b&&i(b,d)}};try{for(var j=0,k=f.length;j9&&Math.abs(i.wheelDelta)/n>=50&&(a=1),b=l}a===1&&(k*=.03),e+=k}var o=Math.pow(2,e-h.z0)-1;c=h.x0+h.x1*o,d=h.y0+h.y1*o,m.call(this,f,g)}function k(){g&&(j(),g=null)}function j(){h=null,g&&(c=d3.event.clientX+g.x0,d=d3.event.clientY+g.y0,m.call(g.target,g.data,g.index))}function i(a,b){g={x0:c-d3.event.clientX,y0:d-d3.event.clientY,target:this,data:a,index:b},d3.event.preventDefault(),window.focus()}function h(){var a=this.on("mousedown",i).on("mousewheel",l).on("DOMMouseScroll",l).on("dblclick",l);d3.select(window).on("mousemove",j).on("mouseup",k)}var a=/WebKit\/533/.test(navigator.userAgent)?-1:0,b=0,c=0,d=0,e=0,f=[],g,h;h.on=function(a,b){a=="zoom"&&f.push(b);return h};return h}})() \ No newline at end of file +(function(){d3.behavior={},d3.behavior.zoom=function(){function m(e,f){function i(a,b){var c=a.__domain||(a.__domain=a.domain()),d=a.range().map(function(a){return(a-b)/h});a.domain(c).domain(d.map(a.invert))}var g=d3.event,h=Math.pow(2,c);d3.event={scale:h,translate:[a,b],transform:function(c,d){c&&i(c,a),d&&i(d,b)}};try{for(var j=0,k=d.length;j 9) && (Math.abs(e.wheelDelta) / since >= 50)) bug40441 = 1; - bug40441Last = now; + var delta = e.wheelDelta || -e.detail; + if (delta) { + try { + outer.scrollTop = 1000; + outer.dispatchEvent(e); + delta = 1000 - outer.scrollTop; + } catch (error) { + // Derp! Hope for the best? + } + delta *= .005; } - if (bug40441 === 1) delta *= .03; - z += delta; }