2017-03-03 118 views
3

我想手動觸發觸摸事件,但無法呼叫。 這在JavaScript中是可行的,但TypeScript無法實現。如何在TypeScript中手動觸發TouchEvent

例子:

let touchStart: TouchEvent = document.createEvent('TouchEvent'); 
touchStart.initEvent('touchstart', true, true); 
element.dispatchEvent(touchStart); 

如果我想這是我可以能夠觸發touchStart事件,但我不能抽到了changedTouches[0].pageXchangedTouches[0].pageY

基於this link我有如下嘗試像,

touchStart.changedTouches = [ 
    pageX: x 
    pageY: y 
    ] 

但我不能能夠在changedTouches分配值,因爲那屬性是隻讀的。

如何實現這一目標?在TypeScript中使用changedTouches

+1

非常有趣的是,似乎TypeScript沒有正確支持'TouchEvent'的創建,既不是通過'new TouchEvent'也不是通過更老的'做cument.createEvent()'。我會提交一個bug,但目前我缺乏時間。 –

+0

@MadaraUchiha這是一個錯誤? –

+1

是的,它看起來像在TypeScript中的一個真正的錯誤。 –

回答

2

這是一個真正的Bug打字稿的lib.d.ts定義一切在JavaScript和DOM的類型是如何模樣。

我已經開了一個ticketpull request來解決這個問題。

如果他們得到接受,你可以期望的new TouchEvent(eventType, initArguments);標準的方式在打字稿的未來版本。

JavaScript中做的正確的方式請參見this MDN tutorial

+0

感謝(y)的精彩評論 –

1

我最近一直在試圖觸發打字稿觸摸事件,並在相同的問題擊中。展望一下,我看到了角度材料團隊在測試中如何解決這個問題,所以我採取了類似的方法。下面是例子我用嘲笑TouchEvents與touchstartchangedTouches模擬陣列被設置代碼:

let te = createTouchEvent(parentHtmlElement, 'touchstart'); 
parentHtmlElement.dispatchEvent(te); 

function createTouchEvent(touchTarget: HTMLElement, type: string) {   
    const event = document.createEvent('UIEvent');  
    event.initUIEvent(type, true, true, window, 0); 

    let touches = [{target: touchTarget}]; 

    Object.defineProperties(event, { 
     changedTouches: {value: touches} 
    });  
    return event; 
} 

在我的成分,我聽的事件如下:

this.touchStartListener = this.renderer.listen('document', 'touchstart', (event: TouchEvent) => { 
        this.handleTouchStart(event); 
       }); 

這工作得很好,沒有TypeScript警告,並且事件在我的測試中被觸發和處理

+0

我只使用事件的changedTouches屬性 - 所以我只將該屬性添加到事件中。如果你正在使用'touches array',那就改爲添加 – Ryan