|
1 | | -/*! jQuery imgViewer - v0.6.0 - 2013-06-06 |
| 1 | +/*! jQuery imgViewer - v0.7.0 - 2014-05-17 |
2 | 2 | * https://github.com/waynegm/imgViewer |
3 | | -* Copyright (c) 2013 Wayne Mogg; Licensed MIT */ |
| 3 | +* Copyright (c) 2014 Wayne Mogg; Licensed MIT */ |
| 4 | +/* |
| 5 | + * Add a tap and drag gesture to toe.js |
| 6 | + */ |
| 7 | +;(function ($, touch, window, undefined) { |
| 8 | + |
| 9 | + var namespace = 'drag', |
| 10 | + cfg = { |
| 11 | + distance: 40 // minimum |
| 12 | + }, |
| 13 | + started; |
| 14 | + |
| 15 | + touch.track(namespace, { |
| 16 | + touchstart: function (event, state, start) { |
| 17 | + started = false; |
| 18 | + state[namespace] = { |
| 19 | + finger: start.point.length, |
| 20 | + start: start, |
| 21 | + deltaX: 0, |
| 22 | + deltaY: 0 |
| 23 | + }; |
| 24 | + }, |
| 25 | + touchmove: function (event, state, move) { |
| 26 | + var opt = $.extend(cfg, event.data); |
| 27 | + |
| 28 | + // if another finger was used then increment the amount of fingers used |
| 29 | + state[namespace].finger = move.point.length > state[namespace].finger ? move.point.length : state[namespace].finger; |
| 30 | + |
| 31 | + var distance = touch.calc.getDistance(state.start.point[0], move.point[0]); |
| 32 | + if (Math.abs(1 - distance) > opt.distance) { |
| 33 | + if (!started) { |
| 34 | + $(event.target).trigger($.Event('dragstart', state[namespace])); |
| 35 | + started = true; |
| 36 | + } |
| 37 | + state[namespace].deltaX = (move.point[0].x - state.start.point[0].x); |
| 38 | + state[namespace].deltaY = (move.point[0].y - state.start.point[0].y); |
| 39 | + $(event.target).trigger($.Event('drag', state[namespace])); |
| 40 | + } |
| 41 | + }, |
| 42 | + touchend: function (event, state, end) { |
| 43 | + if (started) { |
| 44 | + started = false; |
| 45 | + |
| 46 | + var distance = touch.calc.getDistance(state.start.point[0], end.point[0]); |
| 47 | + if (distance > cfg.distance) { |
| 48 | + state[namespace].deltaX = (end.point[0].x - state.start.point[0].x); |
| 49 | + state[namespace].deltaY = (end.point[0].y - state.start.point[0].y); |
| 50 | + $(event.target).trigger($.Event('dragend', state[namespace])); |
| 51 | + } |
| 52 | + } |
| 53 | + } |
| 54 | + }); |
| 55 | +}(jQuery, jQuery.toe, this)); |
| 56 | + |
| 57 | +/* |
| 58 | + * imgViewer plugin starts here |
| 59 | + */ |
4 | 60 | ;(function($) { |
5 | 61 | $.widget("wgm.imgViewer", { |
6 | 62 | options: { |
|
76 | 132 | top: 0+"px", |
77 | 133 | left: 0+"px", |
78 | 134 | width: width+"px", |
79 | | - height: height+"px" |
| 135 | + height: height+"px", |
| 136 | + "-webkit-tap-highlight-color": "transparent" |
80 | 137 | }); |
81 | 138 | // the initial view is centered at the orignal image |
82 | 139 | self.vCenter = { |
|
88 | 145 | if (this.complete) { $(this).load(); } |
89 | 146 | }); |
90 | 147 | /* |
91 | | - * Mousewheel event handler for image zooming |
92 | | - */ |
93 | | - $zimg.mousewheel(function(event, delta) { |
94 | | - event.preventDefault(); |
95 | | - self.options.zoom -= delta * self.options.zoomStep; |
96 | | - self.update(); |
| 148 | + * Render loop code during dragging and scaling using requestAnimationFrame |
| 149 | + */ |
| 150 | + self.render = false; |
| 151 | + function startRenderLoop() { |
| 152 | + if (!self.render) { |
| 153 | + self.render = true; |
| 154 | + doRender(); |
| 155 | + } |
| 156 | + } |
| 157 | + |
| 158 | + function stopRenderLoop() { |
| 159 | + self.render = false; |
| 160 | + } |
| 161 | + |
| 162 | + function doRender() { |
| 163 | + if (self.render) { |
| 164 | + window.requestAnimationFrame(doRender); |
| 165 | + self.update(); |
| 166 | + } |
| 167 | + } |
| 168 | +/* |
| 169 | + * Touch event handlers |
| 170 | + */ |
| 171 | + $zimg.on('touchstart touchmove touchend', function(ev) { |
| 172 | + ev.preventDefault(); |
| 173 | + }); |
| 174 | + |
| 175 | + $zimg.on( "tap" , function(ev) { |
| 176 | + if (!self.dragging) { |
| 177 | + ev.preventDefault(); |
| 178 | + self._trigger("onClick", ev, self); |
| 179 | + } |
| 180 | + }); |
| 181 | + $zimg.on( "transformstart" , function(ev) { |
| 182 | + ev.preventDefault(); |
| 183 | + self.pinchzoom = self.options.zoom; |
| 184 | + startRenderLoop(); |
| 185 | + }); |
| 186 | + $zimg.on("transform", function(ev) { |
| 187 | + ev.preventDefault(); |
| 188 | + self.options.zoom = self.pinchzoom * ev.scale; |
| 189 | + }); |
| 190 | + $zimg.on("transformend", function(ev) { |
| 191 | + ev.preventDefault(); |
| 192 | + self.options.zoom = self.pinchzoom * ev.scale; |
| 193 | + stopRenderLoop(); |
| 194 | + }); |
| 195 | + |
| 196 | + $zimg.on( "dragstart" , function(ev) { |
| 197 | + ev.preventDefault(); |
| 198 | + self.dragging = true; |
| 199 | + self.dragXorg = self.vCenter.x; |
| 200 | + self.dragYorg = self.vCenter.y; |
| 201 | + startRenderLoop(); |
| 202 | + }); |
| 203 | + $zimg.on( "drag", function(ev) { |
| 204 | + ev.preventDefault(); |
| 205 | + self.vCenter.x = self.dragXorg - ev.deltaX/self.options.zoom; |
| 206 | + self.vCenter.y = self.dragYorg - ev.deltaY/self.options.zoom; |
| 207 | + }); |
| 208 | + |
| 209 | + $zimg.on( "dragend", function(ev) { |
| 210 | + ev.preventDefault(); |
| 211 | + self.dragging = false; |
| 212 | + self.vCenter.x = self.dragXorg - ev.deltaX/self.options.zoom; |
| 213 | + self.vCenter.y = self.dragYorg - ev.deltaY/self.options.zoom; |
| 214 | + stopRenderLoop(); |
97 | 215 | }); |
| 216 | + |
98 | 217 | /* |
99 | | - * Mouse drag handler for image panning |
| 218 | + * Mouse event handlers |
100 | 219 | */ |
| 220 | + function MouseWheelHandler(ev) { |
| 221 | + ev.preventDefault(); |
| 222 | + var e = ev.originalEvent; |
| 223 | + var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail))); |
| 224 | + self.options.zoom -= delta * self.options.zoomStep; |
| 225 | + self.update(); |
| 226 | + } |
| 227 | + $zimg.on("mousewheel", MouseWheelHandler); |
| 228 | + $zimg.on("DOMMouseScroll", MouseWheelHandler); |
| 229 | + $zimg.on("onmousewheel", MouseWheelHandler); |
| 230 | + |
| 231 | + $zimg.click(function(e) { |
| 232 | + if (!self.dragging) { |
| 233 | + self._trigger("onClick", e, self); |
| 234 | + } |
| 235 | + }); |
| 236 | + |
101 | 237 | $zimg.mousedown( function(e) { |
102 | 238 | e.preventDefault(); |
| 239 | + startRenderLoop(); |
103 | 240 | var last = e; |
104 | 241 | $zimg.mousemove( function(e) { |
105 | 242 | e.preventDefault(); |
106 | 243 | self.dragging = true; |
107 | 244 | self.vCenter.x = self.vCenter.x - (e.pageX - last.pageX)/self.options.zoom; |
108 | 245 | self.vCenter.y = self.vCenter.y - (e.pageY - last.pageY)/self.options.zoom; |
109 | 246 | last = e; |
110 | | - self.update(); |
111 | 247 | }); |
112 | 248 | function endDrag(e) { |
113 | 249 | e.preventDefault(); |
| 250 | + stopRenderLoop(); |
114 | 251 | setTimeout(function() { self.dragging = false; }, 0); |
115 | 252 | $zimg.unbind("mousemove"); |
116 | 253 | $zimg.unbind("mouseup"); |
|
119 | 256 | $(document).one("mouseup", endDrag); |
120 | 257 | $zimg.one("mouseup", endDrag); |
121 | 258 | }); |
122 | | -/* |
123 | | - * Mouse click handler - supply an action by defining the onClick option |
124 | | - */ |
125 | | - $zimg.click(function(e) { |
126 | | - if (!self.dragging) { |
127 | | - self._trigger("onClick", e, self); |
128 | | - } |
129 | | - }); |
| 259 | + |
130 | 260 | /* |
131 | 261 | * Window resize handler |
132 | 262 | */ |
|
148 | 278 | destroy: function() { |
149 | 279 | var $zimg = $(this.zimg); |
150 | 280 | $zimg.unbind("click"); |
151 | | - $zimg.unmousewheel(); |
152 | 281 | $(window).unbind("resize"); |
153 | 282 | $zimg.remove(); |
154 | 283 | $(this.view).remove(); |
|
331 | 460 | y: half_height |
332 | 461 | }; |
333 | 462 | this.options.zoom = 1; |
| 463 | + zoom = 1; |
334 | 464 | } else { |
335 | 465 | zTop = Math.round(half_height - this.vCenter.y * zoom); |
336 | 466 | zLeft = Math.round(half_width - this.vCenter.x * zoom); |
|
363 | 493 | height: height+"px" |
364 | 494 | }); |
365 | 495 | $(this.zimg).css({ |
366 | | - left: zLeft+"px", |
367 | | - top: zTop+"px", |
368 | | - width: zWidth+"px", |
369 | | - height: zHeight+"px" |
| 496 | + width: width+"px", |
| 497 | + height: height+"px" |
370 | 498 | }); |
| 499 | + |
| 500 | + var xt = -(this.vCenter.x - half_width)*zoom; |
| 501 | + var yt = -(this.vCenter.y - half_height)*zoom; |
| 502 | + $(this.zimg).css({transform: "translate(" + xt + "px," + yt + "px) scale(" + zoom + "," + zoom + ")" }); |
371 | 503 | /* |
372 | 504 | * define the onUpdate option to do something after the image is redisplayed |
373 | 505 | * probably shouldn't pass out the this object - need to think of something better |
|
0 commit comments