jquery.simulate.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*
  2. * jquery.simulate - simulate browser mouse and keyboard events
  3. *
  4. * Copyright (c) 2009 Eduardo Lundgren (eduardolundgren@gmail.com)
  5. * and Richard D. Worth (rdworth@gmail.com)
  6. *
  7. * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
  8. * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
  9. *
  10. */
  11. ;(function($) {
  12. $.fn.extend({
  13. simulate: function(type, options) {
  14. return this.each(function() {
  15. var opt = $.extend({}, $.simulate.defaults, options || {});
  16. new $.simulate(this, type, opt);
  17. });
  18. }
  19. });
  20. $.simulate = function(el, type, options) {
  21. this.target = el;
  22. this.options = options;
  23. if (/^drag$/.test(type)) {
  24. this[type].apply(this, [this.target, options]);
  25. } else {
  26. this.simulateEvent(el, type, options);
  27. }
  28. }
  29. $.extend($.simulate.prototype, {
  30. simulateEvent: function(el, type, options) {
  31. var evt = this.createEvent(type, options);
  32. this.dispatchEvent(el, type, evt, options);
  33. return evt;
  34. },
  35. createEvent: function(type, options) {
  36. if (/^mouse(over|out|down|up|move)|(dbl)?click$/.test(type)) {
  37. return this.mouseEvent(type, options);
  38. } else if (/^key(up|down|press)$/.test(type)) {
  39. return this.keyboardEvent(type, options);
  40. }
  41. },
  42. mouseEvent: function(type, options) {
  43. var evt;
  44. var e = $.extend({
  45. bubbles: true, cancelable: (type != "mousemove"), view: window, detail: 0,
  46. screenX: 0, screenY: 0, clientX: 0, clientY: 0,
  47. ctrlKey: false, altKey: false, shiftKey: false, metaKey: false,
  48. button: 0, relatedTarget: undefined
  49. }, options);
  50. var relatedTarget = $(e.relatedTarget)[0];
  51. if ($.isFunction(document.createEvent)) {
  52. evt = document.createEvent("MouseEvents");
  53. evt.initMouseEvent(type, e.bubbles, e.cancelable, e.view, e.detail,
  54. e.screenX, e.screenY, e.clientX, e.clientY,
  55. e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
  56. e.button, e.relatedTarget || document.body.parentNode);
  57. } else if (document.createEventObject) {
  58. evt = document.createEventObject();
  59. $.extend(evt, e);
  60. evt.button = { 0:1, 1:4, 2:2 }[evt.button] || evt.button;
  61. }
  62. return evt;
  63. },
  64. keyboardEvent: function(type, options) {
  65. var evt;
  66. var e = $.extend({ bubbles: true, cancelable: true, view: window,
  67. ctrlKey: false, altKey: false, shiftKey: false, metaKey: false,
  68. keyCode: 0, charCode: 0
  69. }, options);
  70. if ($.isFunction(document.createEvent)) {
  71. try {
  72. evt = document.createEvent("KeyEvents");
  73. evt.initKeyEvent(type, e.bubbles, e.cancelable, e.view,
  74. e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
  75. e.keyCode, e.charCode);
  76. } catch(err) {
  77. evt = document.createEvent("Events");
  78. evt.initEvent(type, e.bubbles, e.cancelable);
  79. $.extend(evt, { view: e.view,
  80. ctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey, metaKey: e.metaKey,
  81. keyCode: e.keyCode, charCode: e.charCode
  82. });
  83. }
  84. } else if (document.createEventObject) {
  85. evt = document.createEventObject();
  86. $.extend(evt, e);
  87. }
  88. if ($.browser.msie || $.browser.opera) {
  89. evt.keyCode = (e.charCode > 0) ? e.charCode : e.keyCode;
  90. evt.charCode = undefined;
  91. }
  92. return evt;
  93. },
  94. dispatchEvent: function(el, type, evt) {
  95. if (el.dispatchEvent) {
  96. el.dispatchEvent(evt);
  97. } else if (el.fireEvent) {
  98. el.fireEvent('on' + type, evt);
  99. }
  100. return evt;
  101. },
  102. drag: function(el) {
  103. var self = this, center = this.findCenter(this.target),
  104. options = this.options, x = Math.floor(center.x), y = Math.floor(center.y),
  105. dx = options.dx || 0, dy = options.dy || 0, target = this.target;
  106. var coord = { clientX: x, clientY: y };
  107. this.simulateEvent(target, "mousedown", coord);
  108. coord = { clientX: x + 1, clientY: y + 1 };
  109. this.simulateEvent(document, "mousemove", coord);
  110. coord = { clientX: x + dx, clientY: y + dy };
  111. this.simulateEvent(document, "mousemove", coord);
  112. this.simulateEvent(document, "mousemove", coord);
  113. this.simulateEvent(target, "mouseup", coord);
  114. },
  115. findCenter: function(el) {
  116. var el = $(this.target), o = el.offset();
  117. return {
  118. x: o.left + el.outerWidth() / 2,
  119. y: o.top + el.outerHeight() / 2
  120. };
  121. }
  122. });
  123. $.extend($.simulate, {
  124. defaults: {
  125. speed: 'sync'
  126. },
  127. VK_TAB: 9,
  128. VK_ENTER: 13,
  129. VK_ESC: 27,
  130. VK_PGUP: 33,
  131. VK_PGDN: 34,
  132. VK_END: 35,
  133. VK_HOME: 36,
  134. VK_LEFT: 37,
  135. VK_UP: 38,
  136. VK_RIGHT: 39,
  137. VK_DOWN: 40
  138. });
  139. })(jQuery);