5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScriptAdvent Calendar 2017

Day 17

platform.jsで特定のブラウザを弾く

Last updated at Posted at 2017-12-16

普段はClojureScriptでフロントエンドの開発をしているIkuruと申します。
JavaScriptは普段書きません(汗

最初はClojureScriptの宣伝の記事を書かせていただこうと思っていたのですが、
最近生JavaScriptを初め使った出来事があってタイムリーだったので趣旨を変更しました。

問題:reactベースのアプリケーションが動かないブラウザーがあるので、ブラウザを検知して警告を出したい

ClojureScriptで開発していたreactベースのSPAで、FirefoxとChromeでしかテストしていなかった
→リリース直後にユーザーからIE11だと動かないというフィードバック
→UXのためにIEだったらアプリケーションを起動せずに即別のブラウザ使って下さい的メッセージを表示しよう!
→生JSで数行で済む事をClojureScriptでやるのは無駄だよね

という経緯で初めて仕事でJavaScriptを使う事になったのでした。

ソリューション: platform.js で検知→domをゴニョゴニョ

軽くググって一番上に出てきたplatform.jsというライブラリを使いました。

cdnjsに登録されている物をscriptタグから読み込み、プラットフォームのチェックと表示の切り替えのdom操作を以下のように書きました。

[:body
 [:div [:div#app "Hello world"] 
       [:div#warn "Please use a supported browser"]]
 [:script {:type "text/javascript",
           :src "https://cdnjs.cloudflare.com/ajax/libs/platform/1.3.4/platform.min.js"
           :async false}]
 [:script
    ;; valid browsers
    "if (!(platform.name == 'Chrome') &&
         !(platform.name == 'Safari') &&
         !(platform.name == 'Firefox') &&
         !(platform.name == 'Opera') &&
         !(platform.name == 'Microsoft Edge')){
       //hide the loading
       document.getElementById('app').setAttribute('style', 'display: none;');
       //change the id so that reagent loses the target to mount                                                                       
       document.getElementById('app').id = null;
 
       //make the warning element visible
       document.getElementById('warn').setAttribute('style', 'display: block;');
     }"]

解説

[:body... とか [:scrips... ?

ClojureではメジャーなHiccup記法と呼ばれる物でClojureのデータ構造でHTMLのマークアップを表現しています

platform.jsはaync=falseで読み込む

platform.jsが読み込まれる前にアプリケーション本体のjsが動いてしまわないようにする為に指定しています。

scriptタグ内の処理

今回はInternet Exploerer を弾きたかったため

  • IE以外の主要ブラウザだった場合は何もしない → アプリが起動する
  • IEだった場合は
    • #app のdivにdisplay: noneを設定して非表示
    • #app のidを変更してアプリケーションがマウントされないようにする
    • 注意文が入っている #warn のdivのdisplayを設定して表示されるようにする

上記のようにしました。

その他の宣伝

普段はClojure/ClojureScriptを書いてて、今年のClojureアドベントカレンダーにも記事を書きました。
よろしけばこちらもチェックしていただけると嬉しいです!
https://qiita.com/iku000888/items/2f047d7c5eaa0235b61c

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?