Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужно связать selectы в нескольких divах 
:(
    Опции темы
Mastodont
Дата 2.10.2012, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



У меня сейчас есть такая страничка:
Три <select>, каждый из которых в своем <div> (примечание: кол-во select'ов растет по кнопке "Вперед", но пока пусть их будет три). Сейчас выбрано "автобус", "самолет" и "поезд". Мне нужно, чтобы при выборе в строке №1 самолета вместо автобуса стоящий справа select тоже менялся. А при выборе во 2й строке поезда в правом select'е появлялись опции для поезда.

Сейчас все три левых select'а добавляют новый select справа только в первой строчке (пока правые select'ы появляются друг за другом; хотя надо, чтобы следующий убивал предыдущий и занимал его место; но щас вопрос не в этом, потом разберусь). Это происходит потому, что мне не удается передать в функцию make_bus_option() или make_air_option() или make_train_option() id div'а, в котором расположен левый select, обработчик пункта option которого сработал.

Вот код страницы

Код

<script type='text/javascript'>

var div_id_count = '1';
var select_id_count = '1';

function make_bus_option()
{
    var bus_option_select = document.createElement('select');
    bus_option_select.innerHTML = '<select><option>Выберите номер автобуса...</option> <option>Автобус 1</option><option>Автобус 2</option><option>Автобус 3</option></select>';
    document.getElementById(new_div_id).appendChild(bus_option_select);
}

function make_air_option()
{
    var air_option_select = document.createElement('select');
    air_option_select.innerHTML = '<select><option>Выберите номер самолета...</option>
<option">Самолет 1</option><option>Самолет 2</option><option>Самолет 3</option></select>';
    document.getElementById(new_div_id).appendChild(air_option_select);
}

function make_train_option()
{
    var train_option_select = document.createElement('select');
    train_option_select.innerHTML = '<select><option>Выберите номер поезда...</option>
<option">Поезд 1</option><option>Поезд 2</option><option>Поезд 3</option></select>';
    document.getElementById(new_div_id).appendChild(train_option_select);    
}

function make_new_transport()
{
    var new_div = document.createElement('div');        
    new_div_id = new_div.id = 'div' + div_id_count;
    var new_select = document.createElement('select');
    new_select.id = 'transport_type' + select_id_count;
    
    new_select.innerHTML = '<select><option>Выберите вид транспорта...</option>
<option onclick="make_bus_option()">Автобус</option><option onclick="make_air_option()">Самолет</option>
<option onclick="make_train_option()">Поезд</option></select>';
    
    document.getElementById('form1').appendChild(new_div);
    document.getElementById(new_div.id).appendChild(new_select);
    
    div_id_count++;
    select_id_count++;
}
</script>

<form id='form1'>
    <input type='button' value='Вперед' onclick='make_new_transport();'>
</form>


Я пробовал писать так
Код

new_select.innerHTML = '<select><option>Выберите вид транспорта...</option>
<option onclick="make_bus_option(' + new_div_id + ')">Автобус</option>
<option onclick="make_air_option()">Самолет</option>
<option onclick="make_train_option()">Поезд</option></select>';

но в make_bus_option(new_div_id) все равно ничего не передается.

Кто знает, как решить вопрос этим или другим способом?

Это сообщение отредактировал(а) Aliance - 3.10.2012, 11:30
PM MAIL   Вверх
skyboy
Дата 3.10.2012, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



лучше не используй innerHTML.
вместо него — appendChild.
а то сейчас, к примеру, ты создаешь <select>, а потом внутрь него пихаешь еще <select> с <option>

Добавлено через 2 минуты и 42 секунды
события же цепляются через addEventListener для всех браузеров окромя IE(для него — attachEvent). 

PM MAIL   Вверх
Mastodont
Дата 3.10.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



Переписал так
Код

<script type='text/javascript'>

var div_id_count = '1';
var select_id_count = '1';

function make_bus_option()
{
    for (var doc = document, bus_select = doc.createElement('select'), j = 0; j < 4; j++)
    {
        var bus_option = doc.createElement('option');
        bus_option.appendChild (doc.createTextNode(j ? 'Автобус ' + j : 'Выберите номер автобуса...'));
        bus_select.options.add(bus_option);
    }
    doc.getElementById(new_div_id).appendChild(bus_select);
}

function make_air_option()
{
    for (var doc = document, air_select = doc.createElement('select'), j = 0; j < 4; j++)
    {
        var air_option = doc.createElement('option');
        air_option.appendChild(doc.createTextNode(j ? 'Самолет ' + j : 'Выберите номер самолета...'));
        air_select.options.add(air_option);
    }
    doc.getElementById(new_div_id).appendChild(air_select);
}

function make_train_option()
{
    for (var doc = document, train_select = doc.createElement ('select'), j = 0; j < 4; j++)
    {
        var train_option = doc.createElement('option');
        train_option.appendChild(doc.createTextNode(j ? 'Поезд ' + j : 'Выберите номер поезда...'));
        train_select.options.add(train_option);
    }
    doc.getElementById(new_div_id).appendChild(train_select);
}

function make_new_transport()
{
    var new_div = document.createElement('div');        
    new_div_id = new_div.id = 'div' + div_id_count;
    var new_select = document.createElement('select');
    new_select.id = 'transport_type' + select_id_count;    
    
    var transport_type_option = document.createElement('option');
    transport_type_option.appendChild(document.createTextNode('Выберите вид транспорта...'));
    new_select.options.add(transport_type_option);
    var transport_type_option = document.createElement('option');
    transport_type_option.id = 'bus';    
    transport_type_option.appendChild(document.createTextNode('Автобус'));
    new_select.options.add(transport_type_option);
    var transport_type_option = document.createElement('option');
    transport_type_option.id = 'air';
    transport_type_option.appendChild(document.createTextNode('Самолет'));
    new_select.options.add(transport_type_option);
    var transport_type_option = document.createElement('option');
    transport_type_option.id = 'train';
    transport_type_option.appendChild(document.createTextNode('Поезд'));
    new_select.options.add(transport_type_option);    
    
    document.getElementById('form1').appendChild(new_div);
    document.getElementById(new_div.id).appendChild(new_select);
    
    //только как повесить на <option>Автобус</option> обработчик onclick="make_bus_option()"?
    //это срабатывает сразу при создании <select>, даже без выбора "автобуса"
    //document.getElementById('bus').addEventListener('onclick', make_bus_option());
    
    /*
    new_select.innerHTML = '<select><option>Выберите вид транспорта...</option><option onclick="make_bus_option()">Автобус</option><option onclick="make_air_option()">Самолет</option><option onclick="make_train_option()">Поезд</option></select>';
    
    document.getElementById('form1').appendChild(new_div);
    document.getElementById(new_div.id).appendChild(new_select);
    */
    
    
    div_id_count++;
    select_id_count++;
}
</script>

<form id='form1'>
    <input type='button' value='Вперед' onclick='make_new_transport();'>
</form>


Цитата

события же цепляются через addEventListener

Опиши подробнее как. Попробовал то, что нарыл в инете - работает не совсем так, как хочу)
PM MAIL   Вверх
skyboy
Дата 3.10.2012, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Цитата(Mastodont @  3.10.2012,  20:52 Найти цитируемый пост)
Попробовал то, что нарыл в инете - работает не совсем так, как хочу) 

