jquery.simulate.js 4.1 KB

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