В API Яндекс.Карт есть метод ready
, который выполняет указанную функцию после полной загрузки всех требуемых модулей. Однако он стабильно работает только когда карты подключаются на страницу в теге head
или по крайней мере до события DOMContentLoaded
. Если карту попытаться загрузить гораздо позже, то метод может и не выполниться (обсуждение этого дефекта в клубе и ещё другое обсуждение
этого же вопроса). Гарантировано получить уведомление о готовности API для работы можно другим способом.
У загрузчика карт есть недокументированный параметр
onload
, в котором можно указать имя функции. Эта функция как раз будет вызвана, когда будут загружены все требуемые модули карты.
function loadYandexMaps(callback) {
var callbackName = "_myapp_map_init",
loaderUrl = "http://api-maps.yandex.ru/2.0/?" +
"load=package.standard&" +
"lang=ru-RU&" +
"onload=" + encodeURIComponent(callbackName);
if (!window['ymaps']) {
window[callbackName] = function () {
callback();
window[callbackName] = null;
};
yepnope.injectJs(loaderUrl);
} else {
callback();
}
}
Загрузчик карт добавляется на страницу с помощью yepnope.js только тогда, когда он реально потребуется на странице.
Функции, которая добавляется в параметры загрузчика, должна быть доступна глобально. Т.е. использовать что-то вроде App.Maps.init
уже не получится. С другой стороны, название этой функции не должно меняться, чтобы запросы могли быть закешированы браузером. Поэтому к выбору этого названия стоит подойти с особой тщательностью.
Коментарии к заметке
Параметр onload официально включили в API и документировали . Так же, судя по документации, можно указывать и функции из пространства имён.