_event.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. if(!dojo._hasResource["dojox.mobile.app._event"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  7. dojo._hasResource["dojox.mobile.app._event"] = true;
  8. dojo.provide("dojox.mobile.app._event");
  9. dojo.experimental("dojox.mobile.app._event.js");
  10. dojo.mixin(dojox.mobile.app, {
  11. eventMap: {},
  12. connectFlick: function(target, context, method){
  13. // summary:
  14. // Listens for a flick event on a DOM node. If the mouse/touch
  15. // moves more than 15 pixels in any given direction it is a flick.
  16. // The synthetic event fired specifies the direction as
  17. // <ul>
  18. // <li><b>'ltr'</b> Left To Right</li>
  19. // <li><b>'rtl'</b> Right To Left</li>
  20. // <li><b>'ttb'</b> Top To Bottom</li>
  21. // <li><b>'btt'</b> Bottom To Top</li>
  22. // </ul>
  23. // target: Node
  24. // The DOM node to connect to
  25. var startX;
  26. var startY;
  27. var isFlick = false;
  28. var currentX;
  29. var currentY;
  30. var connMove;
  31. var connUp;
  32. var direction;
  33. var time;
  34. // Listen to to the mousedown/touchstart event
  35. var connDown = dojo.connect("onmousedown", target, function(event){
  36. isFlick = false;
  37. startX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX;
  38. startY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY;
  39. time = (new Date()).getTime();
  40. connMove = dojo.connect(target, "onmousemove", onMove);
  41. connUp = dojo.connect(target, "onmouseup", onUp);
  42. });
  43. // The function that handles the mousemove/touchmove event
  44. var onMove = function(event){
  45. dojo.stopEvent(event);
  46. currentX = event.targetTouches ? event.targetTouches[0].clientX : event.clientX;
  47. currentY = event.targetTouches ? event.targetTouches[0].clientY : event.clientY;
  48. if(Math.abs(Math.abs(currentX) - Math.abs(startX)) > 15){
  49. isFlick = true;
  50. direction = (currentX > startX) ? "ltr" : "rtl";
  51. }else if(Math.abs(Math.abs(currentY) - Math.abs(startY)) > 15){
  52. isFlick = true;
  53. direction = (currentY > startY) ? "ttb" : "btt";
  54. }
  55. };
  56. var onUp = function(event){
  57. dojo.stopEvent(event);
  58. connMove && dojo.disconnect(connMove);
  59. connUp && dojo.disconnect(connUp);
  60. if(isFlick){
  61. var flickEvt = {
  62. target: target,
  63. direction: direction,
  64. duration: (new Date()).getTime() - time
  65. };
  66. if(context && method){
  67. context[method](flickEvt);
  68. }else{
  69. method(flickEvt);
  70. }
  71. }
  72. };
  73. }
  74. });
  75. dojox.mobile.app.isIPhone = (dojo.isSafari
  76. && (navigator.userAgent.indexOf("iPhone") > -1 ||
  77. navigator.userAgent.indexOf("iPod") > -1
  78. ));
  79. dojox.mobile.app.isWebOS = (navigator.userAgent.indexOf("webOS") > -1);
  80. dojox.mobile.app.isAndroid = (navigator.userAgent.toLowerCase().indexOf("android") > -1);
  81. if(dojox.mobile.app.isIPhone || dojox.mobile.app.isAndroid){
  82. // We are touchable.
  83. // Override the dojo._connect function to replace mouse events with touch events
  84. dojox.mobile.app.eventMap = {
  85. onmousedown: "ontouchstart",
  86. mousedown: "ontouchstart",
  87. onmouseup: "ontouchend",
  88. mouseup: "ontouchend",
  89. onmousemove: "ontouchmove",
  90. mousemove: "ontouchmove"
  91. };
  92. }
  93. dojo._oldConnect = dojo._connect;
  94. dojo._connect = function(obj, event, context, method, dontFix){
  95. event = dojox.mobile.app.eventMap[event] || event;
  96. if(event == "flick" || event == "onflick"){
  97. if(dojo.global["Mojo"]){
  98. event = Mojo.Event.flick;
  99. }else{
  100. return dojox.mobile.app.connectFlick(obj, context, method);
  101. }
  102. }
  103. return dojo._oldConnect(obj, event, context, method, dontFix);
  104. }
  105. }