Подгрузка раскрывающегося списка в Chrome и Safari

Drakon

Новичок
Подгрузка раскрывающегося списка в Chrome и Safari

Сделал загрузку данных раскрывающегося списка при событии onClick.
В IE, FF, Opera всё отлично работает... Список раскрывается, грузится и потом появляются загруженные данные.
В Chrome появляется тока 1 строчка. Далее список нужно закрыть, открыть, и тока после этого появятся все строчки.
В Safari не появляются строчки вообще. Нужно также закрыть список, открыть и тока после этого всё появляется.
Какие есть варианты, чтобы обойти эту проблемы? Сейчас я сделал вот так (просто создаю узлы в DOM списка)... Если делать полностью через innerHTML, то получается та жа самая проблема.

Код:
<select name="brands" onclick="load_list(this);" id="list1">
<option value="0">Загрузка...</option>
</select>
Код:
function load_list (obj)
{
... AJAX-запрос с обработчиком list_set_data
}

function list_set_data (data)
{
...
var objSelect = document.getElementById ('list1');

objSelect.innerHTML = '<option value="0"> - Выберите компанию - </option>';

   for (i = 0; i < data.length; i++)
   {
        	option = document.createElement ('option');
		option.appendChild (document.createTextNode(datat[i].getAttribute ('text')));
		option.setAttribute ('value', data[i].getAttribute ('value'));
		objSelect.appendChild (option);
   }
}
 

dimagolov

Новичок
Drakon, так отлаживай. ставь alert() в начале на полученные данные, а потом смотри как добавляются узлы (если с данными все хорошо)
 

pilot911

Новичок
лучше пользуйся firefox с установленным firebug

и пиши console.debug(какая-то переменная);

сдается мне, что просто функция обратного вызова list_set_data (data) в load_list() вызывается криво

такое надо делать через jquery вот так:


PHP:
$(function() {
     $('#list1').click(function() {
         $.ajax({
             type: "GET",
             url: "get_xml.php", // URL который отдает XML
             dataType: "xml",
             success: function(xml) {
                 $(xml).each(function(){
                     var text = $(this).attr('text');
                     var val = $(this).attr('value');

                     $('<option></option>')
                         .attr('value', val)
                         .html(text)
                         .appendTo('#list1');
                 }); //close each(
             }
         }); //close $.ajax(
     }); //close click(
}); //close $(
 

dimagolov

Новичок
pilot911, ты дебил? автор же ясно сказал, "В IE, FF, Opera всё отлично работает", какой нафиг firebug?

с какой радости это "надо" делать через jquery?
 

Drakon

Новичок
Автор оригинала: dimagolov
Drakon, так отлаживай. ставь alert() в начале на полученные данные, а потом смотри как добавляются узлы (если с данными все хорошо)
Кое-что выяснил... Если в функции load_list в самом начале поставить alert, то он не срабатывает в Safari. А если кликнуть на уже открытый список, то alert срабатывает... Почему-то это происходит - пока не очень ясно... Видимо надо поиграться с параметрами и событями.
В Chrome пока-что не понял механизм... Потому что alert'ы во всех местах срабатывают.

Вот полный пример без всяких AJAX'ов:

Код:
<html>

<head>
<title>Chrome & Safari select testing</title>

<script type="text/javascript">

function load_list ()
{
	var obj = document.getElementById('list1');
	if ( ! obj)
	{
		alert ("Can't find list1!");
		return;
	}
	
	obj.innerHTML = '<option value="0"> - Select the company - </option>'
		+ '<option value="1">Company 1</option>'
		+ '<option value="2">Company 2</option>';
}

</script>

</head>

<body>

<select name="select1" onclick="load_list();" id="list1">
<option value="-1" selected="selected"> - Select the company - </option>
<option value="-2">Loading...</option>
</select>

</body>

</html>

Если onclick поменять на onmousedown работает отлично, но тока не в Opera. Пока вижу тока один выход: для opera обрабатывать onclick, для остальных - onmousedown. Но вариант с onmousedown работает как-то нечётко если несколько раз понажимать.
 

Adelf

Administrator
Команда форума
Ну не работает потому, что Хром например отображает раньше, чем твой скрипт успевает поменять селект(на втором нажатии все загруженное на местах).
Грузить селект во время нажимания - не самый лучший вариант. Избежать этого есть пути?
 

pilot911

Новичок
Автор оригинала: Adelf
Ну не работает потому, что Хром например отображает раньше, чем твой скрипт успевает поменять селект(на втором нажатии все загруженное на местах).
Грузить селект во время нажимания - не самый лучший вариант. Избежать этого есть пути?
возможно, то есть здесь <select name="select1" onclick="load_list();" id="list1"> нужно заменить onclick на onmousedown


димаголов, ты кю
 

FractalizeR

Новичок
Автор оригинала: dimagolov
pilot911, ты дебил? автор же ясно сказал, "В IE, FF, Opera всё отлично работает", какой нафиг firebug?
с какой радости это "надо" делать через jquery?
А чего орать-то сразу? :) jQuery, мне кажется, вполне подходящий вариант для таких ajax штучек. Смысл писать самому, если уже все написано и отлажено во всех популярных браузерах. Хотя, конечно, может быть, у автора вопроса есть свои специфические причины не пользоваться jQuery.
 
Сверху