2022.03.05 Sat 2024.04.07
JavaScriptエラーの原因と対処方法一覧
JavaScriptで発生するエラーメッセージと対処方法
JavaScriptの実行時に、エラーが表示されて上手く動作しないことがあります。原因は単純記述ミスから、やや難解なメッセージまでいろいろあります。海外サイトなどでないとエラーメッセージの警告内容が言及されていないエラーも
発生する度に毎回調べるのが手間なので、JavaScriptのエラーメッセージの内容と原因、対処方法などを随時更新されるページ形式で一覧にまとめてみました。
登録されているエラー一覧
- Uncaught TypeError: can’t convert undefined to object
- Uncaught ReferenceError: *** is not defined
- Uncaught TypeError: $(…).show().delay(…).fadeOut is not a function
- Error:Promised response from onMessage listener went out of scope
- Uncaught TypeError: $(…).functionName is not a function
- Uncaught TypeError: target.offset() is undefined
- Uncaught TypeError: XXX is null
- Uncaught TypeError: $ is not a function
- Uncaught Error: Syntax error, unrecognized expression:xxx
- JavaScript エラーリファレンス
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors
JavaScriptエラー一覧
- Uncaught TypeError: can’t convert undefined to object
エラー発生時の条件
問題の原因と解決策
- 問題の原因はオブジェクトキー値の文字列やランダム時に発生するので、文字列(全角/半角)の値取り扱いの対応が必要になると推察しました。
エラー内容はオブジェクトがundefinedとなり未定義という意味なので、参照している変数が定義されてないという意味のようです。
配列オブジェクトの入れ子になっているループ文の中の変数に対して発生しているため、 for (var i = 0; i < Cnt; i++) { Object.values(変数[e][i]); } の時に、参照しているオブジェクトのkeyを降順の数値を指定した場合はOK。文字列やランダムな英数時などはエラーがでる。
iの指定方法が不正であったようで、 Object.values(変数[e][i])という記述に誤りがあったので、 Object.values(変数[e])[i]とすることでエラーが回避されました。
nullやundefined関連のエラーは、正しく値が定義されていない、参照されていないために発生するので、少し時間がかかりますが、ひとつづつ切り分けをして追及していくと原因判明がしやすいかもしれません。
- Uncaught ReferenceError: *** is not defined
エラー発生時の条件
問題の原因と解決策
- エラーメッセージ通り、***正しく定義されていないというメッセージです。
definedは未定義という意味なので、どこかで勝手に変数を追加しているけど、変数定義を正しくしてくださいということです。
ありがちなのは関数の外の変数を参照しようとしていたり、変数名を変更した際に、前に定義していた変数名などが残っているケースがあるので、エラーの出る変数の名前もしくは宣言を修正することで解消されました。
- Uncaught TypeError: $(…).show().delay(…).fadeOut is not a function
エラー発生時の条件
問題の原因と解決策
- エラーメッセージ通り、show()もdelay()もfadeOut()も全部関数じゃないというメッセージです。
疑問なのは途中までの記述は動作しており、この関数部でエラーが発生。JQueryバージョン関数のコンフリクトが発生しているのかと色々困った挙句、調べていくうちにJQuery3.6.0.slim.min.jsが原因であることが判明。
3.6.0.slim.min.jsは3.6.0.min.jsとは別もので、必要な関数が含まれていない、まさにslim(スリム)化されたライブラリのため、よく使うshow()やdelay()やfadeOut()などの関数が含まれていない。
BoostrapというCSSフレームワーク導入時には、標準でjQueryのスリムビルド版を読み込むようになっているようす。 信じられない話だが、JQueryでよく使う関数ベスト10(当社独自ランキング)のほとんどが使用できない。
- animate
- show
- hide
- delay
- fadeOut
- fadeIn
- fadeToggle
- fadeTo
- slideDown
- slideUp
- slideToggle
対処方法としては、通常の3.6.0.min.jsの正規版を読み込む記述にすることで回避できる。 他のJQueryプラグインなどある場合は、そこより下に読み込むとエラーになるので、スリムビルド版の記述を正規のJQueryに訂正した方がよいでしょう。
- Promised response from onMessage listener went out of scope
エラー発生時の条件
問題の原因と解決策
-
エラーメッセージの意味をGoogle翻訳すると、
エラー:onMessageリスナーからの約束された応答が範囲外になりました
わかるようでわからない。おそらくセッション系のやり取りになるのでしょうか。background.jsという見覚えのないJavaScriptファイルがエラーの発生源となっています。 background.jsとはマイクロソフト社の名前があり、どうやらフリーウェアファイルのような記載もあります。 一説には拡張機能を動作時に読み込まれるファイルのようで、拡張機能(アドオン)動作と関係があるようでした。 当社の環境ではブラウザがFirefoxでアドオンGhostreyを起動させていると発生しました。 Ghosteryを停止するとエラーは発生しませんが、このbackground.jsファイルの特定環境でのエラーは実際のページ表示や機能には関与せず、特段気にする必要はない(自発的に修正できない)ようなブラウザ(OS)特有設定時でのエラーということになり、解決策としてはアドオンを非使用にすることですが、わりと利用価値のあるアドオンであるため、このエラーに関してはそのままスルー対応となりました。
- Uncaught TypeError: $(…).functionName is not a function
エラー発生時の条件
問題の原因と解決策
-
エラーメッセージの意味をGoogle翻訳すると、
キャッチされないタイプエラー:functionNameは関数ではありません
functionNmaeという関数が宣言されていないのでエラーになって動作しません、というようなニュアンスでしょうか。 ただ、スライダー単体ではエラーが発生しないのに、既存ページに設置した場合のみエラーが発生して動作しません。結論から言えば、このエラーはほぼ関数が正しく宣言されていない場合か、jQueryがコンフリクト(衝突競合)している場合です。スライダー単体では動作するので、jQueryのコンフリクトが考えられます。 この場合は同じバージョンのjQueryで統一するか、エイリアスを使用することになります。複数のJavaScriptファイルが読み込まれている場合は、可能であれば同じバージョンのjQueryを使用することが最も手っ取り早いですが、複数のファイルが組み込まれている場合や特定バージョンでないと動作しない場合などはエイリアスで追加したスライダーの標準のjQuery($)ではなく、独自のエイリアスを宣言して回避しました。
- Uncaught TypeError: target.offset() is undefined
エラー発生時の条件
問題の原因と解決策
-
エラーメッセージの意味をGoogle翻訳すると、
キャッチされない TypeError: target.offset() が未定義です
targetという変数で移動するidを取得してoffset()関数というHTMLページ内要素の左上を原点としてX・Y座標を取得する関数でセットされた場所が定義されていない、というようなニュアンスでしょうか。結論から言えば、このエラーはほぼ移動先のidがページ内に存在していないということで表示されるエラーとなります。 ですので、ページ内のアンカーリンク先のid属性を設置すればエラー表示は解決されるはずです。 設定しない場合はhref=”javascript:void(0)”ということで常にundefinedを返すことが可能ですが、aタグ内でもともとリンクを無効化する場合に使用する場合意味がないため、aタグ自体をpタグなどのブロック要素に変更することで根本的な解決が図ることができる。
- Uncaught TypeError: XXX is null
エラー発生時の条件
問題の原因と解決策
-
エラーメッセージの意味は変数XXXが空であるとなっていて、
対象がundefined または nullの時
にしばしば発生します。 静的ぺージのマークアップ段階では発生していなかったエラーですが、WordPressに組み込む際にエラーが表示されるようになりました。解決策自体はいたって簡単で、変数XXXにgetElementByIdで参照していたHTMLタグをページ内に配置することで解決しました。結論としてTypeErrorのis nullやis not definedはすべて参照している関数や変数などが正しく存在していないことから生じるエラーです。 ですので、読み込まれるはずの値を正しく設置または指定することでエラー表示は解決されます。
- Uncaught TypeError: $ is not a function
エラー発生時の条件
問題の原因と解決策
-
エラーメッセージの意味は変数$(JQuery)が関数として定義されていません!というごくシンプルな内容です。
- 対象が関数として定義されていない時
asyncを削除してDOMに従って読込をさせることでエラー表示は解決されます。
またグローバルスコープJQueryやエイリアスで標準指定されている$マークは、他のバージョンのJQueryとコンフリクト(競合)することで、同じエラーが表示されることがあります。
その場合は、以下のようにエイリアスを独自に指定することで、異なるバージョンのJQueryを共存させることができます。任意のグローバル関数名 = jQuery.noConflict(true);
jQueryが複数バージョン使用されている場合のチェック記述
console.log($.fn.jquery); //$はどのjQueryバージョンが有効になっているか console.log(jQuery.fn.jquery); //jQueryはどのjQueryバージョンが有効になっているか
- Uncaught Error: Syntax error, unrecognized expression:xxx
エラー発生時の条件
問題の原因と解決策
-
エラーメッセージの意味は文法エラーでJQueryで認識できないセレクタが含まれているという内容です。
- 対象セレクタが認識されない書式または値である時
セレクタとして指定していた$(‘a[href=#anc-exc]’)がJQuery3では構文が変更されており、JQuery2で認識されていたセレクタが解釈できなくなったためのエラーです。
$(‘a[href=”#anc-exc”]’)と指定した関数内のセレクタをダブルコーテーションで囲うことでエラーがでなくなりました。
バージョン変更による影響
jQuery構文変更により以前エラー判定されていなかった記述がエラー判定されるケースは多いので注意が必要です。
結構な割合で未定義エラーが多いし発生しやすい
お薦めの関連記事
掲載情報につきましては当社が独自に調査、検証および収集した情報です。
情報の妥当性や確実性を一切保証するものでなく、情報や内容が訂正や修正、変更されている場合があります。 よって、当社サイトの利用により生じたいかなる損害等についても運営側にて一切の責任を負いません。
掲載情報の修正・変更等をご希望の場合はお知らせください。