1// jQuery.event.swipe 2// 0.5 3// Stephen Band 4 5// Dependencies 6// jQuery.event.move 1.2 7 8// One of swipeleft, swiperight, swipeup or swipedown is triggered on 9// moveend, when the move has covered a threshold ratio of the dimension 10// of the target node, or has gone really fast. Threshold and velocity 11// sensitivity changed with: 12// 13// jQuery.event.special.swipe.settings.threshold 14// jQuery.event.special.swipe.settings.sensitivity 15 16(function (module) { 17 if (typeof define === 'function' && define.amd) { 18 // AMD. Register as an anonymous module. 19 define(['jquery'], module); 20 } else { 21 // Browser globals 22 module(jQuery); 23 } 24})(function(jQuery, undefined){ 25 var add = jQuery.event.add, 26 27 remove = jQuery.event.remove, 28 29 // Just sugar, so we can have arguments in the same order as 30 // add and remove. 31 trigger = function(node, type, data) { 32 jQuery.event.trigger(type, data, node); 33 }, 34 35 settings = { 36 // Ratio of distance over target finger must travel to be 37 // considered a swipe. 38 threshold: 0.4, 39 // Faster fingers can travel shorter distances to be considered 40 // swipes. 'sensitivity' controls how much. Bigger is shorter. 41 sensitivity: 6 42 }; 43 44 function moveend(e) { 45 var w, h, event; 46 47 w = e.target.offsetWidth; 48 h = e.target.offsetHeight; 49 50 // Copy over some useful properties from the move event 51 event = { 52 distX: e.distX, 53 distY: e.distY, 54 velocityX: e.velocityX, 55 velocityY: e.velocityY, 56 finger: e.finger 57 }; 58 59 // Find out which of the four directions was swiped 60 if (e.distX > e.distY) { 61 if (e.distX > -e.distY) { 62 if (e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) { 63 event.type = 'swiperight'; 64 trigger(e.currentTarget, event); 65 } 66 } 67 else { 68 if (-e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) { 69 event.type = 'swipeup'; 70 trigger(e.currentTarget, event); 71 } 72 } 73 } 74 else { 75 if (e.distX > -e.distY) { 76 if (e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) { 77 event.type = 'swipedown'; 78 trigger(e.currentTarget, event); 79 } 80 } 81 else { 82 if (-e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) { 83 event.type = 'swipeleft'; 84 trigger(e.currentTarget, event); 85 } 86 } 87 } 88 } 89 90 function getData(node) { 91 var data = jQuery.data(node, 'event_swipe'); 92 93 if (!data) { 94 data = { count: 0 }; 95 jQuery.data(node, 'event_swipe', data); 96 } 97 98 return data; 99 } 100 101 jQuery.event.special.swipe = 102 jQuery.event.special.swipeleft = 103 jQuery.event.special.swiperight = 104 jQuery.event.special.swipeup = 105 jQuery.event.special.swipedown = { 106 setup: function( data, namespaces, eventHandle ) { 107 var data = getData(this); 108 109 // If another swipe event is already setup, don't setup again. 110 if (data.count++ > 0) { return; } 111 112 add(this, 'moveend', moveend); 113 114 return true; 115 }, 116 117 teardown: function() { 118 var data = getData(this); 119 120 // If another swipe event is still setup, don't teardown. 121 if (--data.count > 0) { return; } 122 123 remove(this, 'moveend', moveend); 124 125 return true; 126 }, 127 128 settings: settings 129 }; 130});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.