1 |
|
2 | define([
|
3 | 'require',
|
4 | 'exports',
|
5 | 'module',
|
6 | './synthetic'
|
7 | ], function (require, exports, module) {
|
8 | var syn = require('./synthetic');
|
9 | var h = syn.helpers, getWin = h.getWindow;
|
10 | syn.mouse = {};
|
11 | h.extend(syn.defaults, {
|
12 | mousedown: function (options) {
|
13 | syn.trigger(this, 'focus', {});
|
14 | },
|
15 | click: function () {
|
16 | var element = this, href, type, createChange, radioChanged, nodeName, scope;
|
17 | try {
|
18 | href = element.href;
|
19 | type = element.type;
|
20 | createChange = syn.data(element, 'createChange');
|
21 | radioChanged = syn.data(element, 'radioChanged');
|
22 | scope = getWin(element);
|
23 | nodeName = element.nodeName.toLowerCase();
|
24 | } catch (e) {
|
25 | return;
|
26 | }
|
27 | if (!syn.support.linkHrefJS && /^\s*javascript:/.test(href)) {
|
28 | var code = href.replace(/^\s*javascript:/, '');
|
29 | if (code !== '//' && code.indexOf('void(0)') === -1) {
|
30 | if (window.selenium) {
|
31 | eval('with(selenium.browserbot.getCurrentWindow()){' + code + '}');
|
32 | } else {
|
33 | eval('with(scope){' + code + '}');
|
34 | }
|
35 | }
|
36 | }
|
37 | if (!syn.support.clickSubmits && ((nodeName === 'input' || nodeName === 'button') && type === 'submit')) {
|
38 | var form = syn.closest(element, 'form');
|
39 | if (form) {
|
40 | syn.trigger(form, 'submit', {});
|
41 | }
|
42 | }
|
43 | if (nodeName === 'a' && element.href && !/^\s*javascript:/.test(href)) {
|
44 | scope.location.href = href;
|
45 | }
|
46 | if (nodeName === 'input' && type === 'checkbox') {
|
47 | if (!syn.support.clickChanges) {
|
48 | syn.trigger(element, 'change', {});
|
49 | }
|
50 | }
|
51 | if (nodeName === 'input' && type === 'radio') {
|
52 | if (radioChanged && !syn.support.radioClickChanges) {
|
53 | syn.trigger(element, 'change', {});
|
54 | }
|
55 | }
|
56 | if (nodeName === 'option' && createChange) {
|
57 | syn.trigger(element.parentNode, 'change', {});
|
58 | syn.data(element, 'createChange', false);
|
59 | }
|
60 | }
|
61 | });
|
62 | h.extend(syn.create, {
|
63 | mouse: {
|
64 | options: function (type, options, element) {
|
65 | var doc = document.documentElement, body = document.body, center = [
|
66 | options.pageX || 0,
|
67 | options.pageY || 0
|
68 | ], left = syn.mouse.browser && syn.mouse.browser.left[type], right = syn.mouse.browser && syn.mouse.browser.right[type];
|
69 | return h.extend({
|
70 | bubbles: true,
|
71 | cancelable: true,
|
72 | view: window,
|
73 | detail: 1,
|
74 | screenX: 1,
|
75 | screenY: 1,
|
76 | clientX: options.clientX || center[0] - (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0),
|
77 | clientY: options.clientY || center[1] - (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0),
|
78 | ctrlKey: !!syn.key.ctrlKey,
|
79 | altKey: !!syn.key.altKey,
|
80 | shiftKey: !!syn.key.shiftKey,
|
81 | metaKey: !!syn.key.metaKey,
|
82 | button: left && left.button !== null ? left.button : right && right.button || (type === 'contextmenu' ? 2 : 0),
|
83 | relatedTarget: document.documentElement
|
84 | }, options);
|
85 | },
|
86 | event: function (type, defaults, element) {
|
87 | var doc = getWin(element).document || document, event;
|
88 | if (doc.createEvent) {
|
89 | try {
|
90 | event = doc.createEvent('MouseEvents');
|
91 | event.initMouseEvent(type, defaults.bubbles, defaults.cancelable, defaults.view, defaults.detail, defaults.screenX, defaults.screenY, defaults.clientX, defaults.clientY, defaults.ctrlKey, defaults.altKey, defaults.shiftKey, defaults.metaKey, defaults.button, defaults.relatedTarget);
|
92 | } catch (e) {
|
93 | event = h.createBasicStandardEvent(type, defaults, doc);
|
94 | }
|
95 | event.synthetic = true;
|
96 | return event;
|
97 | } else {
|
98 | try {
|
99 | event = h.createEventObject(type, defaults, element);
|
100 | } catch (e) {
|
101 | }
|
102 | return event;
|
103 | }
|
104 | }
|
105 | },
|
106 | click: {
|
107 | setup: function (type, options, element) {
|
108 | var nodeName = element.nodeName.toLowerCase();
|
109 | if (!syn.support.clickChecks && !syn.support.changeChecks && nodeName === 'input') {
|
110 | type = element.type.toLowerCase();
|
111 | if (type === 'checkbox') {
|
112 | element.checked = !element.checked;
|
113 | }
|
114 | if (type === 'radio') {
|
115 | if (!element.checked) {
|
116 | try {
|
117 | syn.data(element, 'radioChanged', true);
|
118 | } catch (e) {
|
119 | }
|
120 | element.checked = true;
|
121 | }
|
122 | }
|
123 | }
|
124 | if (nodeName === 'a' && element.href && !/^\s*javascript:/.test(element.href)) {
|
125 | syn.data(element, 'href', element.href);
|
126 | }
|
127 | if (/option/i.test(element.nodeName)) {
|
128 | var child = element.parentNode.firstChild, i = -1;
|
129 | while (child) {
|
130 | if (child.nodeType === 1) {
|
131 | i++;
|
132 | if (child === element) {
|
133 | break;
|
134 | }
|
135 | }
|
136 | child = child.nextSibling;
|
137 | }
|
138 | if (i !== element.parentNode.selectedIndex) {
|
139 | element.parentNode.selectedIndex = i;
|
140 | syn.data(element, 'createChange', true);
|
141 | }
|
142 | }
|
143 | }
|
144 | },
|
145 | mousedown: {
|
146 | setup: function (type, options, element) {
|
147 | var nn = element.nodeName.toLowerCase();
|
148 | if (syn.browser.safari && (nn === 'select' || nn === 'option')) {
|
149 | options._autoPrevent = true;
|
150 | }
|
151 | }
|
152 | }
|
153 | });
|
154 | }); |
\ | No newline at end of file |