По событию onchange отправить данные на сервер

 
0
 
JavaScript
ava
Marlik | 29.09.2013, 21:24
Доброго времени суток. Есть форма регистрации, выводится с помощью шаблонов скриптом на Perl. Отправка данных осуществляется обычным GET запросом. Есть такая задача вставить туда пару полей, а именно поле для вывода страны проживания, и поле в которое потом нужно из базы подгрузить города. Я так понимаю нужно по событию OnChange(); передать параметр id страны в javascript, оттуда сделать запрос на сервер и получив ответ разместить его во втором поле города.


<select name="country" id="country" onchange="city_required(this, #city)">
        <option value=1  selected='selected'>Россия</option>
        <option value=19>Австралия</option>
        <option value=20>Австрия</option>
        <option value=5>Азербайджан</option>
          ...
</select>



  <select name="city" id="city">
 <option value="">   </option>
</select>


Вопрос, правильно-ли делаю? Есть ли готовые образцы реализации? В javascript не силен, буду признателен за любую помощь. Спасибо.
Comments (20)
ava
akizelokro | 30.09.2013, 22:42 #
ajax-запросы посмотри
И готовые образцы где-то должны быть
ava
Marlik | 30.09.2013, 22:57 #
Да я так в принципе и думал. В ajax и javascript не бум-бум... Кто-бы поделился реализацией... спасибо.
ava
RBW | 01.10.2013, 07:58 #
1. Подключаешь jQuery

2. HTML:

<select name="country" id="country">
        <option value=0>Выберите страну</option>
        <option value=1>Россия</option>
        <option value=19>Австралия</option>
        <option value=20>Австрия</option>
        <option value=5>Азербайджан</option>
</select>

 <select name="city" id="city">
</select>

3. JS:

$('#country').change(function(){
    // Сохраняем выбранную страну
    var country = $(this).val()   
    
    // Отправляем запрос
    var request = $.ajax({
      // Скрипт обработчик, должен вернуть по страние список городов в JSON  
      url: "script.php",
      // Тип запроса
      type: "GET",
      // Параметры запроса
      data: { country : country }
    });
    
    // Код, выполняемый после ответа от сервера
    request.done(function( msg ) {
      // Разбор JSON ответа от сервера
      var response   = JSON.parse(msg)
      // Сохранение элемента - списка выбора города
      var cityEl     = $('#city')
      // Очистка списка от текущих значений
      cityEl.empty()
      
      // Добавление городов
      $.each(response, function(){
         cityEl.append('<option>' + $(this) + '</option>')              
      })
    });

})


Вот тут http://jsfiddle.net/m9Ut5/ полу-живой пример smile Нужно подставить адекватный скрипт, который отдает города
ava
Marlik | 01.10.2013, 13:10 #
Вот спасибо! Я в принципе нашел какой-то левый скрипт, из него значения value не передаются, только имя селекта.


$("#state").relatedSelects({
        onChangeLoad: './cgi-bin/city.cgi',
        loadingMessage: 'Пожалуйста подождите',
        selects: ['stateID', 'countyID','townID'],
        disableIfEmpty:true,
        onEmptyResult: function(){
            // 'this' is a reference to the changed select box
            alert('Нет возможности найти ' + $(this).find('option:selected').text() + '!');
        }
    });




Короче, скрипт получает только stateID вместо кода города. Зато работает... ))) А твой вариант я так и не смог протестировать... Может какие-то библиотеки в заголовок надо подключить? Но все равно спасибо.
ava
Marlik | 02.10.2013, 10:21 #
Не, не работает. ))) В общих чертах, либо cgi-скрипт мой не отгружает, или jquery косячит. Как проверить? Вот до этой строки мой скрипт работает 100%.


print $cgi->header(-type => "application/json", -charset => "utf-8");     # Устанавливаю заголовок
print $hash_ref;                                                                                               #  Возвращаю данные закодированные в json


ava
Marlik | 02.10.2013, 14:57 #
Может alert где воткнуть? Что-бы проверить? А jquery какую версию подключить???
ava
Marlik | 03.10.2013, 07:42 #
Фуууу... кажись вернулся JSON в jquery... не выводит правда но уже легче.... У меня кривая кодировка в базе и соответственно отдаются вопросики вместо данных... может поэтому парсер ругается?
ava
Marlik | 03.10.2013, 08:48 #
Кажется нашел в чем косяк. JSON возвращает id области и имя области.

