ポク太郎です。
ホームページを動的に変化させることができるJavaScript。非常に便利ですが、困るのは動いてたプログラムが突然動かなくなる現象。
本ページの話題は「動いてた筈のJavaScriptプログラムがいつの間にか動かなくなってた」。主にトリガとなるのは、
- Firefox、Chromeなどのブラウザのアップデート
- WordPressのアップデート
- WordPress用テーマのアップデート
- 無料ブログシステムのアップデート
サイト全体に使用してた場合には全ページに影響。「早急な対処必要!」と焦る最悪のトラブルです。
内容は「JavaScriptが動かなくなってた場合の確認事項列挙」
実際に自分が遭遇したそれらケースの原因と対策を以下に並べます。
今後、遭遇する度に項目を追加していきます。
ブラウザfirefoxアップデート時
タイミング | 原因・切り分け・対策方法 |
Firefoxアップデート | 【原因と対策】文末記号;の後ろでない場所に//でコメント記述してた→アップデートによりそれでエラー停止するように。
if (hoge == 1) {//ここにコメント書いてた return true; } else { return false; } (正しくは) if (hoge == 1) { //コメントはここじゃないとダメ return true;//コメントはここじゃないとダメ } else { return false; } 【対策】FireFoxのバグと思われますが、自分のでなく閲覧者のブラウザのバージョンで動作可否が決まるので、将来のバージョンで修正されようがどの道対応要。 ⇒下で示すように最初から自力でコメントを削除してしまう方が安全。 |
WordPressプラグインアップデート時
タイミング | 原因・切り分け・対策方法 |
WordPress用テーマアップデート | 【原因と対策】同等の機能がテーマに内包された後、Wordpress用プラグインを更新すると、競合したか何かで動かなくなった。 以下のプラグインを停止することで復活し動くように。
今回はプラグイン更新時の発覚でしたが、テーマアップデート時も同様に発生するパターンと考えられます。 |
ブラウザsafariアップデート時
タイミング | 原因・切り分け・対策方法 |
safariアップデート | 【原因】onload関数の挙動がブラウザアップデートで変化し、JavaScriptがスタートしない状況に陥ってた。
if (frompc == true ) { //DOM読込完-iphoneで動かず window.addEventListener('load', function(){INI();}, false);} else { document.addEventListener('DOMContentLoaded', function(){INI();}, false);} //document.addEventListener('deviceready', function() {INI();}, false);} iPhone等のスマホではブラウザはページでなくアプリ扱いになるので上記のようにEventListenerの使い方が異なるとのこと。 【対策】その仕様がアップデートでコロコロ変わるなら、できる限りonload関数に頼らないのがベスト。 |
JavaScript最小化を行ったタイミングで
タイミング | 原因・切り分け・対策方法 |
自作最小化プログラム適用時 | 【原因と対策】Wordpress用プラグインが最小化させてない部分発見→自力で最小化→プラグインが悪さして動かなく。プラグインの除外設定することで動くように。
プラグインの単なるバグだと思われますが、Autoptimizeはトラブルが多いので排除し、できる限り自力で最小化する方向で再構築するのが適。 |
プラグインAutoptimizeの除外設定
「JavaScriptオプション」中の「Autoptimizeからスクリプトを除外」に該当のJavaScriptファイル名を指定します。
WordPressのカスタムJavaScript欄から移動した際
JavaScriptはエラーが起きると以降を実行せず停止してしまいます。
ここで起きたのは、
●動く→WordPress記事編集画面のカスタムJavaScript欄に記入。
●動かず→動作確認後、<script async src=”name.js”></script>でファイル読込。
理由は実行順序の入れ替わり。エラー発生する方が先に実行されるようになってしまい動かない現象として顔を出してしまったものかと。
で、自分がやらかしたのはnullの処理を怠ってたのが原因でした。
タイミング | 原因・切り分け・対策方法 |
カスタムJavaScript欄から移動時 | 【原因】nullの処理を怠りエラー停止するプログラムの実行順序が入れ替わり、後ろに回されたJavaScriptが動かなくなってた。
//カスタムJavaScript欄でのみ動くソース var url=location.href; var tmp = url.split('/recall-'); var tmp2 = tmp[1].split('.html'); //★ここでtmp[1]に何も代入されない場合が発生し、それを元にtmp2を計算させてエラー発生! //修正ソース var url=location.href; var tmp = url.split('/recall-'); if (tmp[1] != null) { var tmp2 = tmp[1].split('.html'); } 【対策】修正ソースのように、if文でnull確認し処理をしっかり指定することでファイル読込<script async src=”name.js”></script>でも無事動くように。 このケースは、文法チェックではエラー無し→実行させてエラーとなるタイプが当てはまるかと。圧倒的に多いのがいわゆるNull Objection。散々自分がやらかすのは、
○nullの処理怠る。
○最大・最小要素数を超えて配列変数の要素指定。 ○型でなく数値的に矛盾する引数を関数に渡す。 |
もしもかんたんリンクを貼ったタイミング
タイミング | 原因・切り分け・対策方法 |
もしもかんたんリンク貼る | 【現象・原因】もしもかんたんリンクを貼った場所以降のJavaScriptがすべて停止してた。条件は詳細に調べてませんのであしからず。
アドブロックonの場合限定かも。ただ、何にせよ他者にJavaScriptを預けることへの危険度に気付きました。
【対策】うちはもしもかんたんリンクをすべて撤去しました。 【確認方法】WordPressであれば大抵はアフィリエイトタグのテンプレート使用かと。 なので、ダミー記事に全アフィリエイトタグを並べ、その下に(実行順が後になるように)動作確認済のJavaScriptを貼って正常動作することを確認します。 |
これはもしもかんたんリンクに限った話ではなく、他社ASP製のブログパーツ、それ以外にもランキングや何らかのサービス全てで想定されるもの。
なので、他者作成のJavaScriptは、使用前確認のためのダミー記事でしっかり確認後に採用すべきと思います。自分でどうこうできる問題ではないので。
全ページに影響するのでとにかく焦るトラブル。JavaScriptの一番嫌なとこ。
なので、何かをアップデートする際に確認すべき点を列挙したチェックリストをご自身で作っておくといいかもね。
どれだけ時間を掛けて緊急時に即対処できる体制を築き上げておくかがスピードアップへの道。
そこには手間暇と時間を掛けるべき。そーいうとこを効率化と端折る経団連のサル共に騙されてはいけませんぜ。
コメント