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