Клуб API Карт

Формирование списка из XML

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

Посреди HTML-документа для формирования выпадающего списка вставляю такой код:

<script type="text/javascript">

ml = new YMaps.YMapsML( 'http://wsus.spb.ru/xml/intertorg.xml' );
str = '<select>';

YMaps.Events.observe(ml, ml.Events.Load, function (ml) {
ml.get(0).forEach(function (item) {
str = str + '<option value="' + item.id + '">' + item.name + ' ' + item.description + '</option>';
});
// для проверки вставил alert(str); // на этом моменте строка сформирована, ЭТОТ АЛЕРТ СРАБАТЫВАЕТ после выполнения всего остального

// для проверки вставил document.write(str); // в документ почему-то отсюда ничего не пишется
});

// alert(str); // а тут моей строки уже нет, ЭТОТ АЛЕРТ СРАБАТЫВАЕТ РАНЬШЕ вышестоящего

str = str + '</select>';
document.write(str); // в документ пишется только <select></select>, и только потом к строке добавляются пункты <option> и срабатывает первый alert 

</script>

Не совсем разобрался в проблеме... Подскажите как сделать правильно, заранее благодарен за ответы )

проект живёт тут: http://wsus.spb.ru/, там внизу два списка... нижний сформирован руками, верхний с использованием javascript

5 комментариев
Тут несколько проблем, но главная в том, что new YMaps.YMapsML( 'http://wsus.spb.ru/xml/intertorg.xml' ) — это асинхронный вызов; когда произойдет событие загрузки, предсказать невозможно. Поэтому у вас сначала вызывается  document.write, а потом отрабатывает функция, которая формирует option'ы в селекте.
Попробуйте как-нибудь так:

YMaps.Events.observe(ml, ml.Events.Load, onMlLoad)
function onMlLoad(ml) {
    var str = ''; ml.get(0).forEach(function (item) { str += '' + item.name + ' ' + item.description + ''; } str += '';
   
    var $select = YMaps.jQuery(str);
    $select.appendTo(document);
}

А можно ли как-нибудь скажем дождаться процесса загрузки ?
Или использовать задержку выполнения document.write ?

Нельзя использовать document.write после загрузки документа. Это затирает документ.

Используйте DOM-методы, или, лучше, встроенный в Я.Карты jQuery.




Так заработало %)

Да, правильно. Для вящей уверенности, что все будет ок, заверните всё в YMaps.jQuery(function(){/* тут ваш код… */})