В чем может быть причина undefined у offset().top?

210
31 декабря 2018, 19:30

господа.

Мастерю себе скрипт плавного перемещения по якорям на лендинге.

Написал такой код:

$('.anchor').bind('click', function(e) {
    e.preventDefault();
    var height = document.body.offsetHeight;
    var curPos = $(document).scrollTop();
    //to the anchor
    var anchorID = $(this).attr('href');
    console.log(anchorID);
    var anchorPos = $(anchorID).offset().top;
    console.log(anchorPos);
    var scrollTime = 0;
    if (anchorPos > curPos) {
      scrollTime = (height - curPos) / 3;
      $("body,html").animate({
        "scrollTop": anchorPos
      }, scrollTime);
    } else {
      scrollTime = curPos / 3;
      $("body,html").animate({
        "scrollTop": anchorPos
      }, scrollTime);
    }
  });

На лендинге есть 4 якоря такого вида:

<a name="test1"></a>
...
<a name="test2"></a>
...
<a name="test3"></a>

Ссылки, которые ведут на якоря выглядят вот так:

  <li>
    <a class="anchor" href="#test1">test1</a>
  </li>
  <li>
    <a class="anchor" href="#test2">test2</a>
  </li>

Скрипт работает на с 1 и последней ссылках. Те, что в середине, выбивают ошибку

Uncaught TypeError: Cannot read property 'top' of undefined

Не могу понять почему при 1 и последней все нормально, а при остальных ошибка

Буду благодарен за любую помощь! Заранее спасибо!

Answer 1

He name, a id.

Выборка $(anchorID) не содержит DOM-элементов, и ее метод .offset() возвращает undefined.

$('.anchor').bind('click', function(e) { 
  e.preventDefault(); 
  var height = document.body.offsetHeight; 
  var curPos = $(document).scrollTop(); 
 
  //to the anchor 
  var anchorID = $(this).attr('href'); 
  console.log(anchorID); 
  var anchorPos = $(anchorID).offset().top; 
  console.log(anchorPos); 
  var scrollTime = 0; 
 
  if (anchorPos > curPos) { 
    scrollTime = (height - curPos) / 3; 
    $("body,html").animate({ 
      "scrollTop": anchorPos 
    }, scrollTime); 
  } else { 
    scrollTime = curPos / 3; 
    $("body,html").animate({ 
      "scrollTop": anchorPos 
    }, scrollTime); 
  } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
На лендинге есть 4 якоря такого вида: 
 
<a id="test1">111</a> ... 
<a id="test2">222</a> ... 
<a id="test3">333</a> ... 
<a id="test4">444</a> Ссылки, которые ведут на якоря выглядят вот так: 
 
<ul> 
  <li> 
    <a class="anchor" href="#test1">test1</a> 
  </li> 
  <li> 
    <a class="anchor" href="#test2">test2</a> 
  </li> 
  <li> 
    <a class="anchor" href="#test3">test3</a> 
  </li> 
  <li> 
    <a class="anchor" href="#test4">test4</a> 
  </li> 
</ul>

Answer 2

Вы ищете id, но тегам указали атрибут name.

Замените все <a name="testX"> на <div id="testX">.

READ ALSO
Плавное разворачивание блока

Плавное разворачивание блока

Вроде бы типичная ситуация, но не могу понять, как сделать на jQuery плавно разворачивающиеся текст? То бишь, мне нужен аналог slideToggle для блока,...

215
Запись значения radio в переменную jQuery

Запись значения radio в переменную jQuery

есть код который позволяет скрыть определенные элементы, при значение из спискаКак его переделать, чтобы он работал при radio?

231
Linq - как бы объединить в одно условие

Linq - как бы объединить в одно условие

Как бы объединить в одно условие вот такой набор правил:

207
Проблема с InvalidOperationException

Проблема с InvalidOperationException

В проекте я пытаюсь реализовать "разрыв линии" (то есть при нажатии на линию создается точка, с которой соединяются два элемента)

238