Клуб API Карт

ymaps.ready и сторонние сервисы [решено, ymaps.ready => ?onload]

Пост в архиве.

Всем привет.

 

Как вы знаете, сегодня лежит (на момент написания поста все еще лежит, да) http://yandexadexchange.net/. Что-то там с него пытается получить Яндекс.RTB. Лежит все это так, что запрос на сервис отваливается сам через примерно минуту по таймауту. Проблема в чем - ymaps.ready не срабатывает до того, как этот долгий запрос не закончится. Насколько я понимаю, Яндекс.Карты вешают обработчик события на load и успешно себе ожидают, когда же он закончится. Что мне кажется не очень правильным.

Кусочек из кода на тему :)

// проверяем довольно просто, кому нужны изыски пусть подключают jQuery

Версия API - 2.0-stable

15 комментариев
Всеволод Шмыров
28 января 2016, 00:00
Добрый день. Могли бы вы скинуть страницу с ошибкой?
Игорь Калашников
28 января 2016, 00:00

Здравствуйте

http://www.avito.ru/moskva/kvartiry - сверху "поиск объявлений на карте"

Игорь Калашников
28 января 2016, 00:00

что-то починилось и все заработало :{

rtb что-то у себя подкрутили?

Угу, починили.

Игорь Калашников
28 января 2016, 00:00

спасибо большое :)

Игорь Калашников
28 января 2016, 00:00

мы перешли у себя на параметр onload

Игорь Калашников
28 января 2016, 00:00

тем не менее готовы вернуться на православный ymaps.ready когда он будет поправлен :)

Если у вас очень долго генерируется dom, то использование onload вполне себе православное

Но у onload нет обработки ошибки инициализации, как у ymaps.ready, ну и появляется лишняя функция в глобальной области видимости. ymaps.ready аккуратнее в этом плане

Для инициализации карты обяазательно нужно, чтобы был готов дом-элемент для карты. Мы в апи не можем отследить, когда будет готов конкретный элемент, поэтому единственный гарантированный способ - ждать, когда будет готов весь dom целиком.

Если загрузка dom сложная поэтапная, то следить за готовностью контейнера карты должен вебмастер и запускать api через onload.

Мы готовы пересмотреть эти схемы, если вы предложите правильный вариант инициализации апи при долгой инициализации dom.

В ИЕ нельзя работать с элементом пока не закроются его родители. Те реди надо ждать практически всегда.

Лечиться решением проблемы долгой инициализацией dom. Лечиться легко, например через async скрипты - а больше что там тормозить то может?

Игорь Калашников
28 января 2016, 00:00

Как вы успели заметить в оригинальном посте, Яндекс.РТБ что-то пытался загрузить с недееспособного хоста и откладывал этот самый onload на ~минуту.

Проблема - если АПИ был подключен после ready, но до load, он ждет load. Так как в этот момент нет "правильного" способа определить готовность. В том числе onload не сработает пока все ифреймы (с рекламой) не доделаются.

При условии, что "нажать" на кнопку можно только после навешивания события, которое будет по ready - тут "лучше" загружать через onload.

Хотя нет - у нас под кнопкой уже живая карта. Значит апи лучше загружать совсем сразу.

 

Игорь Калашников
28 января 2016, 00:00

он же может быть не востребован, зачем его зря грузить?

Функцию, кстати, можно генерировать на лету. Как для jsonp колбэков. В том числе функция может быть куда-то вложена (как и экспортируемый символ)