Клуб API Карт

Динамическая загрузка

shasoft
20 апреля 2009, 00:54

На странице будет хочу разместить div для карты и рядом дерево каталога.

Так как пользователю может и не потребоваться карта, то по умолчанию я её не показываю. Она открывается только по нажатию кнопки.

Для эконопии хотелось бы и саму библиотеку javascript загружать динамически.


 

Я использую JQuery.getScript Попробовал загружать динамически свой скрипт, всё нормально работает.

Но при вызове URL=http://api-maps.yandex.ru/1.0/?key=<мой ключ>

во-первых в конец ссылки добавляется параметр AJAX вида &_=1240174122564

во-вторых сама загрузка не получается.


Поэтому вопрос: возможно ли ДИНАМИЧЕСКИ подгружать библиотеку Yandex map по AJAX?


Вроде нашел, в чем может быть дело.

При появлении в скриптах document.write — работа сайта с применением AJAX (AHAH) по умолчанию невозможна. Так как document.write можно использовать только до окончания потока вывода основной страницы. В противном случае — контент страницы просто напросто стирается.

 Изучив текст открываемой страницы обнаружил там document.write


20 комментариев
Подписаться на комментарии к посту
Воспользуйтесь возможностью карты: Загрузка по требованию.
Спасибо. Попробую так и сделать.
Спасибо за совет. Всё прекрасно работает. И даже сам загрузчик грузится динамически.
Обработчик перестал грузиться динамически. :( Так и не понял, в чем дело. Вроде api не менялся. Пришлось загружать его статически.
А можно ли указывать контекст, в котором выполнится функция инициализации?
В метод load нельзя передать контекст. А что Вы хотите сделать? Можете рассказать поподробнее?
Да, я глупость спросила. Внутри объекта пыталась сделать YMaps.load(this.init) и удивлялась, почему контекст windows. Но я уже разобралась, спасибо :-)
А возможно ли динамически загружать сам загрузчик?

При попытке сделать так:
            var script = document.createElement("script");
            script.src = src;
            script.type="text/javascript";
            document.getElementsByTagName("head")[0].appendChild(script);

приложение впадает в ступор (скрываются все элементы и остаётся только белый фон)
Нет. Именно об этом я и писал. Нельзя загружать динамически загружать загрузчик. По крайней мере нельзя было на тот момент. С тех пор вышло несколько новых версий. Но раз и у вас результат тот же, значит до сих пор такой возможности нет.
Интересует с чем связанна эта проблема?
Вы сообщение мое читали? ;) Там же написано
При появлении в скриптах document.write — работа сайта с применением AJAX (AHAH) по умолчанию невозможна. Так как document.write можно использовать только до окончания потока вывода основной страницы. В противном случае — контент страницы просто напросто стирается.
 
Не думаю, что проблема в этом. document.write я не использовал. А если смотреть код загрузчика, то он работает точно так же.

YMaps._Loader.loadScript = function (url) {
                    var script = document.createElement("script");
                    script.charset = "utf-8";
                    script.src = url;
                    script.type = "text/javascript";
Дело в том, что document.write используется в загрузчике Яндекса отсюда и невозможность динамической загрузки, так как в момент загрузки загрузчика поток вывода основной страницы уже давно закрыт.
Да действительно, спасибо за ответ.
Решил проблему следующим образом:

Вся проблема из-за одной строчки в загрузчике:
// Добавляем включение VML для IE
            document.write(
                ''
            );


Соответственно, необходимый для IE заголовок выносится в статическую страницу и перед загрузкой загрузчика переопределяеться document.write на что-нибудь безобидное вроде: document.write = function(text){};
А зачем его загружать динамически? Размер загрузчика 2 Кб.
Дело в том что Yandex карты не поддерживают https. Если страница https пытается загрузить не шифрованный контент браузер выдает страшное предупреждение, поэтому приходиться идти на разные ухишрения. А динамическая загрузка загрузчика позволяет избежать подобных проблем.
а без https карту использовать сейчас совсем никак? а потом гляди и появится работа с https ;)
Никак:(. Хочется чтобы хотя бы при начальной загрузке не выдавалось предупреждений безопасности. Если появиться - супер, https очень не хватает. А пока будем использовать данный способ.
Ссылка неправильная - 404.
Вот: http://api.yandex.ru/maps/jsapi/doc/dg/tasks/api-loading.xml

Ещё есть выход: при нажатии кнопки "показать карту" - загружать карту (и api) во фрейме.