web関連
「Cannot read property ‘top’ of undefined」というエラーについて
個人的によく当たるエラーで「毎回何が原因だっけ?」と調べていたので忘れないようにメモ
「Uncaught TypeError: Cannot read property ‘top’ of undefined」エラーの原因
以下のエラーが出た場合は、offset().top
で取得する対象がないため起きている可能性がある。
Uncaught TypeError: Cannot read property 'top' of undefined
僕の場合は、アンカーリンク
クリック時のスムーススクロール
(ヌルっとスクロール)用のjsが原因だった。
例として、以下のようなスムーススクロール
のコードを使っていると、起きる可能性がある。
$('a[href^="#"]').on('click', function(){
var Target = $(this.hash);
var TargetOffset = $(Target).offset().top;
var Time = 700;
$('html, body').animate({
scrollTop: TargetOffset - 20
}, Time);
return false;
});
エラー起きるのは、クリック後のアンカーリンク先:$(this.hash)
がない場合。
例としては、アンカーリンク:$('a[href^="#"]')
はあるのにアンカーリンク先:$(this.hash)
がない。そうすると、クリックした時に.offset().top
でアンカーリンク先の位置を取得できないためCannot read property ‘top’ of undefined(未定義のプロパティ「top」を読み取れません)
というエラーが発生する。
なので、アンカーリンク先が無い時を考えif文
で条件分岐をかけることでエラーを回避することができる。
$('a[href^="#"]').on('click', function(){
var Target = $(this.hash);
// 条件分岐を追加
if(Target.length){
var TargetOffset = $(Target).offset().top;
console.log(TargetOffset)
var Time = 700;
$('html, body').animate({
scrollTop: TargetOffset - 20
}, Time);
}
return false;
});
if(Target.length){ … }
という、条件分岐をかけることでCannot read property ‘top’ of undefined
エラーを回避できる。
スムーススクロールなんだかスムーズスクロールなのか悩んでいたけど同じ言葉のよう。英語だと「smooth scroll」という表記だが、個人的にはスムーススクロール派。