За последние 24 часа нас посетили 24394 программиста и 1725 роботов. Сейчас ищут 1906 программистов ...

Динамическое обновление списка select (продолжение мытарств)

Тема в разделе "JavaScript и AJAX", создана пользователем macam, 25 июн 2008.

  1. macam

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

    С нами с:
    25 июн 2008
    Сообщения:
    4
    Симпатии:
    0
    Доброго времени суток!

    С JS работаю совсем недавно. Прошу помочь в решении ситуации:

    есть некий индексный файл, содержащий необходимые функции и элементы интерфейса, в т.ч. и злополучный список. содержимое списка берется из php-обработчика (actlist.php), который, в свою очередь, берет элементы списка из базы. Задача: нажимая на кнопку "Обновить список", получать от обработчика новые элементы (не перезагружая всю страницу) и представлять все это в виде простого выпадающего списка. Вот тут-то и проблема: не могу никак добится нормальной html-формы, на страницу выводится html-код, но в виде простого текста:

    Код (Text):
    1.  
    2. <select id = 'lex_act_id1' name = 'lex_act_id1'><option value = '0'>Выберите<option value = '6'>Объект 1 <option value = '3'>Объект 2 <option value = '4'>Объект 3 <option value = '5'>Объект 4 <option value = '2'>Объект 5 <option value = '1'>Объект 6 </select>
    как бы его заставить обработать этот выдаваемый html? сил моих больше нет :(

    краткие листинги:

    Код (Text):
    1.  
    2.  
    3. <script type="text/javascript" src="text-utils.js"> </script>
    4.   <script language="javascript" type="text/javascript">
    5.   var request = null;
    6.  
    7.    function createRequest() {
    8.      try {
    9.        request = new XMLHttpRequest();
    10.      } catch (trymicrosoft) {
    11.        try {
    12.          request = new ActiveXObject("Msxml2.XMLHTTP");
    13.        } catch (othermicrosoft) {
    14.          try {
    15.            request = new ActiveXObject("Microsoft.XMLHTTP");
    16.          } catch (failed) {
    17.            request = null;
    18.          }
    19.        }
    20.      }
    21.  
    22.      if (request == null)
    23.        alert("Error creating request object!");
    24.    }
    25.  
    26.    function getActList() {
    27.      createRequest();
    28.      var url = "actlist.php";
    29.      request.open("GET", url, true);
    30.      request.onreadystatechange = updatePage;
    31.      request.send(null);
    32.   }
    33.  
    34.   function updatePage() {
    35.     if (request.readyState == 4) {
    36.       var newTotal = request.responseText;
    37.       var ActList = document.getElementById("act-list");
    38.       replaceText(ActList, newTotal);
    39.  
    40.  
    41.     }
    42.   }
    43.  
    44.   </script>
    45.  
    46.  
    47. </head>
    48.  
    49. <body>
    50.  
    51. ........
    52. <span id="act-list">  </span>
    53.                      <form method="GET">
    54.                    <input value="Обновить список" type="button" onClick="getActList();" />
    55.  
    56.                    </form>
    содержание файла text-utils.js:

    Код (Text):
    1.  
    2.  
    3. function replaceText(el, text) {
    4.   if (el != null) {
    5.     clearText(el);
    6.     var newNode = document.createTextNode(text);
    7.     el.appendChild(newNode);
    8.   }
    9. }
    10.  
    11.  
    12.  
    13. function clearText(el) {
    14.   if (el != null) {
    15.     if (el.childNodes) {
    16.       for (var i = 0; i < el.childNodes.length; i++) {
    17.         var childNode = el.childNodes[i];
    18.         el.removeChild(childNode);
    19.       }
    20.     }
    21.   }
    22. }
    23.  
    24. function getText(el) {
    25.   var text = "";
    26.  
    27.   if (el != null) {
    28.     if (el.childNodes) {
    29.       for (var i = 0; i < el.childNodes.length; i++) {
    30.         var childNode = el.childNodes[i];
    31.         if (childNode.nodeValue != null) {
    32.           text = text + childNode.nodeValue;
    33.         }
    34.       }
    35.     }
    36.   }
    37.  
    38.   return text;
    39.  
    40. }
    содержание файла actlist.php:

    Код (Text):
    1.  
    2. <?
    3. require_once('functions.php');
    4.  
    5.  
    6. ?>
    7.  
    8. <?php          
    9. $act_array = get_act($lex_act_id);
    10. display_act($act_array, @$lex_act_id, $all = 1);
    11.                    ?>
     
  2. Ивашка

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

    С нами с:
    29 авг 2007
    Сообщения:
    96
    Симпатии:
    0
    Адрес:
    Щёкино/Тула
    Так вы же сами говорите:
    [js]var newNode = document.createTextNode(text);[/js]
    мол, хочу текстовый узел. Вот он и выводится текстом. Тут надо юзать innerHTML или insertAdjacentHTML/createContextualFragment (последнее не особо кроссбараузерно, зато по стандарту :) )
     
  3. macam

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

    С нами с:
    25 июн 2008
    Сообщения:
    4
    Симпатии:
    0
    да, я изменил функцию на:

    [js]
    function replaceText(el, text) {
    if (el != null) {
    el.innerHTML = text;
    }
    }[/js]


    все заработало. только вот теперь, если на странице больше одной подобной формы, то работает все это дело (передача переменных обработчику для внесения в базу) только в сафари :( в файрфоксе, а уж, тем более, в ИЕ - передаются пустые значения.
     
  4. BS

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

    С нами с:
    10 апр 2008
    Сообщения:
    149
    Симпатии:
    0
    я делал проще, везде работает.
    если по минимому, безо всяких проверок и установления выбранных значений, то так:

    [js]
    var listArray = originalRequest.responseText.split(",");
    var lst = document.getElementById("city");
    lst.innerHTML="";
    for(var i=0; i<listArray.length; i+=2){
    o=document.createElement('option');
    o.text=listArray[i+1];
    o.value=listArray;
    lst.options.add(o);
    }
    [/js]

    тут у меня originalRequest.responseText - возвращаемый аджаксом текст, по сути - строка пар значений, разделенных запятыми. Первое значение - "value" второе- "текст, выводимый в списке"