左利きユーザーにだけ影響したWordPressのバグ
(shkspr.mobi)- モバイルでスクロール中にコメント返信ボックスが突然開いてしまう問題があり、右手の親指でスクロールしていたサイト運営者は再現できなかった
- 原因はページ左側のreplyリンクとWordPressの
touchstart処理にあり、左手の親指でのスクロールが意図しないリンクタッチにつながることがあった - このバグは7年前にWordPress Tracですでに報告されており、関連コードは2017年にWordPress開発リポジトリへ追加されていた
- 過去にはタッチとダブルタップズームを区別するための300ms遅延回避が必要だったが、2013年のChromeの記事や2015年のFastClick資料の時点で、すでに古い問題だった
- 修正はWordPressのコードから数行を削除する形で、モバイルスクロール中の望まないコメント返信動作を減らすことに焦点がある
ブログ最適化とコメントJavaScript
- WordPressの基本インストールの上に複数のカスタム修正を適用し、ブログを可能な限り最適化している
- JavaScript使用量を最小限まで減らし、JavaScriptなしでも機能が動作するよう構成している
- ただし一部機能ではJavaScriptが役立っており、最も目立つ例がコメント機能である
左手スクロールでのみ表面化した問題
- 読者からサイトのバグ報告があり、ページをスクロールしている途中でコメントボックスが突然現れ、閲覧を妨げていた
- サイト運営者は頻繁にスクロールしていたが右手の親指を使っていたため、同じ問題に気づかなかった
- バグを報告したユーザーは左手でスクロールしており、問題のreplyリンクはページ左側にあった
- 右手の親指スクロールでは表れにくかったタッチイベントが、左手の親指スクロールでは意図せず発生することがあった
WordPressのtouchstart処理
- この問題はWordPress Tracで7年前に報告されていた
- 2017年にWordPress開発者がリンククリックに
touchstartリスナーを追加した - 当時のブラウザは、タッチイベントがクリックの開始なのかダブルタップズームの開始なのかを確実に区別できなかった
- リンクでタッチが発生した際にイベントを先に発火させる方式は、当時300ms遅延を避けるための処理と見なせた
すでに消えた300ms遅延問題
- 300msのタップ遅延はかなり前から同じ形の問題ではなくなっていた
- 2013年のChrome開発者ブログ記事では、その遅延問題が解消されたことを扱っている
- 2015年のFastClick資料の時点でも、この問題はもはや解決すべき主要課題ではなかった
- したがって、2017年に左手スクロールのユーザーを悩ませる形のコードがなぜ追加されたのかは明確ではない
修正方法と期待される効果
- バグ報告から7年後、WordPress修正PRがコミットされた
- 修正は複雑な変更ではなく、WordPressのコードから数行を削除する方式である
- この変更により、モバイルスクロール中にreplyリンクが意図せず動作してコメント返信ボックスが開く問題を減らせる可能性がある
<meta handed="right">のような利き手別のアクセス制限機能は存在せず、今回の変更は望まないタッチイベントを防ぐことに焦点がある
1件のコメント
Lobste.rs のコメント
世の中のあまりにも多くのものが右利き基準になっている。ペンの広告文句も、右手で持たないと読めない向きになっていることが多い。
それでも左利きとして生きていると、生まれつきの広告ブロック機能が少しはあるようなもの。
“sinister disposition” とは笑える。sinister と dexterous(dexter)が文字どおり、それぞれ「左」と「右」を意味するのだと知った日のことを覚えている。
規範から外れること → 悪、という、私たちがいまだに抱えて生きている文化現象は今でも興味深い。
おそらく、左を意味していた元の単語がタブーになって新しい単語に置き換えられ、その新しい単語も後にまたタブーになる、ということが繰り返された可能性が高い。
[1]: https://reddit.com/r/asklinguistics/…
人は普通、主に使う手だけでスマホを持つものなのか? 左利きだが、スマホは両手をほぼランダムに同じくらい使っていて、みんなそうだと思っていた。
最初は右手でスマホを持って左手で操作していたが、時間がたつにつれて右手の親指でやることがどんどん増え、結局そこが主な操作ポイントになった。
マウスも右手で使うが、子どものころコンピューター室のマウスケーブルが短くて、左側に移して使えなかったからだ。
自分も左利きだが、手書きのように右手でやることが多い。ピアノでも右手が優位で、ほとんどの曲の書かれ方も間違いなく影響しているはず。スマホも両手を使う。
ただし2〜3文を超えると、両方の親指で入力する。
興味深いことに、他のほとんどすべてのことは右手でするのに、スマホは左手で持って使うほうに傾いている。
理由はよく分からないが、スマホを左ポケットに入れ、財布と鍵を右側に入れているからだと思う。鍵を使ったり財布を取り出したりするのは利き手でやるほうが楽だ。自分が変わっているのか気になる。
結局スクロールや基本操作は左手でやるが、長いメッセージを入力するときは左手で持ったまま右手でスワイプ入力することが多い。
そこで
touchstartを使ったのがそもそも間違いだった。マウス、タッチ、ポインターは押したときではなく離したときに有効化されるが、押し始めた地点は同じ要素でなければならない。キーボードイベントは keyup ではなく keydown で有効化される。ただしボタンで
Spaceが動作する場合は奇妙なことに keyup で、マウスと違って keydown がどの要素で起きたかも気にしない。data:text/html,<button onclick=this.textContent=Math.random()>One</button><button onclick=this.textContent=Math.random()>Two</button>のようなもので、いろいろな可能性を試せる。touchstartで有効化の準備をすること、たとえば必要ならサーバーからデータの先読みを始める程度なら問題なかったはずだ。だが実際の動作の実行はまだ起きてはいけないのに、element.addEventListener( 'touchstart', clickEvent );はまさにそれを誤って処理していた。これが左利きとどう関係するのか分からなかった。
マウスユーザーなので分からない、タッチパッド特有の挙動なのか?