- From: Rick Byers <rbyers@chromium.org>
- Date: Tue, 2 Sep 2014 14:21:07 -0400
- To: "www-dom@w3.org" <www-dom@w3.org>
- Cc: input-dev <input-dev@chromium.org>, "public-touchevents@w3.org" <public-touchevents@w3.org>, Gary Kacmarcik (Кошмарчик) <garykac@chromium.org>
- Message-ID: <CAFUtAY_KNCMBqqBaix5tuwfKBXfo2StUfbiH9PmwQ+qAaUjFUQ@mail.gmail.com>
Ping, any thoughts? Adding public-touchevents as I suspect people there will have feedback on this idea. Rick On Wed, Aug 27, 2014 at 10:26 AM, Rick Byers <rbyers@chromium.org> wrote: > Hi, > Web developers have long struggled to reliably identify which mouse events > are actually derived from touch events. Sites need to know this to avoid > double handling (eg. on both a touchend and click event), and have often > just ignored all mouse events on a browser that supports touch events - > seriously breaking functionality on devices with both a mouse and > touchscreen. > > We (blink team) have tried for over a year to address this problem through > evangelism (eg. encouraging > <http://www.html5rocks.com/en/mobile/touchandmouse/> calling > <https://www.youtube.com/watch?v=DujfpXOKUp8> preventDefault on handled > touch events to suppress the generated mouse events). The situation has > improved, but it's still a major problem (eg. it's the reason we haven't > yet been able to rationalize Chrome's support for TouchEvents > <https://code.google.com/p/chromium/issues/detail?id=392584> across > devices, and the reason the IE team says > <http://lists.w3.org/Archives/Public/public-touchevents/2014Jul/0025.html> they > implement touch events only on phones, not laptops). > > I recognize now that avoiding > <https://code.google.com/p/chromium/issues/detail?id=115475#c13> adding a > new simple API for this was a *big mistake*. There are legitimate > reasons why the available workarounds are inadequate. For example, you may > want to suppress/ignore mouse events without disabling browser behavior > like focusing, activating links, etc. Or some listeners may want to ignore > certain mouse events whose handling is redundant with that for touch events > without affecting other listeners (perhaps in other components written by > other developers). > > After considering a number of more general alternatives > <https://docs.google.com/a/chromium.org/document/d/1-ZUtS3knhJP4RbWC74fUZbNp6cbytG6Wen7hewdCtdo/edit#>, > I'd like to propose a very simple and targeted *addition to MouseEvent:* *a > boolean 'derivedFromTouchEvent' property*. Note that this intentionally > says the event represents input that was already reported via some other > event, NOT that the event represents input from a touchscreen device (eg. > browsers on Android send touch events for mouse and stylus, not just touch > input). With this we could encourage sites to trivially transform this > common broken pattern: > > if (‘ontouchstart’ in window) > document.addEventListener(‘touchstart’, doStuff); > else > document.addEventListener(‘mousedown’, doStuff); > > > Into this: > > document.addEventListener(‘touchstart’, doStuff); > document.addEventListener(‘mousedown’, function(e) { > if (!e.derivedFromTouchEvent) doStuff(e); > }); > > > This new API can be trivially polyfilled on browsers (like Safari) which > never support mouse and touch input at the same time with just: > > if (!('derivedFromTouchEvent' in MouseEvent.prototype)) > > MouseEvent.prototype.derivedFromTouchEvent = ‘ontouchstart’ in window; > > > See this document > <https://docs.google.com/a/chromium.org/document/d/1-ZUtS3knhJP4RbWC74fUZbNp6cbytG6Wen7hewdCtdo/edit#> > for more details and other alternative proposals. > > Thanks, > Rick >
Received on Tuesday, 2 September 2014 18:21:54 UTC