давай подробности.
пока что я не понимаю, в чем конкретно загвоздка.
PM MAIL   Вверх
Mastodont
Дата 3.10.2012, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



Цитата

пока что я не понимаю, в чем конкретно загвоздка. 

ой, строку document.getElementById('bus').addEventListener('onclick', make_bus_option()); раскомментить надо))

загвоздка в том, что сейчас при нажатии кнопки "Вперед" создается и <select> с типами транспорта, и <select> с опциями автобуса. А опции должны создаваться только при выборе автобуса в <select> с типами транспорта.

Так вот как для <option>Автобус</option> задать onclick="make_bus_option()"?
PM MAIL   Вверх
ksnk
Дата 3.10.2012, 22:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Цитата(Mastodont @  3.10.2012,  22:14 Найти цитируемый пост)
Так вот как для <option>Автобус</option> задать onclick="make_bus_option()"? 

Вот так
Код

<select onchange="make_bus_option(this)">
...
<option>Автобус</option>
...
</select>

Вообще, если открыть для себя jQuery, получится значительно меньше кода и существенно меньше проблем с отладкой логики и  кроссброузерности.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 3.10.2012, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



ksnk, погоди с jQuery.
Mastodont, во-первых, да, onchange вместо onclick.
во-вторых, не ведись пока на разговоры про jquery, лучше сначала без него разобраться, а то так и будет путаница.

