Как вывести Яндекс карту в jquery ui dialog. При разработке, а точнее доработке своего сервиса Конструктор Яндекс Карт, столкнулся с задачей, на первый взгляд весьма тривиальной. Надо было вывести Яндекс карту в форме диалогового окна jquery ui.
Хотя у меня уже был опыт подобного рода, я решил, что легко выполню эту задачу. Не тут то было. Карта совершенно не хотела рисоваться во вновь созданном и показанном боксе.
Дело еще осложнялось тем, что карту надо было выводить в iframe. Я хотел сделать что-то вроде "песочницы", для запуска кода.
Попробовал решить в лоб
var _frame = jQuery('<iframe></iframe>').attr("frameborder", "0"), _vbox = jQuery('<div></div>'), doc;
jQuery('body').append(_vbox);
_vbox.append(_frame).dialog();
_frame.width(500);
_frame.height(500);
var element = _frame.get(0);
if ( element.nodeName.toLowerCase() === "iframe" ) {
if (element.contentDocument) // Gecko
doc = element.contentDocument;
else if (element.contentWindow) // IE
doc = element.contentWindow.document;
}else
doc = element;
doc.open();
doc.write('<html><head><title>Конструктор Yandex карт</title></head><body>{ код вывода Яндекс Карты сгенерированный сервисом}</body></html>');
doc.close();
и вновь у это великолепного кода, всего один минус. Он не работал(
Через несколько часов, мой лучший друг Гугл, сообщил мне, следующее: jquery ui dialog не использует то же элемент, который подает в него при запуске плагина. Т.е. после установки диалога, мы пытаемся повлиять на его содержимое, которое таковым уже не является. Это кривая дорожка. Забегая вперед скажу, дорожка была верная, и гугл мне не товарищ
Некий пользователь, с умного форума сообщал, что стоит работать с событием open, диалога. Оно срабатывает в момент открытия диалога и в нем, уже можно работать с верным контекстом this.
Вот это верная дорожка, как продвижение сайтов от http://prodvijenie-web.ru/ верный путь в развитии Вашего бизнеса.
Все, что ниже _vbox.append(_frame).dialog(); нужно засунуть в вызов dialog
var _frame = jQuery('<iframe></iframe>').attr("frameborder", "0"), _vbox = jQuery('<div></div>'), doc;
jQuery('body').append(_vbox);
_vbox.dialog({
open:function(){
var div = jquery(this);
div.append(_frame);
_frame.width(500);
_frame.height(500);
var element = _frame.get(0);
if ( element.nodeName.toLowerCase() === "iframe" ) {
if (element.contentDocument) // Gecko
doc = element.contentDocument;
else if (element.contentWindow) // IE
doc = element.contentWindow.document;
}else
doc = element;
doc.open();
doc.write('<html><head><title>Конструктор Yandex карт</title></head><body>{ код вывода Яндекс Карты сгенерированный сервисом}</body></html>');
doc.close();
}
});
чудо-код вновь не работал.
Методом научного тыка (благо образование математическое), за комментировал строку
//doc.close();
все заработало. Если Вы не используете iframe, то Ваш код вероятно запустился уже давно. И вы даже не читаете эту статью. Ну, а если читаете, то значит - это вновь кому-нибудь нужно.


Комментарии
dialog.dialog("option", "title", "Как нас найти");
dialog.dialog("option", "width", 640);
dialog.dialog("option", "height", 520);
dialog.dialog("open");
$("#dialog-content").html('');
$('', {
src: 'map/list/',
id: 'mapFrame',
frameborder: 0,
scrolling: 'no',
width: '600px',
height: '450px'
}).appendTo('#dialog-content');
Все.
dialog.dialog("option", "title", "Как нас найти");
dialog.dialog("option", "width", 640);
dialog.dialog("option", "height", 520);
dialog.dialog("open");
$("#dialog-content").html('');
$(' < i f r a m e > ', {
src: 'map/list/',
id: 'mapFrame',
frameborder: 0,
scrolling: 'no',
width: '600px',
height: '450px'
}).appendTo('#dialog-content');
Все.