Почему возникает ошибка "Не удаётся прочитать свойства неопределённого (чтение 'length')"?

Всем привет! Можете подсказать, как решить проблему с ошибкой в консоли: <br/> Uncaught TypeError: Cannot read properties of undefined (reading 'length')? <br/> <br/> Код работает, класс "active" добавляется, но возникает эта ошибка. <br/> <br/> Я перебираю все ссылки меню и, если какая-либо из них (включая подссылки) совпадает с атрибутом href, добавляю класс "active" к соответствующему элементу меню. <br/> <br/> Вот часть HTML-кода для меню: <pre><code class="html">&lt;ul class="sidebar"&gt;
		&lt;li&gt;
			&lt;a href="news/top/" class="menu-item"&gt; &lt;!-- href="#"--&gt;
				&lt;span&gt;&lt;i class="fa fa-home"&gt;&lt;/i&gt;&lt;/span&gt;&lt;h3&gt;Топ Новости&lt;/h3&gt;
			&lt;/a&gt;
		&lt;/li&gt;
		&lt;li&gt;
			&lt;a href="news/top2/" class="menu-item"&gt; &lt;!-- href="#"--&gt;
				&lt;span&gt;&lt;i class="fa fa-home"&gt;&lt;/i&gt;&lt;/span&gt;&lt;h3&gt;Топ Новости 2&lt;/h3&gt;
			&lt;/a&gt;
		&lt;/li&gt;
		&lt;li&gt;
			&lt;a href="news/top3/" class="menu-item"&gt; &lt;!-- href="#"--&gt;
				&lt;span&gt;&lt;i class="fa fa-home"&gt;&lt;/i&gt;&lt;/span&gt;&lt;h3&gt;Топ Новости 3&lt;/h3&gt;
			&lt;/a&gt;
		&lt;/li&gt;
		&lt;li&gt;
			&lt;a href="news/top4/" class="menu-item"&gt;
				&lt;span&gt;&lt;i class="fa fa-home"&gt;&lt;/i&gt;&lt;/span&gt;&lt;h3&gt;Топ Новости 4&lt;/h3&gt;
			&lt;/a&gt;
		&lt;/li&gt;
&lt;/ul&gt;</code></pre> <br/> <br/> И код, который я использую: <br/> <code>$('.sidebar li').removeClass('active');</code> <br/> <code>var path = window.location.pathname;</code> <br/> <code>$('.sidebar li a').each(function() {</code> <br/> <code>var href = $(this).attr('href');</code> <br/> <code>if(path.slice(1).substring(0, href.length) === href) {</code> <br/> <code>$(this).parent('li').addClass('active');</code> <br/> <code>}</code> <br/> <code>});</code>
  • 25 сентября 2024 г. 16:23
Ответы на вопрос 2
Ошибка "Cannot read properties of undefined (reading 'length')" обычно возникает в JavaScript, когда вы пытаетесь получить доступ к свойству (`length` в данном случае) у переменной, которая равна `undefined`. В вашем случае это может происходить, когда переменная `href` не определена.

Давайте разберем ваш код:

```javascript
$('.sidebar li').removeClass('active');
var path = window.location.pathname;
$('.sidebar li a').each(function() {
    var href = $(this).attr('href');
    if (path.slice(1).substring(0, href.length) === href) {
        $(this).parent('li').addClass('active');
    }
});
```

Вот несколько причин, почему может возникнуть ошибка:

1. **Отсутствие атрибута `href`**: Если у какого-либо элемента `<a>` в вашем меню нет атрибута `href`, то `$(this).attr('href')` вернет `undefined`, и попытка получить `href.length` вызовет ошибку. Вы можете проверить, определена ли переменная `href`, перед тем как использовать ее:

    ```javascript
    var href = $(this).attr('href');
    if (href && path.slice(1).substring(0, href.length) === href) {
        $(this).parent('li').addClass('active');
    }
    ```

    Это гарантирует, что код внутри `if` будет выполняться только в том случае, если `href` определен.

2. **Неправильный селектор**: Убедитесь, что все ваши ссылки имеют корректный селектор и что ссылки действительно содержат атрибут `href`.

3. **Сраниение с `undefined`**: Убедитесь, что `path` тоже корректен. Если `window.location.pathname` по какой-то причине возвращает `undefined`, это также может быть причиной проблемы, хотя это маловероятно в обычных условиях.

В данном случае, лучшая практика — всегда проверять переменные на определенность перед использованием их свойств. Корректный код будет выглядеть так:

```javascript
$('.sidebar li').removeClass('active');
var path = window.location.pathname;
$('.sidebar li a').each(function() {
    var href = $(this).attr('href');
    
    // Проверяем определенность href
    if (href && path.slice(1).substring(0, href.length) === href) {
        $(this).parent('li').addClass('active');
    }
});
```

Используя это изменение, ваша ошибка должна исчезнуть.
Очевидно, где-то дальше, после активного пункта, у вас есть тег a без атрибута href . 
Ну или ошибку генерирует какой-то другой код.
Похожие вопросы