Задать вопрос
@PiggyPig

Почему функция MutationObserver зацикливается?

Как не пробовал найти более-менее развернутую информацию про MutationObserver находил один и тот же код, по примеру которого выходила полная бредятина, она при этом и зацикливалась, ложа сайт вместе с браузером.

Приведу одну из последних попыток выполнить данный код. Может кто сможет объяснить, что не так-то.
По задумке нужно изначально после загрузки страницы изменить ссылку c "/link" на "/newlink". И постоянно заменять старую на новую в случае, если все собьется и вернется первая.

<ul>
    <li id="change">
        <a href="/link">...</a>
        <div>...</div>
        <div>...</div>
    </li>
    ...
</ul>


var a = document.getElementById('change').children[0];
a.setAttribute('href', '/newlink');

var mObserver = new MutationObserver(function() {
    a.setAttribute('href', '/newlink');
});
if (a.href != '/newlink'){
        mObserver.observe(a, {attributes: true});
}


В любом случае где-то сильно лажаю, так как вместо одноразового выполнения в консоли вижу зацикливание с цифрами переваливающими за тысячи, ну и дальнейшим мертвым зависанием браузера.
  • Вопрос задан
  • 297 просмотров
Подписаться Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега JavaScript
Приведенный код отвратительный. И не удивительно, что он виснет.

Сначала задается значение атрибута href новым значением, а потом проверяется равно ли значение ссылки этому значению. Возможно так задумано, но a.href будет равен "mysite.ru/newlink", а не "/newlink". И скорее всего там должно быть a.getAttribute("href") !== "/newlink".

Поэтому срабатывает условие. Обсервер слушает изменения атрибутов, а функция изменяет те атрибуты, которые слушаются. Тем самым запускает бесконечный цикл вызовов функции обсервера и изменения атрибута.

А еще в html не закрыты теги.

https://jsfiddle.net/vvk6g370/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы