UNPKG

6.84 kBJavaScriptView Raw
1/*syn@0.14.0#mouse*/
2define([
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