IEで「オブジェクトを指定してください」のエラー
エラーメッセージを言い換えると分かった。
「オブジェクトを指定してください」
「オブジェクトが指定されていないよ」
「オブジェクトが無いよ」
「オブジェクトがundefined
だよ」
原因
3通りあるようだ
原因1 古いIEと文字コード
IEの謎エラー対策(1) 「オブジェクトを指定して下さい」が外部ソースの場合 - 趣味の延長線 の通り、charsetを指定する。
原因2 関数が未定義
例
var hoge hoge(1) // "オブジェクトを指定してください。"
原因3 関数の後にセミコロン忘れ
(function(){})() (function(){})()
戻り値の無い関数はundefined
を返す。
分かりやすいようにfunction
をalert
に置き換えて整理すると、
(alert)() // =undefined (alert)()
そしてこうなる。
undefined(alert)()
この時、
undefined()
という式を実行しようとする。原因2と同じように、関数ではないものを実行しようとしているのでエラー。
余談、エラーメッセージについて
obj.propの形の関数だと少し分かりにくい。
Math.foo(1)
"オブジェクトは 'foo' プロパティまたはメソッドをサポートしていません。"
[Math.foo].map(function(e){ return e(1) })
"オブジェクトを指定してください。"
同じことなら、同じエラーメッセージにして欲しい。
objectの中のobjectを書き換え不可にする
deepFreeze
とdefineProperty
を併用する。
You might not need jQuery は間違いだらけ
追記: 文面を修正しました。 2018-05-21
すこし話題になっている(いた?)ようだが、jQueryを(読むだけで自分では)使ったことの無い私が気付いただけで間違いが10個あった。
見つけた間違い
60個あるうち10個
つまり全体の1/6, 16.6%
内容についてはレポジトリ参照(しかし、そこまでする利点は無いので見なくてよいです)
メソッド | どうしたか |
---|---|
children | 既にissueにあった |
contains | issue出した |
empty | issue出した |
fadeIn | issueで指摘されたのに確認されないまま閉じられたのでコメントした |
trigger | issue出した |
offset | PR(Pull Request)が間違っていたのでコメントした |
outerWidth/Height | PRを取り入れていたが、やはり間違っていたのでコメントした |
AJAX | グローバル変数になっている。onloadの中も変。面倒なので何もしない。 |
parseHTML | childNodesを使うべきところでchildren。何もしない。 |
※表だと9だが、outerのところで2つなので10とカウント
trigger, offset, outerHeight は 2014/03/06現在 まだ修正されていない。
emptyは修正しないようだ。
さらに、formの部品になる要素のcloneNodeなど、本当は要修正がまだある(IEではコピーした要素のvalueが空になる)。
このレポジトリのオーナーは
- jQueryのソースを全く読まず
- まともにテストもせず
に書いている。断言できる。まだ間違いはありそうだけど、これ以上はやめにした。
見た時にはすでに修正されていたが、isArray
の方法がメチャクチャだった。これ一つだけでも、どれだけひどいかが十分に分かる。
isArray = Array.isArray || function(arr) { return arr.toString() == '[object Array]' }
このレポジトリに対する反応
3000スター以上付いている。どういうことなの・・・
jQuery作者のツイート
I keep writing and deleting glib responses to http://t.co/x86shlHj5f Need to learn to bite my tongue. heeelpmeee
— John Resig (@jeresig) 2014, 1月 30
この返しが面白い
@jeresig make http://t.co/CEXxOKIoii exactly the same, but switch the left and right columns.
— Kenneth (@kpk) 2014, 1月 30
雑感
- 素直にjQuery使うほうが良い。必要な部分だけコピーして使うこともできるわけで。
- 前述の通り誤りがあるのでサイトのコードは使わないようにしよう。