Вот так я получил объект:


var response    =JSON.stringify(msg)
response        =JSON.parse(response)


Теперь бы выдернуть из него данные и вывести их.

Люди, кто соображает выручайте! )))
ava
Marlik | 03.10.2013, 13:30 #
Хрень какая-то! Вот так пробую получаю вывод  во второй селект:


var response    =JSON.stringify(msg)
response        =JSON.parse(response)



[object : Object]
[object : Object]
[object : Object]
[object : Object]


А вот так:


var response        =JSON.parse(response)


Ничего не получаю во втором селекте. Народ, подскажите куда копать-то? Как будто все вымерли.... )))
ava
kin | 03.10.2013, 13:35 #
Привет!
Без обид, но такое ощущение, что Вы пытаетесь копать грядки для посадки огурцов карьерным экскаватором... Может просто ограничится обычным xmlhttprequest?. Если правильно понял задачу, то в событии  onchange Вы формируете запрос, отправляете серверу, который возвращает ответ, который разбираете и заполняете поле "город".
Нужно ли ради 30 - 50 строк кода цеплять библиотеку весом более 200К?

ava
Marlik | 03.10.2013, 14:22 #
За ссылочку спасибо. Криз какой-то по ключевым словам - "как распарсить json" А что, разве нужно писать 50 строк кода чтобы распарсить json? Мне осталось-то до победного конца чуть-чуть.... )))) В вашем куске кода, я нифига не понял... ))) Мы и друг друга не поняли наверное... ))) У гугля наверное истерика уже, когда я набираю... Мне бы пример нормальный, что-бы понятно откеда плясать.... Но все-равно спасибо.
ava
kin | 03.10.2013, 15:49 #
Цитата (Marlik @  3.10.2013,  14:22 findReferencedText)
 В вашем куске кода, я нифига не понял... 

К сожалению, я не знаю в какой форме у Вас приходит ответ от сервера..., в любом случае - это строка, а далее - куча вариантов, например:  получить массив с названием городов при помощи JSON.parse, или функции split("разделитель")  объекта String , или резать строку, каким-либо другим способом...
После того, как получили список городов, для каждого города, создаем объект OPTION,

var oOption = document.createElement("OPTION");

устанавливаются его свойства:

oOption.innerText = "Название города";
oOption.value = "Код города, или еще что-то";

и добавляем его в коллекцию

oSelect.options.add(oOption);

и соответственно, это все крутится в цикле.
Как пример:

function Func1(arg) 
{
// arg  - строка - ответ сервера
    var _templ = document.getElementById("id selectа"); //select с городами
    var _source = arg.split(";") //массив элементов полученный из arg
    
    _templ.innerHTML = "" //не самый хороший способ очистки коллекции options  :)
    var e = null;
    for (var _i in _source) 
   {
         e = document.createElement("option");
         e.value = _source[_i];
         e.text = _source[_i];
         document.getElementById("select-source").options.add(e);
    }
}

ava
Marlik | 03.10.2013, 16:13 #
Данные приходят в json формате. Вижу в отладчике. Образец:


{ 34: "?????? ?????", ... }


Вопросики, я так понимаю кривая кодировка, и наверное не влияет на вывод(я так думаю).

А вот во втором селекте, на странице вылазиет такая хрень:

[object:Object]

И что это такое я не врублюсь. Тем более первый раз в жизни мне пришлось столкнутся с javascript-ами... Куда рыть я еще не понял что читать тоже.... 
ava
kin | 03.10.2013, 16:34 #
Цитата (Marlik @  3.10.2013,  16:13 findReferencedText)
Данные приходят в json формате. Вижу в отладчике. Образец:

{ 34: "?????? ?????", ... }
Свой код

var response    =JSON.stringify(msg)
response        =JSON.parse(response)

замените на

var response =JSON.parse(msg)

После этого в отладчике посмотрите содержимое объекта  response 
Скорее всего это будет асоциативный массив вида [ключ:значение].  В данном примере 34 это ключ, а ????? - значение, а все вместе  это объект, браузер это и показывает.


