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 (thisModule) { 17 if (typeof define === 'function' && define.amd) { 18 // AMD. Register as an anonymous module. 19 define(['jquery', undefined, 'jquery.event.move'], thisModule); 20 } else if ((typeof module !== "undefined" && module !== null) && module.exports) { 21 module.exports = thisModule; 22 } else { 23 // Browser globals 24 thisModule(jQuery); 25 } 26})(function(jQuery, undefined){ 27 var add = jQuery.event.add, 28 29 remove = jQuery.event.remove, 30 31 // Just sugar, so we can have arguments in the same order as 32 // add and remove. 33 trigger = function(node, type, data) { 34 jQuery.event.trigger(type, data, node); 35 }, 36 37 settings = { 38 // Ratio of distance over target finger must travel to be 39 // considered a swipe. 40 threshold: 0.4, 41 // Faster fingers can travel shorter distances to be considered 42 // swipes. 'sensitivity' controls how much. Bigger is shorter. 43 sensitivity: 6 44 }; 45 46 function moveend(e) { 47 var w, h, event; 48 49 w = e.currentTarget.offsetWidth; 50 h = e.currentTarget.offsetHeight; 51 52 // Copy over some useful properties from the move event 53 event = { 54 distX: e.distX, 55 distY: e.distY, 56 velocityX: e.velocityX, 57 velocityY: e.velocityY, 58 finger: e.finger 59 }; 60 61 // Find out which of the four directions was swiped 62 if (e.distX > e.distY) { 63 if (e.distX > -e.distY) { 64 if (e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) { 65 event.type = 'swiperight'; 66 trigger(e.currentTarget, event); 67 } 68 } 69 else { 70 if (-e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) { 71 event.type = 'swipeup'; 72 trigger(e.currentTarget, event); 73 } 74 } 75 } 76 else { 77 if (e.distX > -e.distY) { 78 if (e.distY/h > settings.threshold || e.velocityY * e.distY/w * settings.sensitivity > 1) { 79 event.type = 'swipedown'; 80 trigger(e.currentTarget, event); 81 } 82 } 83 else { 84 if (-e.distX/w > settings.threshold || e.velocityX * e.distX/w * settings.sensitivity > 1) { 85 event.type = 'swipeleft'; 86 trigger(e.currentTarget, event); 87 } 88 } 89 } 90 } 91 92 function getData(node) { 93 var data = jQuery.data(node, 'event_swipe'); 94 95 if (!data) { 96 data = { count: 0 }; 97 jQuery.data(node, 'event_swipe', data); 98 } 99 100 return data; 101 } 102 103 jQuery.event.special.swipe = 104 jQuery.event.special.swipeleft = 105 jQuery.event.special.swiperight = 106 jQuery.event.special.swipeup = 107 jQuery.event.special.swipedown = { 108 setup: function( data, namespaces, eventHandle ) { 109 var data = getData(this); 110 111 // If another swipe event is already setup, don't setup again. 112 if (data.count++ > 0) { return; } 113 114 add(this, 'moveend', moveend); 115 116 return true; 117 }, 118 119 teardown: function() { 120 var data = getData(this); 121 122 // If another swipe event is still setup, don't teardown. 123 if (--data.count > 0) { return; } 124 125 remove(this, 'moveend', moveend); 126 127 return true; 128 }, 129 130 settings: settings 131 }; 132});
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.