openkraken / kraken

A web standards-compliant, high-performance rendering engine based on Flutter.
https://openkraken.com
Apache License 2.0
4.93k stars 305 forks source link

addEventListener中返回的Event需要添加PointerDeviceKind属性来兼容不同手势之间的差异 #1449

Closed xuzhongpeng closed 1 year ago

xuzhongpeng commented 2 years ago

使用场景 | Use case

目前addEventListener返回的Event参数无法辨别手势类型,比如输入框拖动如果是触摸手势是文字滚动,如果是鼠标手势是选中文本

提案 | Proposal

addEventListener返回的Event的Touch添加一个kind(PointerDeviceKind)属性,告知调用者

xuzhongpeng commented 2 years ago

cc @answershuto

XGHeaven commented 2 years ago

目前标准里面没有 kind 的定义把。

xuzhongpeng commented 2 years ago

目前标准里面没有 kind 的定义把。

w3c里确实没有,但是我们在Element中定义一些组件时是需要根据手势的不同有不同的响应。 有两种方案

  1. Element中不使用addEventListener,使用Listener、TapGestureRecognizer等
  2. addEventListener中添加kind属性判断

w3c中定义的主要是给js使用(组件行为已经在浏览器中定义好),但是我们Element中使用是定义组件默认行为的

XGHeaven commented 2 years ago

如果 Element 是 DOM 对象的话,是不需要的,区分是通过监听 mousexxx 或者 touchxxx 事件来区分的。 如果是 Kraken 的 Dart 实现的那个 Element 的话,我理解也不用吧,也可以通过监听鼠标或者手指事件区分吧。

xuzhongpeng commented 2 years ago

如果 Element 是 DOM 对象的话,是不需要的,区分是通过监听 mousexxx 或者 touchxxx 事件来区分的。 如果是 Kraken 的 Dart 实现的那个 Element 的话,我理解也不用吧,也可以通过监听鼠标或者手指事件区分吧。

click、touch是有的,touchmove这种就无法区分是触摸还是鼠标触发

answershuto commented 2 years ago

touch 已经是触摸的封装了,更原子的应该是 Pointer 的概念,这里面可以涵盖设备类型信息,但是透出我建议可以先到 W3C 讨论一下,看看他们的建议。

xuzhongpeng commented 2 years ago

touch 已经是触摸的封装了,更原子的应该是 Pointer 的概念,这里面可以涵盖设备类型信息,但是透出我建议可以先到 W3C 讨论一下,看看他们的建议。

这里我认为跟W3C标准还不太一样,比如输入框富文本能力在移动端和PC端有些是不一样的,它在浏览器中是浏览器自己实现,对标到Kraken中是DOM Element实现,浏览器自己实现肯定是能知道自己是移动端还是PC端的手势,但是Kraken的Element中使用的addEventListener方法监听的手势就无法获取手势类型

这里addEventListener在浏览器是仅仅给JS调用的,在Kranken中还会给我们实现一些默认组件使用,这里场景就不一样了。

answershuto commented 2 years ago

因为之前有一个规划是做 Dart 侧的标准能力的透出,所以 addEventListener 的表现在 Dart 侧与前端应该是一致的(也就是符合 W3C 标准的),所以还是需要考虑标准中的实现。

xuzhongpeng commented 2 years ago

因为之前有一个规划是做 Dart 侧的标准能力的透出,所以 addEventListener 的表现在 Dart 侧与前端应该是一致的(也就是符合 W3C 标准的),所以还是需要考虑标准中的实现。

我想实现在Element中实现根据手势不同有不同的交互响应(例子就是输入框的touchmove在移动端上是文字滚动,在pc是文字选中),那目前是无法做到的吗

xuzhongpeng commented 2 years ago

https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType w3c已定义了pointerType

XGHeaven commented 2 years ago

https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType w3c已定义了pointerType

但这个是 PointerEvent 的概念,不会影响现有的 MouseEvent/TouchEvent 这些的。

xuzhongpeng commented 2 years ago

https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType w3c已定义了pointerType

但这个是 PointerEvent 的概念,不会影响现有的 MouseEvent/TouchEvent 这些的。

嗯嗯,可以在kraken中对PointerEvent进行支持,对需要判断PointerType的地方使用 pointer相关的事件

xuzhongpeng commented 1 year ago

https://github.com/openwebf/webf/issues/89 该pr合入此问题不复存在