ava
Marlik | 03.10.2013, 16:49 #
Цитата (kin @ 3.10.2013,  16:34)
Цитата (Marlik @  3.10.2013,  16:13 \"findReferencedText\")
Данные приходят в json формате. Вижу в отладчике. Образец:


{ 34: "?????? ?????", ... }
Свой код



var response    =JSON.stringify(msg)

response        =JSON.parse(response)



замените на



var response =JSON.parse(msg)



После этого в отладчике посмотрите содержимое объекта  response 

Скорее всего это будет асоциативный массив вида [ключ:значение].  В данном примере 34 это ключ, а ????? - значение, а все вместе  это объект, браузер это и показывает.

Ну так он что так, что так - ассоциативный массив. Только без stringify во второй селект ничего не попадает... и дальше попробовать ваш код воткнуть? Я уже нагуглился так что тошно... и допер что это обьект, только проблема в том что из обьекта дергать в теории можно, а в моем случае никак... )))

Например:


var user = {
  name: "Вася",
  age: 25
};

var str = JSON.stringify(user, function(key, value) {
  if (key == 'бла-бла') return undefined;
  return value;
} );

alert(str); // {"name":"Вася","age":25}


А как мне выдернуть из обьекта ключ и содержимое? Вопрос еще тот...
ava
kin | 03.10.2013, 19:29 #
Цитата (Marlik @  3.10.2013,  16:49 findReferencedText)
Только без stringify во второй селект ничего не попадает... 
 Давайте расставим точки над I. Во-первых, что приходит с сервера? Если я правильно понял, то это данные в ФОРМАТЕ JSON. А теперь попробуйте мне объяснить с какого перепуга, Вы решили, что нужно использовать метод JSON.stringify, в  описании которого говорится,  что он  преобразовывает («сериализует») значение в JSON-строку.
Во-вторых:
Цитата (Marlik @  3.10.2013,  16:49 findReferencedText)
А как мне выдернуть из обьекта ключ и содержимое? Вопрос еще тот... 
Легко!

   for (var key in response)
       alert(key+"="+response[key]);

Смысл данного кода, думаю, понятен без комментариев...
ava
Marlik | 04.10.2013, 08:26 #
К сожалеию ваша конструкция не работает, то есть просто ничего не происходит. Я кстати просто ради экспериента вставил JSON.stringify подумал что вдруг данные все-таки не в json формате приходят. Получается наверное так, я получаю объект, в котором неизвестны ни ключ, ни значение. Вот сейчас как у меня все выглядит:


<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

<script type="text/javascript">
$(function(){

$('#country').change(function(){
   
    var country = $(this).val()   
    
    var request = $.ajax({

      url: "./cgi-bin/city.cgi",

      type: "GET",

      data: { country : country },

    });
    
    request.done(function( msg ) {

     response        =JSON.parse(response)

      var cityEl     = $('#state')
    
      cityEl.empty()
      
      $.each(response, function(){

         cityEl.append('<option>' + $(this) + '</option>')              
     

})
    });

})


}); 
</script>





<div>
<div id="first">
    <select name="country" id="country">
    <option value="">Выберите страну &raquo;</option>
      <option value="1">Россия</option>                                            
          <option value="2">Украина</option>                                           
          <option value="3">Абхазия</option>                                           
          <option value="4">Австралия</option>                                         
          <option value="5">Австрия</option>                                           
          <option value="6">Азербайджан</option>                                       
          <option value="7">Албания</option>                                           
          <option value="8">Алжир</option>                                             
          <option value="9">Ангола</option>        
</select>
</div>
<div id="second">
    <select name="state" id="state">
    <option value="">Выберите область &raquo;</option>
    </select>
</div>    
<div id="three">
    <select name="town" id="town">
    <option value="">Выберите город &raquo;</option>
    </select>
</div>    
</div>









ava
Marlik | 04.10.2013, 11:39 #
Убрал эту строку и все заработало:


var response   = JSON.parse(msg)


Сделал так:


var response  = (msg)
ava
Marlik | 04.10.2013, 16:57 #
Нифига не работает правильно... вместо ключа вставляет слово key

Вот тут.


 $.each(response, function(){

       for (var key in response){
      
        townEl.append('<option value='+ key + '>' + response[key] + '</option>')              
     }
})


Как вставить ключ? Хэлп!!!
ava
Marlik | 06.10.2013, 15:43 #
Вопрос решен, переделал так и заработало:

   
    for (var key in response){
   
      cityEl.append('<option value=' + key + '>' + response[key] + '</option>')              
     
}



Всем кто помогал, спасибо.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Marlik   akizelokro   kin   RBW
advanced
Submit