アオカケスの鳥かご

日々の出来事を綴っていきたい

location.hashはandroidのchromeだとフリーズするかもしれない

とあるwebアプリを作っていたのですが、検索結果を表示したあとにその表示部分にページ内遷移させるとフリーズしてしまいました。

現状の対処法を残しておきます。

問題の環境

機器 Zenfone 5
Androidバージョン 9
ブラウザ Chrome(73.0.3683.90)

Android7.1.1のxperiaで同じバージョンのchromeでは再現できなかったので、chromeというよりもAndroidのバージョンの問題なのかもしれません。

背景

入力した地名の読みがなを表示してくれるwebアプリを作りました。

このwebアプリで実際に地名を入力すると以下のように表示されます。

f:id:aokakes:20190414165817j:plain

この場合は候補が少ないので特に問題ないのですが、候補が増えると画面をスクロールする手間が増えてしまいます。

f:id:aokakes:20190414165825j:plain

そこで、検索後に検索結果表示欄に自動で移動させることにしました。

実装方法

とりあえずアンカーを使えばいいでしょう。
検索結果を表示したあとに移動させたいので、javascriptで実装してみます。

やること自体はかなり単純で、検索結果を表示する部分の直後に以下の一文を加えるだけです。

window.location.hash = "result";

これだけで理想通りの動きをするようになります。

Android以外では。
Androidの中でもchromeだと動かないようです。Firefoxでは正常に動きました。

原因?

とりあえず各ブラウザのlocationの対応状況を確認してみました。

f:id:aokakes:20190414174309p:plain
https://developer.mozilla.org/ja/docs/Web/API/Location

AndroidChromeのLocationのところが?になっていますね。
なんだかこれが原因なような気がします。

それ以外の部分は対応しているので何とも言えない部分はありますが...


色々試してみたところ、hashやprefなど、データを取得することはchromeでも問題なくできるようでした。
しかし、hashなどを使って移動させようとなると話は違うようです。

移動せずにフリーズするならまだ分かるのですが、なぜか移動したあとにフリーズします。

対策

locationはandroidchromeでは思い通りに動かない可能性があるので使わないことにして、代替手段を探します。


少し探してみると、jqueryでスクロールさせる方法が多く見つかりました。

でも、サイトの多くがヌルッとスクロールさせるやつでした。
早く結果を知りたい人にとってはこういった機能はたぶんいらないので、パッと移動するようにします。

$(function(){
	$(window).scrollTop($('#result').offset().top);
});

これでandroidchromeでも動くようになります。

まとめ

ページ内遷移させるときはlocation.hashやlocation.hrefなどは使わず、jqueryでスクロールさせる。


手元にある別のスマホではlocation.hashでも正常に動くのでフリーズするスマホの数は少なそうではあります。

とはいえ、スマホのブラウザにおいてchromeはシェア率が高いですし、スマホからもアクセスが多いようなコンテンツでは注意したほうがいいかもしれません。