質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

760閲覧

タッチができるかどうかを調べたい

norino

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/08/31 06:03

javascript初心者です。 teratail初心者でもあるのでよろしくお願いいたします。

javascriptを勉強していまして、スマホ用にタッチイベントを判定するってところをやっています。

ある参考書を読んでいたところ、デスクトップブラウザとモバイルブラウザで処理を分岐させたいときの

判定の仕方の部分で理解できなかったので、お力添えをお願いします。

const isSupported = !!( 'ontouchstart' in window || (navigator.pointerEnabled && navigator.maxTouchPoints > 0) );

やっていることは理解しているのですが、頭の方のある !!←この部分の必要性が分かりません。

NOT の NOT で結局戻ってきているのでは? と思っているのですが、

もしかして私の勉強不足で違う意味があるのかと考えております。

どうか、お力添えの方よろしくお願いいたします。


もう1つ、click, touch イベントの実装について皆様にお聞きしたいのですが、

touch も click も今はそこまで遅延がないから、極論click だけでもいいのでは?と言われましたが

実際のところどうなのでしょうか?

よろしければ、こちらの方の質問もよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

'ontouchstart' in windowfalseかつnavigator.pointerEnabledundefinedのとき、外側の括弧のなかの値はundefinedになります。というのも、javascriptの||&&はbooleanを返すわけではないからです。そこで、論理否定演算子を2回重ねてbooleanにキャストしています。

必要ないと言えば必要ない(undefinedfalse扱いのため)のですがundefinedであると不都合も確かにあるため、こういう書き方をすることも多いです。

touchとclickの扱いですが、マルチタッチを考慮しないならclickの方が手軽です。また、ドラッグやスワイプの検出を行いたいときもmousedownmouseuptouchstarttouchendを区別する必要があります。ただ、両方を纏めたpointerdownpointerupというイベントも存在するので、使えるならこっちの方が手軽ではありますね。Safariが未対応というのは痛すぎるので、考えた方がいいとは思いますが。

投稿2019/08/31 06:39

編集2019/08/31 06:46
frodo821

総合スコア322

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norino

2019/08/31 20:21

frodo821さん、ありがとうございました。 二重NOTでundefined を boolean値にするテクニックがあるなんて・・・。 もう一つの質問も答えてくださって、ありがとうございます。 ブラウザ判定やイベント判定が苦手なので大変参考になりました。 お忙しいところ、時間を割いてくださって本当にありがとうございました。
frodo821

2019/08/31 20:39 編集

二重否定はboolean化の常套手段なので覚えておいて損はないと思います。 それから、||や&&を使ったテクニックとして、オブジェクトのデフォルト値があります。 let obj = {...}; //何らかのオブジェクト let foo = obj.foo || 0; let bar = obj.bar || "hoge"; このようにすると、obj.fooがfalseと評価されるような値(undefined, null, 0など)のとき、||の右側の値が代わりに使われます。いくつか問題点(0や空文字列などが想定された入力の場合、それらの値のかわりにデフォルト値が使われてしまう)もありますが、これで十分な場合も多いので、こちらも覚えておいて損はないと思います。
norino

2019/09/01 06:00

frodo821さん、度々ありがとうございます。 今回教えてくださったテクニックは、最近参考書で見かけてたのですが、 初めて見る書き方で、それについては何も説明されていなくて 間違えてレベルの高い参考書買ってしまったなと思っていたところです。 ネットで調べようにも、検索ワードが思いつかず、 繰り返して実行結果みて、こうなるんだと思うしかないなと言い聞かせていたところなので、 frodo821さんの説明があると、これで良かったんだと再確認ができて本当に助かります。 万全ではないという情報の存在が特に助かります。 boolean,undefined,null,||,&&の1つ上の学習ができて良かったです。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問