За последние 24 часа нас посетили 62917 программистов и 1679 роботов. Сейчас ищут 982 программиста ...

Зависимый select

Тема в разделе "JavaScript и AJAX", создана пользователем kit, 16 сен 2013.

  1. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Всем привет!
    Т.к. в JS я не шарю (а в Ajax тем более) и нужен он бывает мне редко (но метко), то пришлось для своих нужд списать в интернете скрипт и адаптировать под себя, в котором два селекта (поля со списком). В зависимости от выбора в первом селекте, выводится определенный список во втором. В представленном случае это список стран (в первом селекте) и городов в них (во втором селекте). Всего три файла:
    index.php
    Код (Text):
    1.  
    2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    3. <html xmlns="http://www.w3.org/1999/xhtml">
    4.     <head>
    5.         <title>Связанные с помощью ajax списки</title>
    6.         <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
    7.         <script type="text/javascript" src="jquery.js"></script>
    8.     </head>
    9. <body>
    10. <script>
    11. $(document).ready(function () {
    12.     $('#country_id').change(function () {
    13.         var country_id = $(this).val();
    14.         if (country_id == '0') {
    15.             $('#region_id').html('<option>- выберите город -</option>');
    16.             $('#region_id').attr('disabled', true);
    17.             return(false);
    18.         }
    19.         $('#region_id').attr('disabled', true);
    20.         $('#region_id').html('<option>загрузка...</option>');
    21.        
    22.         var url = 'get_regions.php';
    23.        
    24.         $.get(
    25.             url,
    26.             "country_id=" + country_id,
    27.             function (result) {
    28.                 if (result.type == 'error') {
    29.                     alert('error');
    30.                     return(false);
    31.                 }
    32.                 else {
    33.                     var options = '';
    34.                     $(result.regions).each(function() {
    35.                         options += '<option value="' + $(this).attr('id') + '">' + $(this).attr('title') + '</option>';
    36.                     });
    37.                     $('#region_id').html(options);
    38.                     $('#region_id').attr('disabled', false);
    39.                 }
    40.             },
    41.             "json"
    42.         );
    43.     });
    44. });
    45. </script>
    46. <form action="#" method="get">
    47. Страна:
    48. <select name="country_id" id="country_id">
    49. <?
    50. include "../mass.php";
    51. foreach ($country as $key => $value)
    52. {
    53. //  if ($_GET[country_id]==$key) $selected="selected"; else $selected="";
    54.     echo "<option value=$key $selected>".iconv("Windows-1251", "UTF-8", $value)."</option>";
    55. }
    56. ?>
    57. </select>
    58. Город:
    59. <select name="region_id" id="region_id" disabled="disabled">
    60. <option value="0">- выберите город -</option>
    61. </select>
    62. </form>
    63. </body>
    64. </html>
    get_regions.php
    Код (Text):
    1. <?php
    2. $country_id = @intval($_GET['country_id']);
    3. include "../mass.php";
    4. foreach ($city[$country_id] as $key => $value)
    5. {
    6.     $regions[] = array('id'=>$key, 'title'=>iconv("Windows-1251", "UTF-8", $value));
    7. }
    8. $result = array('type'=>'success', 'regions'=>$regions);
    9. /** Упаковываем данные с помощью JSON */
    10. print json_encode($result);
    11. //print_r ($regions);
    12. ?>
    и файл с массивом данных
    mass.php
    Код (Text):
    1.  
    2. $country[1]="Россия";
    3. $country[2]="Абхазия";
    4. $country[3]="Австрия";
    5. $country[4]="Азербайджан";
    6. ...
    7. $city[1][1]="Москва";
    8. $city[1][2]="Санкт-Петербург";
    9. ...
    Все замечательно и стабильно работает, но есть еще одно требование которое необходимо реализовать. При загрузке страницы по ссылке вида inde.php?country_id=1&city_id=2 в первом селекте должно быть выбрано Россия, а во втором Санкт-Петербург. Как это реализовать не знаю. Выбор страны реализован, а вот как быть с выбором города? События change ведь в этом случае не происходит. Не знаю... Помогите кто может реализовать задачу!
    Заранее благодарен!
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Написать js функцию, которая при загрузке документа вызывает загрузку городов во второй список точно так, как это делает анонимная функции в обработчике change.
    У тебя сейчас так
    Код (Text):
    1. $('#country_id').change(function () {
    2.       var country_id = $(this).val();
    А сделай отдельной функцией, например
    Код (Text):
    1. function change(country_id){
    2. //и тут код по загрузке городов во второй список
    3. }
    4. $('#country_id').change(function () {
    5.       change($(this).val());
    6. }
    7. $(function() {//сработает по загрузке документа
    8.   change(2);//2 выводить через php или парсить адрес с помощью jQuery
    9. });
    Как-то так.
     
  3. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    YSandro спасибо тебе большое!
    Вот что у меня получилось (точнее не получилось)
    Код (Text):
    1. <script>
    2. function change(country_id)
    3. {
    4.     //и тут код по загрузке городов во второй список
    5.         if (country_id == '0') {
    6.             $('#region_id').html('<option>- выберите город -</option>');
    7.             $('#region_id').attr('disabled', true);
    8.             return(false);
    9.         }
    10.         $('#region_id').attr('disabled', true);
    11.         $('#region_id').html('<option>загрузка...</option>');
    12.        
    13.         var url = 'get_regions.php';
    14.        
    15.         $.get(
    16.             url,
    17.             "country_id=" + country_id,
    18.             function (result) {
    19.                 if (result.type == 'error') {
    20.                     alert('error');
    21.                     return(false);
    22.                 }
    23.                 else {
    24.                     var options = '';
    25.                     $(result.regions).each(function() {
    26.                         options += '<option value="' + $(this).attr('id') + '">' + $(this).attr('title') + '</option>';
    27.                     });
    28.                     $('#region_id').html(options);
    29.                     $('#region_id').attr('disabled', false);
    30.                 }
    31.             },
    32.             "json"
    33.         );
    34. };
    35.  
    36. $('#country_id').change(function () {
    37.       change($(this).val());
    38. }
    39. $(function() {//сработает по загрузке документа
    40.   change(2);//2 выводить через php или парсить адрес с помощью jQuery
    41. });
    42. </script>
    Список городов даже не активный (с надписью - выберите город -), то есть country_id == '0'
    Что сделано не так?
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Скобки не на месте.
    Код (Text):
    1. <script>
    2. function change(country_id){
    3. //и тут код по загрузке городов во второй список
    4.      if (country_id == '0') {
    5.             $('#region_id').html('<option>- выберите город -</option>');
    6.             $('#region_id').attr('disabled', true);
    7.             return(false);
    8.      }
    9.      $('#region_id').attr('disabled', true);
    10.      $('#region_id').html('<option>загрузка...</option>');
    11.  
    12.      var url = 'get_regions.php';
    13.  
    14.      $.get(
    15.             url,
    16.             "country_id=" + country_id,
    17.             function (result) {
    18.                  if (result.type == 'error') {
    19.                         alert('error');
    20.                         return(false);
    21.                  }
    22.                  else {
    23.                         var options = '';
    24.                         $(result.regions).each(function() {
    25.                              options += '<option value="' + $(this).attr('id') + '">' + $(this).attr('title') + '</option>';
    26.                         });
    27.                         $('#region_id').html(options);
    28.                         $('#region_id').attr('disabled', false);
    29.                  }
    30.             },
    31.             "json"
    32.      );
    33. };
    34.  
    35. $(function() {//сработает по загрузке документа
    36.     $('#country_id').change(function () {
    37.         change($(this).val());
    38.     });
    39.  
    40.     change(2);//2 выводить через php или парсить адрес с помощью jQuery
    41. });
    42. </script>
     
  5. kit

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

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Ура! Получилось!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Уффффффффффффф.... пришлось попотеть :)))
    Кому надо ловите код:
    Код (Text):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3.     <head>
    4.         <title>Связанные с помощью ajax списки</title>
    5.         <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
    6.         <script type="text/javascript" src="jquery.js"></script>
    7.     </head>
    8. <body>
    9. <?
    10. if (!$_GET['country_id'] || !$_GET['region_id'])
    11. {
    12.     $_GET['country_id']=0;
    13.     $_GET['region_id']=0;
    14. }
    15. echo"
    16. <script>
    17. function change(country_id,region_id){
    18.     if (country_id == '0') {
    19.          $('#region_id').html('<option>- выберите страну -</option>');
    20.          $('#region_id').attr('disabled', true);
    21.          return(false);
    22.     }
    23.     $('#region_id').attr('disabled', true);
    24.     $('#region_id').html('<option>загрузка...</option>');
    25.     $.get(
    26.         'get_regions.php?country_id='+country_id+'&region_id='+region_id,
    27.         function (result) {
    28.             if (result.type == 'error') {
    29.                   alert('error');
    30.                   return(false);
    31.             }
    32.             else {
    33.                   var options = '';
    34.                   $(result.regions).each(function() {
    35.                       options += '<option value=\"' + $(this).attr('id') + '\" ' + $(this).attr('sel') + '>' + $(this).attr('title') + '</option>';
    36.                   });
    37.                   $('#region_id').html(options);
    38.                   $('#region_id').attr('disabled', false);
    39.             }
    40.         },
    41.         \"json\"
    42.     );
    43. };
    44.  
    45. $(function()
    46. {
    47.    $('#country_id').change(function ()
    48.    {
    49.       change($('#country_id').val(),0);
    50.    });
    51.    change(".$_GET['country_id'].",".$_GET['region_id'].");//2 выводить через php или парсить адрес с помощью jQuery
    52. });
    53. </script>";
    54. ?>
    55. <form action="#" method="get">
    56. Страна:
    57. <select name="country_id" id="country_id">
    58. <?
    59. include "../cargo_mass.php";
    60. foreach ($country as $key => $value)
    61. {
    62.     if ($_GET['country_id']==$key) $selected="selected"; else $selected="";
    63.     echo "<option value=$key $selected>".iconv("Windows-1251", "UTF-8", $value)."</option>";
    64. }
    65. ?>
    66. </select>
    67. Город:
    68. <select name="region_id" id="region_id" disabled="disabled">
    69. </select>
    70. </form>
    71. </body>
    72. </html>
    Код (Text):
    1. <?php
    2. $country_id = @intval($_GET['country_id']);
    3. $region_id = @intval($_GET['region_id']);
    4. include "../cargo_mass.php";
    5. foreach ($city[$country_id] as $key => $value)
    6. {
    7.     if ($region_id==$key)  $sel="selected"; else $sel="";
    8.     $regions[] = array('id'=>$key, 'sel'=>$sel, 'title'=>iconv("Windows-1251", "UTF-8", $value));
    9. }
    10. $result = array('type'=>'success', 'regions'=>$regions);
    11. print json_encode($result);
    12. ?>
    Для меня это подвиг! Спасибо огромное YSandro за помощь!!!