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

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

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

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

Q&A

解決済

2回答

1708閲覧

iPhone(Safari)でorientationchange内でのイベント登録がうまくいかない

yuuu02

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2018/11/08 01:40

実現したいこと・発生している問題

デバイスの方向変換を感知して、横向きの場合にwindowに対してタッチイベントを発生させようとしています。

しかし、向きを判定するところまではうまくいくのですが、そのあとのイベント登録がうまくいきません。
初期状態を縦とした場合、その後横にすれば処理が発生するはずなのですが動かず、
再度縦→横と繰り返すと処理が走るようになります。

これがPC(Chrome)の検証モードだとうまくいくのですが、実機(iPhone-safari)で確認すると上記のような現象になります。。

ちなみに、縦状態の際にイベントを削除したいのですが、その処理を入れると全く動かなくなります。。

該当のソースコード

JavaScript

1var orientation = Math.abs(window.orientation); 2 3window.addEventListener("orientationchange", function(){ 4 // orientation値を更新 5 orientation = Math.abs(window.orientation); 6 if ( orientation === 90 ) { 7 // ヨコ表示 8 window.addEventListener("touchstart", function(){ 9 console.log("touchstart"); 10 }, false); 11 } 12}, false);

試したこと

1回目の回転時も、if文の中まで通っていることは確認しました。ちゃんと方向の感知はできています。
(初期状態が横の場合の処理も必要ですが、今は考えなくてよいです。)

補足情報(FW/ツールのバージョンなど)

端末:iPhoneSE/iOS11.4.1
確認ブラウザ:Safari11.0
Webインスペクタで動きを確認しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こうしてしまうとか。

js

1window.addEventListener("touchstart", function(){ 2 if ( Math.abs(window.orientation) !== 90 ) return; 3 console.log("touchstart"); 4}, false);

投稿2018/11/09 05:36

kei344

総合スコア69398

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

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

yuuu02

2018/11/09 05:42

kei334さん おおお!動きました…!!! 回転の判定を先にするのと、何が違うんでしょうか。。
kei344

2018/11/09 05:48

詳しくはわかりませんが、orientationchangeは回転を検知するたび動く(スクロールイベントとかと同じような)イベントだと予想。その場合その中でイベントを付与するのは(大量に同じイベントを登録してしまうことになるなど)エラーの元になることがあります。 私の経験則として「イベントの中でイベントを登録する際には注意が必要」というものがあるので、イベントリスナーを減らす方向で回答しました。
colling

2018/11/09 05:51

なるほど!
yuuu02

2018/11/09 06:23

なるほど!勉強になりました…! 実は理由があって、スクロールイベントをscrollを使わず自作で作る必要があって、touchstart→touchmove→touchendという流れでイベント処理をしなければならなかったので、方向の判定を先にしていたんです。 ちょっと冗長になってしまいそうですが、アドバイスいただいた方向で作り直してみようと思います。 お二方、本当にありがとうございました!助かりました!
guest

0

デバイスの向きは0度 90度 -90度 で返ってきますので、
if (Math.abs(window.orientation) === 90) {にしてみてはどうでしょう?
(未検証ですが、、。)

*ndroidは180度(逆さま)が返ってきますが、iPhoneのブラウザは逆さまにはなりません。

--追記--
ひとつ手前でやってましたね、、。見逃してました。スイマセン。


--追記--
これで、一回目の横向きからタッチイベントが取れます。

javascript

1 <script> 2 function readDeviceOrientation() { 3 if (Math.abs(window.orientation) === 90) { 4 // 横向き 5 window.addEventListener("touchstart",function(){ 6 alert('touchstart');//イベント確認 7 console.log("touchstart"); 8 }, false); 9 } else { 10 // 縦向き 11 12 } 13 } 14 window.onload = readDeviceOrientation; 15 window.onorientationchange = readDeviceOrientation; 16 </script>

--追記--
イベントリスナー削除つき

javascript

1 <script> 2 function touchOn(){ 3 alert('touchstart');//イベント確認 4 console.log("touchstart"); 5 } 6 function readDeviceOrientation() { 7 if (Math.abs(window.orientation) === 90) { 8 // 横向き 9 window.addEventListener("touchstart",touchOn); 10 } else { 11 // 縦向き 12 window.removeEventListener("touchstart",touchOn); 13 } 14 } 15 window.onload = readDeviceOrientation; 16 window.onorientationchange = readDeviceOrientation; 17 </script>

投稿2018/11/08 06:41

編集2018/11/08 08:41
colling

総合スコア798

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

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

yuuu02

2018/11/09 01:45

collingさん コメントありがとうございます。 ご提示いただいたように実装しているのですが、なぜかiPhoneだとダメですね。。 collingさんに記載いただいているソースを使っても同じでした。。 onorientationchangeとEventListenerの組み合わせでバグが起きてるんでしょうか。。 原因がはっきりしないので対処が難しいです><
colling

2018/11/09 01:51

あら?こちらもiPhoneでのチェックしかしてませんが動いてます。
yuuu02

2018/11/09 01:52

iPhoneのOSやブラウザのバージョンとかってわかりますか?
colling

2018/11/09 01:53

iPhone6S ですが、ブラウザのバージョンはどこで見るんすかね?これ
yuuu02

2018/11/09 01:57

できればiOSのバージョンが知りたいです!iPhoneの設定>一般>情報に記載されてます。 ブラウザのバージョンは端末内ではわからないので、以下サイトにアクセスすれば表示してくれますよ! https://aprico-media.com/ua
colling

2018/11/09 02:01

iOS 12.0.1 ブラウザは、、、Safariの最新だと思います。
yuuu02

2018/11/09 02:02

ありがとうございます!参考にして、もう少し検証してみたいと思います>< コメントありがとうございました!!
colling

2018/11/09 02:03

safari 12.0 でした
colling

2018/11/09 02:04

他に影響がありそうなscriptは混在していませんか?
yuuu02

2018/11/09 02:22

collingさんにいただいたソースのみで検証しているので混在はしていません。 いま、端末を複数台集めてきて検証してみたのですが、元々検証に使用していたiPhoneSE以外ではちゃんと動きました…!!ちゃんと同じソースで確認しています。。 iOSやsafariのバージョンの条件が全く同じものもありますが、なぜか動くものと動かないものがあります。。 とりあえずコードに問題がないようで良かったです。 実機に問題があるようなので、もう少し原因を探ってみようと思います。
colling

2018/11/09 02:32

もし、iPhoneの設定やブラウザの設定による問題を避けたいのであれば、deviceorientではなくてinnerHeightとinnerWidthの差を判断する処理にすれば良いのでは?
yuuu02

2018/11/09 02:37 編集

回転判定部分は判別できているので、addEventもしくはタッチイベント部分が問題あるような気がします…????
colling

2018/11/09 02:41

>元々検証に使用していたiPhoneSE以外ではちゃんと動きました 初歩的な、キャッシュクリアという手段はどうでしょう?
yuuu02

2018/11/09 02:53

キャッシュクリアしてみましたけど、ダメですね。。 横の状態でスタートするとイベントが発生するんですが、そこから縦→横と動かすと発生しなくなります???? 発生しなくなるということは、ちゃんとイベント削除は作用しているようですが、そこから再度イベント登録でつまづいてる感じですかね。。 縦スタートだとまったく動かないので、そこにヒントがありそうなんですが。。
colling

2018/11/09 03:15

検証用のiPhoneSEはiOSバージョンやブラウザバージョンが他端末と違うのでしょうか?
yuuu02

2018/11/09 04:32

やはり回転周りのバグではなさそうですね。イベント関連で何かありそうです。 ちなみに、他検証機で全く同じOS&バージョンのiPhoneXがあるのですが、そちらでは動きました。。 色々アドバイスいただきありがとうございます????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問