Клуб API Карт

Событие по загрузке карты

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

Добрый день.

Помимо javascript'а яндекс.карт, у меня используется несколько js файлов для отображения, описания поведения и прочего. На каждой из страниц, подключаются разные наборы файлов, помимо основного map.js, где и идет инициализация карты.

Для доступа к объекту класса YMaps, сделал глобальную переменную, к которой пытаюсь обращаться в остальных подключаемых файлах. Однако, зачастую выдается сообщение что эта переменная undefined, что конечно не удивительно, но как этого избежать? Возможно есть какое-либо специальное событие по загрузке карты?

P.S. Естественно, все функции вызываются внутри YMaps.jQuery(function(){}); или $(document).ready(function(){});

И попутно вопрос. Правда здесь наверное уже я невнимательно читал документацию. Если не затруднит, прошу ответить, как задать margin для закрытого балуна, без его открытия.

8 комментариев
YMaps.jQuery(function(){})
Должна быть только одна (на загрузку данной страницы).

IMHO в подключаемых файлах должны быть только функции.
Возможно у вас происходит выполнение скрипта который вы загружаете. А это происходит до окончания загрузки всей страницы.

alert на onload и на место где ошибка возможно решит ваши проблемы.

Ну и конечно без описания конкретной ошибки и ссылки на нее можно еще много чего нагадать :)
В каждом отдельном файле все действия обернуты в YMaps.jQuery(function(){}). Но это событие наступает, как я понимаю, после загрузки DOM страницы — т.е. карта еще может не подгрузиться.
Таким образом, когда в одном файле еще не прошла инициализация карты. В другом уже обращаемся к объекту класса YMaps. Собственно в этот момент и появляется ошибка, скажем variable 'map' is undefined.
Я не знаю как ведут себя YMaps.jQuery(function(){}) когда ее вызывают через подгрузку файла. (стартует при загрузке файла или при загрузке документа откуда вызван файл)

Возможно по загрузке документа вы получаете выполнение всех этих функций подряд (или выполнение только последней из них). Поставьте в начале каждой по алерту и посмотрите порядок выполнения кода.

У карт есть куча полезных ивентов, которые , более того, можно расширять.

В одном случае вы можете подвеситься туда, куда вам надо в виде

$(function(){
 YMaps.load(function(){
   бла бла бла
}}

в другом подписаться напипример на TilesLoaded - карта совсем загружена.

но! сам по себе YMaps.jQuery - если вы не подключаете карту "отложеным спрособом"( как стандартным так и браузерным) должен быть доступен изначально
на YMaps.load() переменная объекта карты все еще undefined.
А как подвеситься к tilesLoaded?
Пишу так:

YMaps.Events.observe(YMap, YMap.Events.tilesLoaded, function () {


но, все равно, «YMap is undefined»
Вы навесили обработчики на domReady в разных файлах. Но никто не гарантирует, что они отработают в порядке загрузки файлов.

Сделайте один обработчик domReady и в нем вызывайте функции из загруженных файлов.

Можете асинхронно подгружать нужные скрипты с помощью метода jQuery - getScript().

YMaps.jQuery.getScript("url", callback);
Спасибо, но как я заметил выше, каждый раз набор этих файлов разный. Соответственно статическим js файлом этого сделать не получится, а динамически его генерировать мне кажется не лучшей идеей. Наверное тогда сделаю еще одно обращение к серверу, и оттуда json'ом буду вытаскивать имена нужных функций.

А если вас не затруднит, ответьте пожалуйста на второй вопрос, как задать границы балуна без его открытия? Метки подгружаются из YMapsML файла со своим оформлением, так что прописать в параметрах их конструктора не получится. Ловить событие открытия балуна и динамически менять margin?
В тексте html который вы отдаете пишете:

YMaps.jQuery(function(){

map = new YMap......
foo1();
foo2();
foo3();
....
})

А в файлах пишите:

foo1 = function()

{
alert(map.getCenter());
}


Функции из файлов в пямять будут загружаться во время загрузки страницы, а выполняться после инициализации карты.