Advertisement
Guest User

Untitled

a guest
Mar 31st, 2015
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * @author Evgeni Lezhenkin evgeni@lezhenkin.ru http://lezhenkin.ru
  3.  *
  4.  * В данном сценарии мы будем обрабатывать события выбора значений
  5.  * в списках тега select. Второе и третье поле списка являются зависимыми.
  6.  * При выборе значения в первом поле select должен отправляться AJAX-запрос,
  7.  * который вернет перечень значений для второго списка. Далее эти значения будут
  8.  * помещены во второй select, а сам список станет активным.
  9.  * После выбора значения во втором списке запускается тот же алгоритм, что описан
  10.  * выше.
  11.  *
  12.  * Все AJAX-запросы к серверу будут выполняться через скрипт query.php методом POST
  13.  *
  14.  * Если пользователь меняет значение в первом списке, все поля второго
  15.  * и третьего удаляются, и второй и третий списки становятся неакивными. Если
  16.  * Меняется значение второго списка, то удаляются все значения для третьего,
  17.  * и он становится неактивным.
  18.  *
  19.  * Данный сценарий будет работать во всех броузерах благодаря библеотеке jQuery
  20.  *
  21.  * Здесь не будет описываться синтаксис самого jQuery, синтаксис JavaScript. Также
  22.  * здесь не будет подробно описываться инструментарий
  23.  */
  24. // Используем немедленно вызываемую функцию
  25. (function () {
  26.     // Будем работать в соответствии с требованиями современного стандарта
  27.     // ECMAScript. Включим строгий режим.
  28.     "use strict";
  29.    
  30.     // Весь наш основной сценарий будет работать уже после загрузки документа
  31.     jQuery(function () {
  32.         // Пишем обработчик события для выбора значения в первом списке
  33.         // Нас интересует событие изменения значения поля
  34.         $( '#type' ).change(function () {
  35.             // При изменении значения первого списка мы должны удалить
  36.             // все имеющиеся значения во втором и третьем, а также
  37.             // сделать их неактивными
  38.             $( '#kind, #category' ).find( 'option:not(:first)' )    // Ищем все теги option, не являющиеся тегом по умолчанию
  39.                 .remove()   // Удаляем эти теги
  40.                 // Чтобы сделать поля неактивными, неправильно менять значение атрибута disabled
  41.                 // Теперь нам нужно изменять значение свойства disabled объектов полей списка,
  42.                 // так как мы работаем с ними через библиотеку jQuery
  43.                 .end()      // Возвращаемся к исходному объекту
  44.                 .prop( 'disabled',true );       // Делаем поля неактивными
  45.             // Сохраним выбранное значение списка в переменную
  46.             var type_id = $( this ).val();
  47.             // Если выбрано значение по умолчанию, ничего не делаем
  48.             if (type_id == 0) { return; }
  49.             // В ином случае нам необходимо отправить запрос на сервер
  50.             // AJAX-запрос к серверу мы выполним, используя метод jQuery ajax()
  51.             $.ajax({
  52.                 type: "POST",   // Тип запроса
  53.                 url: "query.php",   // Путь к сценарию, обработающему запрос
  54.                 dataType: "json",   // Тип данных, в которых сервер должен прислать ответ
  55.                 data: "query=getKinds&type_id=" + type_id,  // Строка POST-запроса
  56.                 error: function () {    // Обработчик, который будет запущен в случае неудачного запроса
  57.                     alert( "При выполнении запроса произошла ошибка :(" );   // Сообщение о неудачном запросе
  58.                 },
  59.                 success: function ( data ) { // Обработчик, который будет запущен после успешного запроса
  60.                     // В ответ на наш запрос сервер должен прислать массив значений
  61.                     // Мы его вставим в поле второго списка с помощью цикла for
  62.                     for ( var i = 0; i < data.length; i++ ) {
  63.                         // Каждое полученное значение вставим в список видов транспорта
  64.                         $( '#kind' ).append( '<option value="' + data[i].kind_id + '">' + data[i].kind + '</option>' );
  65.                     }
  66.                     // После того, как мы сформировали список, мы можем сделать его активным
  67.                     // обратившись к его свойству disabled
  68.                     $( '#kind' ).prop( 'disabled', false ); // Включаем поле
  69.                 }
  70.             });
  71.         });
  72.        
  73.         // Пишем обработчик события для выбора значения во втором списке
  74.         // Нас интересует событие изменения значения поля
  75.         $( '#kind' ).change(function () {
  76.             // При изменении значения второго списка мы должны удалить
  77.             // все имеющиеся значения в третьем, а также
  78.             // сделать его неактивными
  79.             $( '#category' ).find( 'option:not(:first)' )   // Ищем все теги option, не являющиеся тегом по умолчанию
  80.                 .remove()   // Удаляем эти теги
  81.                 // Чтобы сделать поле неактивным, неправильно менять значение атрибута disabled
  82.                 // Теперь нам нужно изменять значение свойства disabled объекта поля списка,
  83.                 // так как мы работаем с ним через библиотеку jQuery
  84.                 .end()      // Возвращаемся к исходному объекту
  85.                 .prop( 'disabled',true );       // Делаем поле неактивным
  86.             // Сохраним выбранное значение списка в переменную
  87.             var kind_id = $( this ).val();
  88.             // Сохраним выбранное значение типа транспорта в переменную
  89.             var type_id = $( '#type' ).val();
  90.             // Если выбрано значение по умолчанию, ничего не делаем
  91.             if (type_id === 0) { return; }
  92.             // В ином случае нам необходимо отправить запрос на сервер
  93.             // AJAX-запрос к серверу мы выполним, используя метод jQuery ajax()
  94.             $.ajax({
  95.                 type: "POST",   // Тип запроса
  96.                 url: "query.php",   // Путь к сценарию, обработающему запрос
  97.                 dataType: "json",   // Тип данных, в которых сервер должен прислать ответ
  98.                 data: "query=getCategories&type_id=" + type_id + "&kind_id=" + kind_id, // Строка POST-запроса
  99.                 error: function () {    // Обработчик, который будет запущен в случае неудачного запроса
  100.                     alert( "При выполнении запроса произошла ошибка :(" );   // Сообщение о неудачном запросе
  101.                 },
  102.                 success: function ( data ) { // Обработчик, который будет запущен после успешного запроса
  103.                     // В ответ на наш запрос сервер должен прислать массив значений
  104.                     // Мы его вставим в поле третьего списка с помощью цикла for
  105.                     for ( var i = 0; i < data.length; i++ ) {
  106.                         // Каждое полученное значение вставим в список категорий транспорта
  107.                         $( '#category' ).append( '<option value="' + data[i].category_id + '">' + data[i].category + '</option>' );
  108.                     }
  109.                     // После того, как мы сформировали список, мы можем сделать его активным
  110.                     // обратившись к его свойству disabled
  111.                     $( '#category' ).prop( 'disabled', false ); // Включаем поле
  112.                 }
  113.             });
  114.         });
  115.        
  116.         // Никакие обработчичик для поля третьего списка не нужны
  117.     }); // Функция ожидания загрузки документа jQuery
  118. })(); // Немедленно вызываемая функция
  119. /**
  120.  * Вы должны понимать, что данный код далек от идеала и является лишь
  121.  * примером решения конкретной задачи — динамического пополнения полей
  122.  * формы select. Здесь опущено очень много моментов, связанных с отладкой,
  123.  * безопасностью и многим другим. И вы должны понимать это очень хорошо.
  124.  * Данный пример просто показывает инструмент, с помощью которого решается
  125.  * озвученная задача.
  126.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement