Доброе утро, ребята!
С Наступающим!
Вчера столкнулся с новыми проблемами.
У меня есть меню:
- Пункт А
- Пункт Б
...
У каждого пункта есть признак "свернуть/развернуть", позволяющий понять, свернуто меню или нет.
Задача: развернуть пункт А и вычислить следующий за ним Пункт С, который может появиться, а может и нет.
Как делаю я: кликаю на пункт А, жду, когда у пункта А признак сменится на "свернуть" (значит, пункт меню раскрылся), а затем вычисляю следующий пункт.
Проблема в том, что при таком подходе у меня неизменно следующим пунктом вычисляется пункт Б. Если же я поставлю задержку хотя бы на секунду, то уже следующий пункт вычисляется правильно - пункт С.
Включил инструменты разработчика и увидел, что из сервера ко мне приходит следующий код:
<partial-response>
<changes>
<update id="xxx">
</update>
<update id="xxx">
</update>
***
</changes>
</partial-response>
Как я понимаю, браузер получает задание перестроить элементы с определёнными id. В моём случае - id всего div, который отвечает за меню.
В этом полученном коде я вижу "новый" признак "свернуть" пункта А, а также новый пункт меню С, следующий за А.
Я не могу понять, как действует мой браузер. Есть несколько вариантов:
1) Удаление старого div с id="xxx" и вставка нового.
Этот пункт отметается сразу, иначе я не получал бы в качестве следующего пункта пункт Б (он бы тупо удалился перед тем, как появился бы А с новым признаком).
2) Вставка нового div с id="xxx" целиком и полностью.
Этот пункт также отметается, потому что я бы получал в качестве следующего пункта пункт С, т.к. он есть в этом новом div.
В итоге, я делаю вывод, что когда мой браузер получает задание обновить какой-то элемент, то он обновляет его не полностью, а "частями".
Ориентироваться по появлению пункта С нельзя, т.к. я не знаю, появится он или нет. Мне нужно именно дождаться полного раскрытия пункта меню А, а дальше уже анализировать результаты, какими бы они ни были.
Ставить паузу в секунду - не вариант, т.к. это "трата времени". К тому же возможен вариант, когда браузер будет тормозить на компе по каким-либо причинам. И тогда этой секунды может не хватить.
Даже моя функция устаканивания - плохой вариант, т.к., опять же, браузер может тормозить и в течении определённого времени число всех элементов на странице может оставаться неизменным.
Можно ли как-то проанализировать, что мы получили от сервера? Исходя из этой инфы уже можно было бы построить корректное ожидание.
Есть ли какие-то стандартные функции ожидания, позволяющие понять, что наш браузер закончил построение страницы, после того, как получил от сервера задание её перестроить?