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」という表記だが、個人的にはスムーススクロール派。