598 lines
20 KiB
TypeScript
598 lines
20 KiB
TypeScript
|
|
interface EventListener {
|
|
(evt: Event): void;
|
|
}
|
|
interface EventListenerObject {
|
|
handleEvent(evt: Event): void;
|
|
}
|
|
|
|
declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
|
|
|
|
interface EventHandler {
|
|
obj: Object;
|
|
listener: EventListenerOrEventListenerObject;
|
|
useCapture: boolean;
|
|
}
|
|
|
|
interface EventInit {
|
|
bubbles?: boolean;
|
|
cancelable?: boolean;
|
|
}
|
|
|
|
interface GlobalEventHandlers {
|
|
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
|
|
}
|
|
|
|
class GlobalEventHandlers implements GlobalEventHandlers {
|
|
constructor() {
|
|
|
|
}
|
|
onpointercancel(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
onpointerdown(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
onpointerenter(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
onpointerleave(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
onpointermove(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
onpointerout(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
onpointerover(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
onpointerup(ev: PointerEvent): any {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
class ErrorEvent implements ErrorEvent {
|
|
constructor() {
|
|
|
|
}
|
|
initErrorEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, messageArg: string, filenameArg: string, linenoArg: number): void {
|
|
//TODO
|
|
}
|
|
}
|
|
|
|
class Event {
|
|
//TODO 下面的属性应该是只读的。
|
|
/**
|
|
* 是否允许冒泡
|
|
*/
|
|
bubbles: boolean;
|
|
cancelBubble: boolean; //阻止冒泡
|
|
/**
|
|
* 如果为false,则不允许cancle
|
|
*/
|
|
cancelable: boolean;
|
|
currentTarget: EventTarget;
|
|
defaultPrevented: boolean;
|
|
eventPhase: number;
|
|
isTrusted: boolean;
|
|
returnValue: boolean;
|
|
srcElement: Element;
|
|
target: EventTarget;
|
|
timeStamp: number;
|
|
type: string;
|
|
_propagationStopped = false;
|
|
constructor(type: string, eventInitDict?: EventInit) {
|
|
this.type = type;
|
|
this.timeStamp = Date.now();
|
|
this.bubbles = false;//默认为false
|
|
this.cancelable = false;
|
|
this.eventPhase = Event.AT_TARGET;
|
|
if (eventInitDict) {
|
|
this.bubbles = eventInitDict.bubbles;
|
|
this.cancelable = eventInitDict.cancelable;
|
|
}
|
|
}
|
|
initEvent(eventTypeArg: string, canBubbleArg: boolean, cancelableArg: boolean): void {
|
|
this.type = eventTypeArg;
|
|
this.bubbles = canBubbleArg;
|
|
this.cancelable = cancelableArg;
|
|
}
|
|
preventDefault(): void {
|
|
if (!this.cancelable)
|
|
return;
|
|
this.defaultPrevented = true;
|
|
}
|
|
stopImmediatePropagation(): void {
|
|
|
|
}
|
|
/**
|
|
* 阻止事件的传播。但是不阻止在本节点的传播
|
|
*/
|
|
stopPropagation(): void {
|
|
this._propagationStopped = true;
|
|
}
|
|
|
|
static AT_TARGET = 2; //处于目标阶段
|
|
static BUBBLING_PHASE = 3; //冒泡阶段
|
|
static CAPTURING_PHASE = 1; //捕获阶段
|
|
}
|
|
var _lbEvent= window['Event'] = Event;
|
|
|
|
interface _EventTarget {
|
|
addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
|
|
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
|
|
dispatchEvent(evt: Event): boolean;
|
|
removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
|
|
}
|
|
var _lbMap=Map;
|
|
class EventTarget implements _EventTarget {
|
|
protected _evtMaps = new _lbMap<string, EventHandler[]>();
|
|
dispatchEvent:(evt: Event)=>boolean ;
|
|
fireEventListeners:(evt: Event)=>void;
|
|
constructor(){
|
|
this.dispatchEvent = this._dispatchEvent.bind(this);
|
|
//this.addEventListener=this._addEventListener.bind(this);
|
|
this.fireEventListeners = this._fireEventListeners.bind(this);
|
|
}
|
|
/**
|
|
* TODO
|
|
* 没有考虑 useCapture
|
|
*/
|
|
addEventListener (type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void {
|
|
//console.log('addevtlistener:' + type);
|
|
var listeners = this._evtMaps.get(type) || [];
|
|
listeners.push({ obj: this, listener: listener, useCapture: useCapture });
|
|
this._evtMaps.set(type, listeners);
|
|
}
|
|
/*
|
|
addEventListener (type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void{
|
|
|
|
}
|
|
*/
|
|
/**
|
|
* @param
|
|
* @return boolean fase 则不允许触发缺省处理,表示有人曾经调用过 preventDefault.
|
|
*/
|
|
protected _dispatchEvent(evt: Event): boolean {
|
|
this.fireEventListeners(evt);
|
|
return !evt.defaultPrevented;
|
|
}
|
|
/**
|
|
* 要考虑一个listener被add了多次的情况
|
|
*/
|
|
removeEventListener = (type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void => {
|
|
var listeners = this._evtMaps.get(type);
|
|
if(!listeners)
|
|
return;
|
|
var newlisteners = [];
|
|
for (var i = 0, sz = listeners.length; i < sz; i++) {
|
|
if (listeners[i].listener != listener || listeners[i].useCapture != useCapture) {
|
|
newlisteners.push(listeners[i]);
|
|
}
|
|
}
|
|
this._evtMaps.set(type, newlisteners);
|
|
}
|
|
|
|
/**
|
|
* 需要绑定this
|
|
*/
|
|
protected _fireEventListeners (evt: Event):void {
|
|
var listeners: EventHandler[] = this._evtMaps.get(evt.type);
|
|
if (listeners) {
|
|
listeners.forEach(function(listener: EventHandler) {
|
|
switch (evt.eventPhase) {
|
|
case Event.CAPTURING_PHASE:
|
|
if (listener.useCapture && listener.listener)
|
|
(<any>listener.listener).call(listener.obj, evt);
|
|
break;
|
|
case Event.AT_TARGET:
|
|
if (listener.listener)
|
|
(<any>listener.listener).call(listener.obj, evt);
|
|
break;
|
|
case Event.BUBBLING_PHASE:
|
|
if (!listener.useCapture && listener.listener)
|
|
(<any>listener.listener).call(listener.obj, evt);
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
interface UIEventInit extends EventInit {
|
|
view?: any; //window
|
|
detail?: number;
|
|
}
|
|
|
|
interface SharedKeyboardAndMouseEventInit extends UIEventInit {
|
|
ctrlKey?: boolean;
|
|
shiftKey?: boolean;
|
|
altKey?: boolean;
|
|
metaKey?: boolean;
|
|
keyModifierStateAltGraph?: boolean;
|
|
keyModifierStateCapsLock?: boolean;
|
|
keyModifierStateFn?: boolean;
|
|
keyModifierStateFnLock?: boolean;
|
|
keyModifierStateHyper?: boolean;
|
|
keyModifierStateNumLock?: boolean;
|
|
keyModifierStateOS?: boolean;
|
|
keyModifierStateScrollLock?: boolean;
|
|
keyModifierStateSuper?: boolean;
|
|
keyModifierStateSymbol?: boolean;
|
|
keyModifierStateSymbolLock?: boolean;
|
|
}
|
|
|
|
class UIEvent extends Event {
|
|
constructor(type: string, eventInitDict?: UIEventInit) {
|
|
super(type);
|
|
this.bubbles = true; //UIEVent的默认为true
|
|
if (eventInitDict) {
|
|
this.initUIEvent(type, eventInitDict.bubbles, eventInitDict.cancelable, eventInitDict.view, eventInitDict.detail);
|
|
}
|
|
}
|
|
detail: number;
|
|
view: Window;
|
|
initUIEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number): void {
|
|
this.type = typeArg;
|
|
this.cancelable = canBubbleArg;
|
|
this.cancelable = cancelableArg;
|
|
this.view = viewArg;
|
|
this.detail = detailArg;
|
|
}
|
|
}
|
|
|
|
interface KeyboardEventInit extends SharedKeyboardAndMouseEventInit {
|
|
key?: string;
|
|
location?: number;
|
|
repeat?: boolean;
|
|
}
|
|
|
|
interface MouseEventInit extends SharedKeyboardAndMouseEventInit {
|
|
screenX?: number;
|
|
screenY?: number;
|
|
clientX?: number;
|
|
clientY?: number;
|
|
button?: number;
|
|
buttons?: number;
|
|
relatedTarget?: EventTarget;
|
|
}
|
|
interface PointerEventInit extends MouseEventInit {
|
|
pointerId?: number;
|
|
width?: number;
|
|
height?: number;
|
|
pressure?: number;
|
|
tiltX?: number;
|
|
tiltY?: number;
|
|
pointerType?: string;
|
|
isPrimary?: boolean;
|
|
}
|
|
|
|
interface WheelEventInit extends MouseEventInit {
|
|
deltaX?: number;
|
|
deltaY?: number;
|
|
deltaZ?: number;
|
|
deltaMode?: number;
|
|
}
|
|
|
|
class PointerEvent {
|
|
constructor(typeArg: string, eventInitDict?: PointerEventInit) {
|
|
|
|
}
|
|
}
|
|
|
|
class MouseEvent extends UIEvent {
|
|
altKey: boolean;
|
|
button: number;
|
|
buttons: number;
|
|
clientX: number;
|
|
clientY: number;
|
|
ctrlKey: boolean;
|
|
fromElement: Element;
|
|
layerX: number;
|
|
layerY: number;
|
|
metaKey: boolean;
|
|
movementX: number;
|
|
movementY: number;
|
|
offsetX: number;
|
|
offsetY: number;
|
|
pageX: number;
|
|
pageY: number;
|
|
relatedTarget: EventTarget;
|
|
screenX: number;
|
|
screenY: number;
|
|
shiftKey: boolean;
|
|
toElement: Element;
|
|
which: number;
|
|
x: number;
|
|
y: number;
|
|
constructor(typeArg: string, eventInitDict?: MouseEventInit) {
|
|
super(typeArg, eventInitDict);
|
|
if (eventInitDict) {
|
|
for (var v in eventInitDict) {
|
|
this[v] = eventInitDict[v];
|
|
}
|
|
}
|
|
}
|
|
getModifierState(keyArg: string): boolean {
|
|
//not implements
|
|
return false;
|
|
}
|
|
|
|
initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number,
|
|
clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean,
|
|
buttonArg: number, relatedTargetArg: EventTarget): void {
|
|
var args = arguments;
|
|
['type', 'bubbles', 'cancelable', 'view', 'detail', 'screenX', 'screenY', 'clientX', 'clientY', 'ctrlKey', 'altKey', 'shiftKey', 'metaKey', 'button', 'relatedTarget'].forEach((v, i, a) => {
|
|
this[v] = args[i];
|
|
});
|
|
}
|
|
}
|
|
var _lbMouseEvent= window['MouseEvent'] = MouseEvent;
|
|
|
|
class MouseWheelEvent extends MouseEvent {
|
|
wheelDelta: number;
|
|
wheelDeltaX: number;
|
|
wheelDeltaY: number;
|
|
initMouseWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, wheelDeltaArg: number): void {
|
|
|
|
}
|
|
constructor() {
|
|
super("mousewheel");
|
|
}
|
|
}
|
|
|
|
class WheelEvent extends MouseEvent {
|
|
deltaMode: number;
|
|
deltaX: number;
|
|
deltaY: number;
|
|
deltaZ: number;
|
|
getCurrentPoint(element: Element): void {
|
|
|
|
}
|
|
initWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, deltaXArg: number, deltaYArg: number, deltaZArg: number, deltaMode: number): void {
|
|
|
|
}
|
|
|
|
constructor(typeArg: string, eventInitDict?: WheelEventInit) {
|
|
super(typeArg, eventInitDict);
|
|
if (eventInitDict) {
|
|
this.deltaMode = eventInitDict.deltaMode;
|
|
this.deltaX = eventInitDict.deltaX;
|
|
this.deltaY = eventInitDict.deltaY;
|
|
this.deltaZ = eventInitDict.deltaZ;
|
|
}
|
|
}
|
|
static DOM_DELTA_LINE = 1;
|
|
static DOM_DELTA_PAGE = 2;
|
|
static DOM_DELTA_PIXEL = 0;
|
|
}
|
|
|
|
class Touch {
|
|
clientX: number;
|
|
clientY: number;
|
|
identifier: number;
|
|
pageX: number;
|
|
pageY: number;
|
|
screenX: number;
|
|
screenY: number;
|
|
target: EventTarget;
|
|
constructor(){
|
|
|
|
}
|
|
}
|
|
|
|
class TouchList extends Array {
|
|
item(index: number): Touch {
|
|
return this[index];
|
|
}
|
|
}
|
|
|
|
interface TouchEvent extends UIEvent {
|
|
altKey: boolean;
|
|
changedTouches: TouchList;
|
|
ctrlKey: boolean;
|
|
metaKey: boolean;
|
|
shiftKey: boolean;
|
|
targetTouches: TouchList;
|
|
touches: TouchList;
|
|
new(type: number, id: number, name: string, x: number, y: number):TouchEvent;
|
|
}
|
|
/*
|
|
var exp={exp:null};
|
|
(function(exp:{exp:any}) {
|
|
'use strict';
|
|
//这个需要闭包
|
|
var APP_TOUCH_DOWN = 0;
|
|
var APP_TOUCH_UP = 1;
|
|
var APP_TOUCH_MOV = 2;
|
|
var APP_TOUCH_PT_DOWN = 5;
|
|
var APP_TOUCH_PT_UP = 6;
|
|
var m_vTouchs: Touch[] = []
|
|
|
|
exp.exp = class TouchEvent extends UIEvent {
|
|
altKey = false;
|
|
changedTouches: Touch[] = [];// TouchList;
|
|
ctrlKey = false;
|
|
metaKey = false;
|
|
shiftKey = false;
|
|
targetTouches: Touch[] = [];// TouchList;
|
|
touches: Touch[] = [];
|
|
constructor(type: number, id: number, name: string, x: number, y: number) {
|
|
super('');
|
|
var touch = new Touch();
|
|
touch.identifier = id;
|
|
touch.pageX = touch.screenX = touch.clientX = x;
|
|
touch.pageY = touch.screenY = touch.clientY = y;
|
|
this.touches.push(touch);
|
|
switch(type) {
|
|
case APP_TOUCH_DOWN:
|
|
case APP_TOUCH_PT_DOWN:
|
|
m_vTouchs.push(touch);
|
|
break;
|
|
case APP_TOUCH_PT_UP: {
|
|
//DEL. 已知事件都是一个一个发送的。
|
|
var epos = 0;
|
|
var tnum = m_vTouchs.length;
|
|
while (epos < tnum) {
|
|
var ce = m_vTouchs[epos];
|
|
if (ce.identifier == id) {
|
|
break;
|
|
}
|
|
epos++;
|
|
}
|
|
if (epos >= tnum) {
|
|
//error not find
|
|
} else {
|
|
m_vTouchs.splice(epos, 1);
|
|
}
|
|
}
|
|
break;
|
|
case APP_TOUCH_MOV: {
|
|
//修改. 已知事件都是一个一个发送的。
|
|
var tnum = m_vTouchs.length;
|
|
var ti = 0;
|
|
while (ti < tnum) {
|
|
var ce = m_vTouchs[ti];
|
|
if (ce.identifier == id) {
|
|
m_vTouchs[ti] = touch;
|
|
break;
|
|
}
|
|
ti++;
|
|
}
|
|
}
|
|
break;
|
|
case APP_TOUCH_UP:
|
|
m_vTouchs = [];
|
|
break;
|
|
}
|
|
this.touches = m_vTouchs;
|
|
switch (type) {
|
|
case 0:
|
|
case 5:
|
|
this.type = "touchstart";
|
|
break;
|
|
case 1:
|
|
case 6:
|
|
this.type = "touchend";
|
|
break;
|
|
case 2:
|
|
this.type = "touchmove";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
})(exp);
|
|
|
|
var TouchEvent:TouchEvent = <TouchEvent>((<any>exp).exp);
|
|
*/
|
|
interface DeviceAcceleration {
|
|
x: number;
|
|
y: number;
|
|
z: number;
|
|
}
|
|
|
|
interface DeviceRotationRate {
|
|
alpha: number;
|
|
beta: number;
|
|
gamma: number;
|
|
}
|
|
|
|
interface DeviceAccelerationDict {
|
|
x?: number;
|
|
y?: number;
|
|
z?: number;
|
|
}
|
|
|
|
interface DeviceRotationRateDict {
|
|
alpha?: number;
|
|
beta?: number;
|
|
gamma?: number;
|
|
}
|
|
|
|
|
|
class DeviceMotionEvent extends Event {
|
|
acceleration: DeviceAcceleration;
|
|
accelerationIncludingGravity: DeviceAcceleration;
|
|
interval: number;
|
|
rotationRate: DeviceRotationRate;
|
|
constructor() {
|
|
super('devicemotion');
|
|
}
|
|
initDeviceMotionEvent(type: string, bubbles: boolean, cancelable: boolean, acceleration: DeviceAccelerationDict, accelerationIncludingGravity: DeviceAccelerationDict, rotationRate: DeviceRotationRateDict, interval: number): void {
|
|
|
|
}
|
|
}
|
|
window["DeviceMotionEvent"]=DeviceMotionEvent;
|
|
|
|
class DeviceOrientationEvent extends Event {
|
|
absolute: boolean;
|
|
alpha: number;
|
|
beta: number;
|
|
gamma: number;
|
|
constructor() {
|
|
super('deviceorientation');
|
|
}
|
|
initDeviceOrientationEvent(type: string, bubbles: boolean, cancelable: boolean, alpha: number, beta: number, gamma: number, absolute: boolean): void {
|
|
|
|
}
|
|
}
|
|
window["DeviceOrientationEvent"]=DeviceOrientationEvent;
|
|
|
|
class DocumentEvent {
|
|
constructor() {
|
|
|
|
}
|
|
createEvent(eventInterface: string): Event {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
class ProgressEvent extends Event {
|
|
lengthComputable: boolean;
|
|
loaded: number;
|
|
total: number;
|
|
constructor(type:string) {
|
|
super(type);
|
|
}
|
|
initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void {
|
|
//TODO
|
|
this.type=typeArg;
|
|
this.cancelBubble=canBubbleArg;
|
|
this.cancelable=cancelableArg;
|
|
this.lengthComputable=lengthComputableArg;
|
|
this.loaded=loadedArg;
|
|
this.total=totalArg;
|
|
}
|
|
}
|
|
|
|
var _lbProgressEvent=window["ProgressEvent"]=ProgressEvent; |