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(); 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) (listener.listener).call(listener.obj, evt); break; case Event.AT_TARGET: if (listener.listener) (listener.listener).call(listener.obj, evt); break; case Event.BUBBLING_PHASE: if (!listener.useCapture && listener.listener) (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 = ((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;