За последние 24 часа нас посетили 21745 программистов и 1024 робота. Сейчас ищут 687 программистов ...

Связанные списки (динамические select) на jQuery

Тема в разделе "JavaScript и AJAX", создана пользователем Elkaz, 11 сен 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    какой ужас
     
  2. SchSvetlana

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

    С нами с:
    24 дек 2009
    Сообщения:
    7
    Симпатии:
    0
    Добрый день, кто-нибудь может подсказать, как сделать динамический селект такого вида:
    есть страны, регионы и города, изначально они заполняются из бд (это реализовано).
    при выборе страны меняются списки рагионов и городов, при последующем выборе региона меняется список городов. В аяксе не сильна к сожалению. Также рассматривается цена вопроса, потому что нужно очень срочно. Пример вот такой (страна-регион-город)

    http://www.interhome.ru/holiday-rentals ... earchError

    Очень жду ответов. Спасибо.
     
  3. haushka

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

    С нами с:
    21 сен 2010
    Сообщения:
    1
    Симпатии:
    0
    Ребят три дня бьюсь прошерстил весь инет перепробывал и jQuery и JSHttpRequest толи я дурак толи лыжи не едут и чуствую без помощи специалистов не поедут прошу Вас о помощи, прошу не глумится и отсылать на фрилэнс задача такая три таблицы в БД кафеды(kafedra) , дисциплины (distip), и таблица (tema)
    нужны три выпадающих списка динамических третий зависит от второго второй от первого, выбираем кафедру во втором все дисциплины по этой кафедре, выбираем дисциплину в третьем все темы по этой дисциплине.
    [sql]CREATE TABLE IF NOT EXISTS `kafedra` (
    `id_kafedra` int( 10 ) unsigned NOT NULL AUTO_INCREMENT ,
    `name` text NOT NULL ,
    `fullname` tinytext NOT NULL ,
    `hide` enum( 'show', 'hide' ) NOT NULL DEFAULT 'show',
    PRIMARY KEY ( `id_kafedra` ) ) ENGINE = INNODB DEFAULT CHARSET = cp1251 AUTO_INCREMENT =0;

    CREATE TABLE IF NOT EXISTS `distip` (
    `id_distip` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `name` text NOT NULL,
    `fullname` tinytext NOT NULL,
    `hide` enum('show','hide') NOT NULL DEFAULT 'show',
    `id_kafedra` int(10) unsigned NOT NULL DEFAULT '0',
    PRIMARY KEY (`id_distip`),
    KEY `id_kafedra` (`id_kafedra`)
    ) ENGINE=INNODB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=0 ;

    CREATE TABLE IF NOT EXISTS `tema` (
    `id_tema` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `name` text NOT NULL,
    `fullname` tinytext NOT NULL,
    `pos` text NOT NULL,
    `hide` enum('show','hide') NOT NULL DEFAULT 'show',
    `id_distip` int(10) unsigned NOT NULL DEFAULT '0',
    `id_kafedra` int(10) unsigned NOT NULL DEFAULT '0',
    PRIMARY KEY (`id_tema`),
    KEY `id_distip` (`id_distip`),
    KEY `id_kafedra` (`id_kafedra`)
    ) ENGINE=INNODB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=0 [/sql]

    index.php
    PHP:
    1. <head>
    2. <script type="text/javascript" src="script.js"></script>
    3.  
    4. </head>
    5. <body>
    6. <select name="kafedra" id="kafedra">
    7. <option value="0" selected>Выберите кафедру...</option>
    8. <?php
    9. require_once("../config.php");
    10.     $sql=mysql_query("SELECT * FROM kafedra");
    11.     $n=0;
    12.     $a=0;
    13.     while ($ctg = mysql_fetch_array($sql))
    14.     {   $id[n]=$ctg['id_kafedra'];
    15.                 $i[n]=$ctg['name'];
    16.                 $n=$n+1;
    17.         echo "<option value=".$id[n].">";echo $i[n];  echo "</option>";
    18.  
    19.     }
    20. ?>
    21. </select>
    22. <select name="distip" id="distip">
    23. <option value="0" selected>Выберите дисциплину...</option>
    24. <?php
    25.     $sql=mysql_query("SELECT * FROM kafedra");
    26.     $n=0;
    27.     $a=0;
    28.     while ($ctg = mysql_fetch_array($sql))
    29.     {   $id[n]=$ctg['id_kafedra'];
    30.                 $i[n]=$ctg['name'];
    31.                 $n=$n+1;
    32.     $sqla=mysql_query("SELECT id_distip,name FROM distip WHERE id_kafedra=".$ctg['id_kafedra']."");
    33.         while ($ctga = mysql_fetch_array($sqla))
    34.     {   $od[a]=$ctga['id_distip'];
    35.                 $o[a]=$ctga['name'];
    36.                 $a=$a+1;
    37.                echo "<option class=".$i[n]." value=".$od[a].">";echo $o[a];  echo "</option>";
    38.  
    39.     }
    40.     }
    41.    
    42. ?>
    43. </select>
    44.  
    45.  
    46. </body>
    47.  
    script.js
    [js]function dynamicSelect(id1, id2) {

    // Сперва необходимо проверить поддержку W3C DOM в браузере

    if (document.getElementById && document.getElementsByTagName) {

    // Определение переменных, ссылающихся на списки

    var sel1 = document.getElementById(id1);
    var sel2 = document.getElementById(id2);

    // Клонирование динамического списка

    var clone = sel2.cloneNode(true);

    // Определение переменных для клонированных элементов списка

    var clonedOptions = clone.getElementsByTagName("option");

    // Вызов функции собирающей вызываемый список

    refreshDynamicSelectOptions(sel1, sel2, clonedOptions);

    // При изменении выбранного элемента в первом списке: // вызов функции пересобирающей вызываемый список

    sel1.onchange = function() {
    refreshDynamicSelectOptions(sel1, sel2, clonedOptions);
    }
    }
    }

    // Функция для сборки динамического списка

    function refreshDynamicSelectOptions(sel1, sel2, clonedOptions) {

    // Удаление всех элементов динамического списка

    while (sel2.options.length) {
    sel2.remove(0);
    }
    var pattern1 = /( |^)(select)( |$)/;
    var pattern2 = new RegExp("( |^)(" + sel1.options[sel1.selectedIndex].value + ")( |$)");

    // Перебор клонированных элементов списка

    for (var i = 0; i < clonedOptions.length; i++) {

    // Если название класса клонированного option эквивалентно "select" // либо эквивалентно значению option первого списка

    if (clonedOptions.className.match(pattern1) ||
    clonedOptions.className.match(pattern2)) {

    // его нужно клонировать в динамически создаваемый список

    sel2.appendChild(clonedOptions.cloneNode(true));
    }
    }
    }
    window.onload = function() {
    dynamicSelect("kafedra", "distip");
    }[/js]

    P.S. на втором списки застрял помогите нет не чего
     
  4. vaskin

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

    С нами с:
    25 дек 2011
    Сообщения:
    12
    Симпатии:
    0
    как в этом случае поставить не одно конкретное значение myChoice == 3,а от от 0 до 4(любое)

    $('#form_match1').change(function(){

    var myChoice2 = $('#form_match1 :selected').val();
    if(myChoice2 == 3)

    {
    $('#form_match3').attr('disabled','disabled');
    }

    else{
    $('#form_match3').attr('disabled',false);
    }
     
  5. shra

    shra Новичок

    С нами с:
    13 дек 2016
    Сообщения:
    4
    Симпатии:
    1
    Такую мелочь, как показано в примере, аджаксами таскать - как то стыдно даже :)
    Ajax оправдан, если большие списки надо загружать. К примеру списки городов по выбранной стране. Сразу то всю базу клиенту не очень хорошо вываливать. Но если посмотреть внимательно как делают на качественных сайтах, то грузят опять же не список, а только хелпер (10-15 строк) соответствующих началу ввода пользователя.
    Связанные селекты, когда объем данных не велик, лучше организовать полностью на стороне клиента. Для универсально случая подойдет вот этот скрипт. Он работает с любой вложенностью списков. Там же есть отсылка на более простой пример с двумя связанными списками.
     
    artoodetoo нравится это.
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
  7. shra

    shra Новичок

    С нами с:
    13 дек 2016
    Сообщения:
    4
    Симпатии:
    1
    Да нее, не похоже
     
  8. Slavka

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

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    кажется это называется реклама своего блога =)
     
  9. shra

    shra Новичок

    С нами с:
    13 дек 2016
    Сообщения:
    4
    Симпатии:
    1
    Кажется, это называется бесплодные поиски невидимого врага народа. :)
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    некропостинг. :)
    а вот подход нравится — если общее количество записей не очень большое, почему бы не выдавать их сразу на клиента! можно еще и через CDN раздавать в пожатом виде, вообще красота будет.
     
  11. shra

    shra Новичок

    С нами с:
    13 дек 2016
    Сообщения:
    4
    Симпатии:
    1
    Да, особенно когда хелпер-запросы через ajax гоняются на тяжелых CMS - сервер грузит безбожно.
     
  12. rishard

    rishard Новичок

    С нами с:
    20 сен 2016
    Сообщения:
    228
    Симпатии:
    27
    имхо незаменимая весчь для работы с динамическими селектами - крохотный jquery.chained.min.js, кто незнаком, очень рекомендую попробовать. Ссылку на гитхаб не даю, сами найдете, а то мало ли кто чего подумает:

    ;)
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ну на гитхаб-то можно дать ссылку смело
     
  14. rishard

    rishard Новичок

    С нами с:
    20 сен 2016
    Сообщения:
    228
    Симпатии:
    27
    реально крутая штука: https://github.com/tuupola/jquery_chained
    и все на редкость элегантно и просто:

     
  15. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    не совсем понимаю зачем такое надо? там 15 строк на JQ сделать и вот связанные селекты...
    или тут что то другое?
     
  16. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    @Elkaz а если 3 селекта, и 3-й зависит от второго? Т.е. выбираем значение 1 селекта, подгружается значение 2-го, и в зависимости от значения selected 2-го, подгружаются данные в 3-й селект. Как реализовать?