_event.js 3.3 KB

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