【JavaScript】Uncaught TypeError: Illegal invocation - 回避方法


Uncaught TypeError: Illegal invocation

console.logにて上記エラーが表示された。
該当箇所を見てみると、


if (navigator.plugins && navigator.plugins.length) {

↑ここで止まってる様子。

ちなみに、モバイル用のデバッグを行っていたので、ああ、スマホはプラグインとかに依存してないからなぁ、などと考えつつデバッグを続行。
navigator.pluginsをコンソールに投げる。


▼PluginArray {}
	▶︎constructor: PluginArray()
	▶︎item: item()
	 length: (...)
	▶︎get length: ()
	▶︎namedItem: namedItem()
	▶︎refresh: refresh()
	▶︎__proto__: Object

ああ、lengthは取れないのね、と思いつつ中身を見てみると、


[Exception: TypeError: Illegal invocation at PluginArray.remoteFunction (<anonymous>:3:14) at Object.InjectedScript.callFunctionOn (<anonymous>:721:66)]

とまぁ、ありがたい呪文が、、w
スミマセン、ニフォンゴ デ オネガイシマス(´∀`*)

取り敢えず、上から順番に当たってみよう、ということで、constructorを開くと、あら、素敵☆


▼constructor: PluginArray()
	 arguments: null
	 caller: null
	 length: 0
	 name: "PluginArray"
	▶︎prototype: PluginArray
	▶︎toString: toString()
	▶︎__proto__: ()
	▶︎<function scope>

こんなところにlengthちゃん隠れてるじゃない☆

で、颯爽と下記のようにしましたよ。


if (navigator.plugins.constructor.length !== 0) {
	if (navigator.plugins && navigator.plugins.length) {
		〜とりまスマホにゃ関係ない処理ホニャララ〜
	}
}

ハイ! これでバッチリ☆
怒られなくなりました(´∀`*)

備忘録として。


【追記】10進数HTML数値文字参照

記号10進数
&#9650;
&#9660;
▶︎&#9654;
◀︎&#9664;
___ spelt by vincent.