94 lines
3.2 KiB
JavaScript
94 lines
3.2 KiB
JavaScript
|
// https://github.com/tmcw/happen
|
||
|
|
||
|
!(function(context) {
|
||
|
var h = {};
|
||
|
|
||
|
// Make inheritance bearable: clone one level of properties
|
||
|
function extend(child, parent) {
|
||
|
for (var property in parent) {
|
||
|
if (typeof child[property] == 'undefined') {
|
||
|
child[property] = parent[property];
|
||
|
}
|
||
|
}
|
||
|
return child;
|
||
|
}
|
||
|
|
||
|
h.once = function(x, o) {
|
||
|
var evt;
|
||
|
|
||
|
if (o.type.slice(0, 3) === 'key') {
|
||
|
if (typeof Event === 'function') {
|
||
|
evt = new Event(o.type);
|
||
|
evt.keyCode = o.keyCode || 0;
|
||
|
evt.charCode = o.charCode || 0;
|
||
|
evt.shift = o.shift || false;
|
||
|
evt.meta = o.meta || false;
|
||
|
evt.ctrl = o.ctrl || false;
|
||
|
evt.alt = o.alt || false;
|
||
|
} else {
|
||
|
evt = document.createEvent('KeyboardEvent');
|
||
|
// https://developer.mozilla.org/en/DOM/event.initKeyEvent
|
||
|
// https://developer.mozilla.org/en/DOM/KeyboardEvent
|
||
|
evt[(evt.initKeyEvent) ? 'initKeyEvent'
|
||
|
: 'initKeyboardEvent'](
|
||
|
o.type, // in DOMString typeArg,
|
||
|
true, // in boolean canBubbleArg,
|
||
|
true, // in boolean cancelableArg,
|
||
|
null, // in nsIDOMAbstractView viewArg, Specifies UIEvent.view. This value may be null.
|
||
|
o.ctrl || false, // in boolean ctrlKeyArg,
|
||
|
o.alt || false, // in boolean altKeyArg,
|
||
|
o.shift || false, // in boolean shiftKeyArg,
|
||
|
o.meta || false, // in boolean metaKeyArg,
|
||
|
o.keyCode || 0, // in unsigned long keyCodeArg,
|
||
|
o.charCode || 0 // in unsigned long charCodeArg);
|
||
|
);
|
||
|
}
|
||
|
} else {
|
||
|
evt = document.createEvent('MouseEvents');
|
||
|
// https://developer.mozilla.org/en/DOM/event.initMouseEvent
|
||
|
evt.initMouseEvent(o.type,
|
||
|
true, // canBubble
|
||
|
true, // cancelable
|
||
|
window, // 'AbstractView'
|
||
|
o.clicks || 0, // click count
|
||
|
o.screenX || 0, // screenX
|
||
|
o.screenY || 0, // screenY
|
||
|
o.clientX || 0, // clientX
|
||
|
o.clientY || 0, // clientY
|
||
|
o.ctrl || 0, // ctrl
|
||
|
o.alt || false, // alt
|
||
|
o.shift || false, // shift
|
||
|
o.meta || false, // meta
|
||
|
o.button || false, // mouse button
|
||
|
null // relatedTarget
|
||
|
);
|
||
|
}
|
||
|
|
||
|
x.dispatchEvent(evt);
|
||
|
};
|
||
|
|
||
|
var shortcuts = ['click', 'mousedown', 'mouseup', 'mousemove', 'keydown', 'keyup', 'keypress'],
|
||
|
s, i = 0;
|
||
|
|
||
|
while (s = shortcuts[i++]) {
|
||
|
h[s] = (function(s) {
|
||
|
return function(x, o) {
|
||
|
h.once(x, extend(o || {}, { type: s }));
|
||
|
};
|
||
|
})(s);
|
||
|
}
|
||
|
|
||
|
h.dblclick = function(x, o) {
|
||
|
h.once(x, extend(o || {}, {
|
||
|
type: 'dblclick',
|
||
|
clicks: 2
|
||
|
}));
|
||
|
};
|
||
|
|
||
|
this.happen = h;
|
||
|
|
||
|
if (typeof module !== 'undefined') {
|
||
|
module.exports = this.happen;
|
||
|
}
|
||
|
})(this);
|