jquery.event.swipe.js 3.4 KB

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