PM MAIL   Вверх
Mastodont
Дата 3.10.2012, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



onChange в моем случае работает также, как и onClick. Как событие-то задать для пункта списка?

На разговоры о JQuery не ведусь)
PM MAIL   Вверх
skyboy
Дата 4.10.2012, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



например, так
Код

<select id="target">
<option value="1">first</option>
<option value="2">second</option>
<option value="3">third</option>
</select>​
<script type="text/javascript">
document.getElementById("target").addEventListener("change", function() {
    alert(this.value);
}, true);​
</script>

PM MAIL   Вверх
Mastodont
Дата 4.10.2012, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 347
Регистрация: 18.3.2007

Репутация: нет
Всего: 1



skyboy, спасибо, но ты не совсем то предлагаешь.

Мне надо, чтобы при выборе в первом <select> Автобуса появлялся второй <select> с опциями автобуса. При выборе самолета - опции самолета. При выборе поезда - опции поезда.

Для этого каждому из элементов <option> списка <select id='target'> надо назначить свое событие.

В html это бы выглядело так (из первого поста этой темы):

Код

new_select.innerHTML = '<select><option>Выберите вид транспорта...</option>
<option onchange="make_bus_option()">Автобус</option><option onchange="make_air_option()">Самолет</option>
<option onchange="make_train_option()">Поезд</option></select>';


И оно работало smile 

Но я так понял, хорошим тоном считается создавать такие вещи через DOM и свойства объектов? Так вот как мне это реализовать?
PM MAIL   Вверх
ksnk
Дата 4.10.2012, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Цитата(Mastodont @  4.10.2012,  12:22 Найти цитируемый пост)
И оно работало


Не в каждом броузере поддерживается метод onchange для элемента option. Это насчет кроссбраузерности. 

Насчет удобства - чем объясняется замена 1 строчки в первом случае на множество строк в последнем примере? 

Не существует понятия "модно" в программировании. Существует понятие "удобно". 
Понятие "Удобно" относится к программисту php, программисту Javascript и верстальщику. "Удобно" относится к действиям "писать код", "изменять код" и искать в нем ошибки. Всего 3x3 варианта решения, скорее всего - разных. Вероятно их больше.  smile 

Самый первый вариант (с учетом изменений skyboy), удобен программисту на стадии "пиши код", но неудобен верстальщику на всех стадиях. Верстальщик не обязан знать javascript и ковырять сторонние файлы со своими кусочками верстки.

Самый последний вариант еще более неудобен верстальщику, и сложнее для программиста на всех этапах (больше букв) ;) 

Вот  вариант, если селекты уникальны и присутствуют на страничке в одном экземпляре - скрывать и показывать их по мере определения предпочтений пользователя.

Еще вариант решения, который, imho, более удобен в работе - клонирование уже готовых элементов

Код


function clone_element(_id) {
   var new_element=document.getElementById(_id).cloneNode(true);
   new_element.removeAttr('id');
   return new_element;
}


function make_bus_option()
{
    document.getElementById(new_div_id).appendChild(clone_element('tpl_bus_select'));
}
...


Код

<div style="display:none;"> <!-- область для шаблонов -->

<select id='tpl_bus_select'><option>Выберите номер автобуса...</option> 
<option>Автобус 1</option><option>Автобус 2</option><option>Автобус 3</option>
</select>

</div>

Серверный программист всегда генерирует HTML листинг по шаблону и ему не нужно генерировать еще и Javascript. Javascript можно выкинуть в отдельный файл и экономить на трафике. Верстальщик всегда может добраться до всех своих элементов в одном файле-шаблоне.



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 4.10.2012, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 3
Всего: 260



Цитата(Mastodont @  4.10.2012,  11:22 Найти цитируемый пост)
skyboy, спасибо, но ты не совсем то предлагаешь.

то, что я предлагаю — увидеть, что в единственном обработчике onchange первого select'a ты в курсе — какой элемент выбрали. и можешь в этом единственном обработчике в зависимости от того, какой элемент выбрали, показывать один связанный select или другой
PM MAIL   Вверх
Aliance
Дата 5.10.2012, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



http://forum.vingrad.ru/forum/topic-64842.html
Поиск? Не, не слышал.
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.