За последние 24 часа нас посетили 30889 программистов и 1445 роботов. Сейчас ищут 823 программиста ...

Зависимость между содержимым двух <SELECT>

Тема в разделе "JavaScript и AJAX", создана пользователем Freakmeister, 22 ноя 2010.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    В форме есть два <SELECT> - день и месяц. Соответссна, в каждом месяце разное кол-во дней и мне надо сделать, чтобы при изменении в форме SELECT месяца, менялось содержимое SELECT с днями. Как это запилить?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    А аналоги есть? jquery у меня вешает ajax на сайте из-за кривого движка. Под этот движок пока пишу на коленке, так что тупо перезагрузка страницы - тоже сгодится.
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    как так "вешает аякс"?
     
  5. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Хз, при подключении jquery аякс перестаёт аяксить. =\ Разбираться с этим лень есичесна, т.к. всё-равно сейчас пишу портал с нуля.
     
  6. Mat

    Mat Активный пользователь

    С нами с:
    12 дек 2006
    Сообщения:
    391
    Симпатии:
    0
    Зачем тебе Ajax или JQ для этого? Я бы смотрел в сторону Date();
    Грубо говоря при клике на месяц расчитываешь кол-во дней, потом заполняешь SELECT этими днями, к примеру через innerHTML... ну как то так. И будет работать быстрее чем с Ajax, теоритически =)
     
  7. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Если аякс перестает аяксить, значит с вероятностью 98% у тебя возникает ошибка js, еще один процент на конфликт Jquery и предыдущей библиотеки которую ты используешь для аякса и еще один на чудо господне.
    Есичесна писать портал (!) с нуля не зная как делать динамический селект это круто.

    И да, для конкретно этой задачи тебе аякс не нужен.
    Примерно так:
    HTML:
    1. <select id='month' onchange='selectMonth(this.value)'> (options) </select>
    2. <select id='days' > (options) </select>
    [js]function selectMonth(month){
    dt = new Date();
    year=("текущий год: "+dt.getFullYear());
    var dayCount = new Date(year, month + 1, 0).getDate();

    sel = document.getElementById('days');
    sel.options.length = 0;
    for (i=; i<=dayCount; i++){
    sel.options = new Option("i", "i");
    }
    }[/js]
     
  8. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Короче накатал вот так... Стал тестить, оказалось не работает в IE. Где косяк? =\

    [js]<script type='text/javascript'>

    function isLeapYear(year) { // узнаём високосный ли год
    if (year % 4 == 0) return true
    return false
    }

    function getDays(month, year) { //узнаём сколько дней в месяце
    var ar = new Array(12)
    ar[1] = 31 // Январь
    ar[2] = (isLeapYear(year)) ? 29 : 28 // Февраль
    ar[3] = 31 // Март
    ar[4] = 30 // Апрель
    ar[5] = 31 // Май
    ar[6] = 30 // Июнь
    ar[7] = 31 // Июль
    ar[8] = 31 // Август
    ar[9] = 30 // Сентябрь
    ar[10] = 31 // Октябрь
    ar[11] = 30 // Ноябрь
    ar[12] = 31 // Декабрь
    return ar[month]
    }

    function gethtml(numb, selected) { //получаем вёрстку инпута
    var b;
    var i;
    var r;
    var s;
    for (i=1; i<=numb; i++){
    r=''+i
    if (r.length<2) { //добавляем 0 вначало, если число однозначное
    r='0'+r;
    }
    s=''
    if (i==selected) { //выставляем день, который был выставлен вначале
    s=' selected'
    }
    b = b+\"<option value='\"+r+\"'\"+s+\">\"+r+\"</option>\"
    }
    return b
    }

    function countday() { //главная функция, которая запускает все остальные
    var day = document.getElementById('day');
    var s=day.value;
    var month = document.getElementById('month');
    var year = document.getElementById('year');
    var a = getDays(month.value, year.value);
    day.innerHTML = '';
    day.innerHTML = gethtml(a, s);
    }
    </script>[/js]

    HTML:
    1. <select name='month' id='month' onChange='countday()'>
    2. <option value='1'>Январь</option>
    3. <option value='2'>Февраль</option>
    4. <option value='3'>Март</option>
    5. <option value='4'>Апрель</option>
    6. <option value='5'>Май</option>
    7. <option value='6'>Июнь</option>
    8. <option value='7'>Июль</option>
    9. <option value='8'>Август</option>
    10. <option value='9'>Сентябрь</option>
    11. <option value='10'>Октябрь</option>
    12. <option value='11'>Ноябрь</option>
    13. <option value='12'>Декабрь</option>
     
  9. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Перебрал все функции выше и пришёл к выводу, что они все исправны, а innerHTML вообще не работает в IE на селектах. Я прав?
    Если начальную функцию countday() для простоты переписать двумя строчками:
    [js]var day = document.getElementById('day');
    day.innerHTML = '<option>test</option>';[/js]
    то в опере и фаерфоксе получится список из одного элемента - test, а в IE выходит просто пустой список.