Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Struts и 2 selecta


Автор: sergush 7.2.2006, 01:57
Два взаимодействующих selectа. В одном что-то выбираешь, содержимое другого меняется. В книге(какой уже не помню) нашел такой пример:
Код

<html>
<script>
var products = new Array(3);
products[1] = new Array("Epson FX-1170","HP DeskJet 1125","Canon BJC 2100");
products[2] = new Array("Acer 1240UT","Acer 3300U","AGFA SnapScan E20","AGFA Arcus 1200");
products[3] = new Array("APC Back-UPS 500","APC Smart-UPS 1400","APC Symmetra 8kVA","BestPower Axxium 1500","BestPower Fortress III 1050E");

function updateProduct(){
var idx = document.frm.category.selectedIndex + 1;
document.frm.product.length = products[idx].length;
for(var i = 0; i < products[idx].length; i++){
    document.frm.product[i].text = products[idx][i];
}
}
</script>

<body>
<form name="frm">
    <table border=1>
        <tr>
            <td>Категория товара</td>
            <td>Товар</td>
        </tr>
        <tr>
            <td valign="top">
                <select name="category" size=4 onchange="updateProduct()">
                    <option selected>Принтер
                    <option>Сканер
                    <option>UPS
                </select>
            </td>
            <td>
                <script>
                    document.writeln("<select name='product' width='200'>")
                    for(var i = 0; i < products[1].length; i++){
                        document.writeln("<option>" + products[1][i]);
                    }
                    document.writeln("</select>");
                </script>
            </td>
        </tr>
    </table>
</form>
</body>

</html>


Во-первых: может у кого есть другой вариант. Этот в IE работает, а в Opera как-то криво "работает" (в других браузерах не пробовал).

Содержимое selectов берется из базы данных.
Теперь непосредственно к Java и struts: у кого-нибудь есть идеи как это реализовать с помощью тэгов struts?
Код

                        ?????????????????????????????
                            <html:select property="category" onchange="?????????????????????????????">
                                <html:options collection="categories" property="value" labelProperty="label" />
                            </html:select>
                        
                            <html:select property="product">
                              ?????????????????????????????
                            </html:select>
                         ?????????????????????????????

Добавлено @ 02:09
Можно оставить первый скрипт без изменений, а только заполнить массив данными. Тогда код будет такой. Но мне почему-то это кажется очень некрасивым.

Код

                           <html:select property="category" onchange="updateProduct()">
                                <html:options collection="categories" property="value" labelProperty="label" />
                            </html:select>

                            <html:select property="product">
                                <script>
                                    for(var i = 0; i < products[1].length; i++){
                                        document.writeln("<option>" + products[1][i]);
                                    }
                                </script>
                            </html:select>         

Автор: batigoal 7.2.2006, 09:08
Насколько я понимаю, Struts и Ява тут особо ни при чем, клиентскую логику сделать они не помогут.

А насчет кроссбраузерности - не нужно использовать document.writeln(). Я подобную задачу решал так: сервер генерит два JS-массива. А затем я по ним пробегаюсь в коде жаваскрипта, и заполняю select через его ID:
Код

document.getElementById('mylist').options[i] = 'element #'+i;

Это поддерживается всем браузерами.

Автор: sergush 7.2.2006, 15:49
"А насчет кроссбраузерности" поверим на слово. Struts тут точно ничем помочь не может? Может есть какой нибудь способ не писать напрямую JS-код, а обойтись тэгами struts, а уж они то пускай этот код сами генерируют?
Заполнение selecta через его ID тоже работает. Я так тоже пробовал. Но и в первом и втором случае в опере возникает небольшой "глюк". Когда количество элементов в selecte разное и надо менять length, то появляются какие-то лишние пустые строки. В IE же все нормально.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)