работа с массивами
помогите разобраться с проблемой:
имеется создаваемый через смарти массив: {if isset($country.states) && $country.contains_states} countries[{$country.id_country|intval}] = new Array(); {foreach from=$country.states item='state' name='states'} countries[{$country.id_country|intval}].push({ldelim}'id' : '{$state.id_state}', 'name' : '{$state.name|escape:'htmlall':'UTF-8'}'{rdelim}); {/foreach} {/if} при работе с этим массивом в дальнейшем заполняется тег select: function myChangeStates() { var opt = '<option value="">-</option>'; var id_country = $('select#id_country option:selected').val(); id_country = parseInt(id_country); $('select#id_state').empty(); for(var state in countries[id_country]) { opt += '<option value="'+state['id']+'">'+state['name']+'</option>'; } $('select#id_state').append(opt); } и все вроде работает (т.е. на экране тэг заполняется как надо, значениями), только вот при попытке обратиться к элементам этого селекта начинаются "чудеса"(просто от недостатка знаний иначе назвать не могу)))): все значения созданного массива countries имеют значения "undefined" и обратиться к ним у меня не получается пробовал выводить тупо на экран: alert(opt);выводит примерно следующее: <option value="">-</option><option value="undefined">undefined</option> <option value="undefined">undefined</option> <option value="undefined">undefined</option> <option value="undefined">undefined</option>... задача стоит примерно такая: надо сделать выбранной одну из опций селекта, value которой известен, но т.к. она "undefined", то и соответственно попытки отыскать её терпят эпик феил( выручайте, может хоть нужное направление мысли зададите))) |
Цитата:
<select id='test'> <option value="">-</option> <option value="undefined">undefined</option> <option value="undefined">undefined</option> <option value="undefined">undefined</option> <option value="undefined">undefined</option>... </select> <script> var val; alert('val='+val); val=val||'undefined'; var o=document.getElementById('test'); for (var i=0; i<o.options.length; i++) { if (o.options[i].value==val) { o.selectedIndex=i; break; }; }; </script> |
А зачем подготовкой массива данных занимается шаблонизатор? И где по этому коду видно, что это передается в JS и под каким именем?
|
Действительно, корявый путь я выбрал для создания массива: проще подготовить массив на стороне php и передать его в js (в принципе так я и сделал уже)
теперь уже больше интересна теоретическая сторона вопроса: почему созданный таким образом массив при выводе в браузер чарез селект отображает действительные значения, а при попытке работать с этим селектом в JS все значения всех полей равны undefined для примера: <p>вот так отображается в браузере</p> <select id='test'> <option value="">-</option> <option value="1">один</option> <option value="2">два</option> <option value="3">три</option> <option value="4">четыре</option> </select> <p>а вот так отображается через ALERT</p> <input type="button" value="Проверить" onclick="test()"> <script> function test() { var a = '<option value="">-</option>'; a += '<option value="undefined">undefined</option>'; a += '<option value="undefined">undefined</option>'; a += '<option value="undefined">undefined</option>'; a += '<option value="undefined">undefined</option>'; alert(a); } </script> отвечая на вопрос "И где по этому коду видно, что это передается в JS и под каким именем?" под именем countries |
Функция test, это не попытка работать работать с этим селектом в JS, а чепуха полная.
Установка обработчика на динамически создаваемые списки должна производиться либо после их создания и добавления в документ, либо делегироваться ближайшему родителю присутствующему всегда на странице. А получение значения выбранной опции (в случае списка с одиночным выбором), это значение самого списка, искать для этого option:selected совсем не требуется. |
я конечно глуп, но не настолько!
часть кода в предыдущем своем посте я привел только как пример того, какие результаты выдает реальный код (нажимаем посмотреть - видим результат, на сам код не смотрим) В любом случае, спасибо за помощь, проблема уже решена) |
Часовой пояс GMT +3, время: 23:44. |