如何在TypeScript中手动触发Touch事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在TypeScript中手动触发Touch事件相关的知识,希望对你有一定的参考价值。

我想手动触发触摸事件,但我无法调用。这在javascript中是可能的,但TypeScript无法实现。

例:

 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

答案

这是TypeScript的lib.d.ts的一个实际错误,它定义了JavaScript和DOM中所有类型的外观。

我打开了一个ticket和一个pull request来解决这个问题。

如果它们被接受,您可以期望new TouchEvent(eventType, initArguments);的标准方式在未来版本的TypeScript中工作。

有关在JavaScript中执行此操作的正确方法,请参阅this MDN tutorial

另一答案

我最近一直试图在TypeScript中触发触摸事件,并遇到了同样的问题。调查一下,我看到了Angular Material团队在他们的测试中如何解决这个问题,所以我采取了类似的方法。下面是我使用touchstart和设置的changedTouches模拟数组来模拟TouchEvents的代码示例:

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警告,并且在我的测试中触发和处理事件

以上是关于如何在TypeScript中手动触发Touch事件的主要内容,如果未能解决你的问题,请参考以下文章

我想把click事件改成滑动触发应该怎么做呢?

如何在 Firebase 中手动触发 screen_view 事件

Sencha Touch 中不触发滚动事件

JavaScript中 Touch 事件详解

移动端touch事件和click事件的区别

如何手动触发 onchange 事件? [复制]