автодополнение с Ajax

Discussion in 'PHP' started by NEFILIM, 16 Oct 2006.

  1. NEFILIM

    NEFILIM New Member

    Joined:
    5 Oct 2006
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Люди кто может помогите сделать такую фичу как дополнение результатов ввода в <select> с базы даных.... Очень надо
     
  2. madnet

    madnet Умиротворенный

    Joined:
    9 Dec 2004
    Messages:
    868
    Likes Received:
    343
    Reputations:
    423
    Такие фичи хорошо описаны в книге

    Ajax в действии
    В сети ее легко найти, здесь например
    http://www.rsdn.ru/res/book/web/ajax.xml
     
    _________________________
  3. NEFILIM

    NEFILIM New Member

    Joined:
    5 Oct 2006
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    спасибо но я вобще нихрена нережу в жаба скрипт у меня даже есть эта книга на столе но мне надо уже... а книгу придется читать с нуля и не только эту если есть гдето какиэто готовые экзамплы
     
  4. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    выкинь книгу по ajax и купи книгу по javascript. В частности тут тебе нужна инфа по DOM - Document Object Model.
    если сильно надо и сам нихера не шаришь - пиши в личку конкретно что и как, как будет время - распишу.
     
    _________________________
  5. madnet

    madnet Умиротворенный

    Joined:
    9 Dec 2004
    Messages:
    868
    Likes Received:
    343
    Reputations:
    423
    Trinux, че у тя за такая нелюбовь к термину Ajax, не первый раз вижу.
    Это всего лиш одно слово, которое заменяет, выучи JS DOM CSS асинхронные запросы.
     
    _________________________
  6. NEFILIM

    NEFILIM New Member

    Joined:
    5 Oct 2006
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    В принципе я так и делаю потому что шев сильно увлекся JS а я пишу на PHP
     
  7. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    потому что "ajax" стал модным и это сильно бесит. AJAX это не js, css, dom и прочие технологии. Это абривиатура юзания объекта xmlhttprequest на js.
    А вот js, css2, dom и прочие технологии, это концепция web 2.0 проектов. Но никак не ajax.

    Бесит что люди ставят ajax движки и считают себя модными и прочее. В обшем просто бесит.

    ЭТО НЕ НЕЛЮБОВЬ к xmlhttprequest`у. Я рад этой технологии и изучаю я ее самостоятелно уже более года, у меня несколько своих движков, я разобрал все "беды" с кодировками и прочее. Просто мода эта тупая достала.

    Так же достала мода на BMW. и многое еще чего. Это не значит что я не люблю BMW.
     
    _________________________
  8. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    То, что обычно называют аяксом - это xmlhttprequest. Но это отнюдь не главная часть аякса.

    А вот самое интеремное — имхо DOM.
     
  9. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    DOM это очень далеко не ajax, ну очень далеко. DOM это объект документа, представление всей html страницы в виде дерева всех ее элементов и доступа к этому дереву через js. При чем тут ajax? DOM был описан лет 6 назад.
     
    _________________________
  10. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Кстати. Слышал еще давно, что Трин говорил, про "не покупайте книги про аякс".
    Неделю назад купил... лучше бы книгу Полю Дюбуа купил про БД. Ибо в книге про аякс была одна хрень.
    Хороший справочник по Js все разрулит.
    Или "Энциклопедия Xml" Холзнера. Все клиентские технологии(+ основы джавы) рассмотрены детально. Еще бы: 1100 страниц A4 мелким шрифтом.
     
  11. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    насчет справочника по JS - вот это правильно. У самого на 1500 страниц A4, все досконально рассмотрено.
     
    _________________________
  12. NEFILIM

    NEFILIM New Member

    Joined:
    5 Oct 2006
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    Я поддержываю Trinux мне тоже кажется что технологии которые просто входят как "модно" ничо иное как просто хорошо продуманый алгоритм и ничо нового там грубо сказать нет... например я на старой роботе розработал (даже неподозревая того) свою систему MVC, когда пришел на нынешнюю фирму меня начили лечить что надо розобраться в Model View Controler я от одного названия испугался...
     
  13. NEFILIM

    NEFILIM New Member

    Joined:
    5 Oct 2006
    Messages:
    14
    Likes Received:
    0
    Reputations:
    0
    ну то как знатоки Js кто то поможет мне такое сделать???
     
    #13 NEFILIM, 18 Oct 2006
    Last edited: 18 Oct 2006
  14. [hidden]

    [hidden] Elder - Старейшина

    Joined:
    5 Nov 2005
    Messages:
    70
    Likes Received:
    19
    Reputations:
    7
    Обязательно SELECT? Предлагаю просто текстовое поле меню выбора ...если будет. Если этого хватит (посмотри хотя бы на http://homefarm.ru ) - готов помочь.
    Если нет.... то тоже готов=)
     
  15. [hidden]

    [hidden] Elder - Старейшина

    Joined:
    5 Nov 2005
    Messages:
    70
    Likes Received:
    19
    Reputations:
    7
    Короче, вот примерный вариант действий.

    Файл get.php - скрипт, который будет брать данные из БД:

    PHP:
    <?
      
    // ACHTUNG!!! В скрипте присутствует потенциальная уязвимость!
      // данные JS поступают в кодировке UTF-8, если у тебя БД в той же кодировке, можно оставить. 
      // У меня база в cp1251, приходится переконвертировать.
      
    $req_ iconv("utf-8""windows-1251"$req);

      
    mysql_connect("localhost""root");
      
    mysql_select_db("db_name");

      
    $response "";

      
    $res mysql_query("SELECT `name` FROM `table` WHERE `name` LIKE '" $req_ "%'");

      while(
    $row mysql_fetch_array($res)) {
        
    $name $row['name'];

        
    // как видно, скрипт выдает значения, обрамленные <option>
        
    $response .= "<option>" $name "</option>";
      }

      print(
    $response);
    ?>
    А это файл ajax.html, в котором размещается логика "приложения" и верстка:

    PHP:
    <html>
    <
    head>
    <
    meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <
    title>select check</title>

    <
    script language="javascript">

    var 
    req;
    var 
    mouseOver;
    var 
    choose;

    // Собстно, сердце AJAX
    if(window.XMLHttpRequest)
        
    req = new XMLHttpRequest();
    else
        if(
    window.ActiveXObject)
            
    req = new ActiveXObject("Microsoft.XMLHTTP");

    // эти функции (omo и omov) служат только одной цели - при щелчке мыши вне списка список должен закрыться, так? Придется отслеживать положение мыши.
    function omo() {
        
    mouseOver false;
    }

    function 
    omov() {
        
    mouseOver true;
    }

    // та самая проверка клика...
    document.onclick = function() { // блядь, во жесть...
      
    if(!mouseOver) {
        
    document.getElementById('div_res').style.display "none";
      }
    }

    // кликнули по списку (выбрали какое-то значение) - копируем его в текстовое поле и в переменную choose.
    function selectfield_click() {
      
    document.getElementById('textfield').value document.getElementById('selectfield').options[document.getElementById('selectfield').selectedIndex].text;
      
    document.getElementById('div_res').style.display "none";
      
    choose document.getElementById('textfield').value;
    }

    function 
    textfield_change() {
      var 
    val document.getElementById("textfield");

      
    mouseOver true;

      if(
    req) {
        try {
          
    req.open('GET''http://myserver/get.php?req=' encodeURI(val.value), true); // кодируем символы в UTF-8, иначе скрипту передастся бред.

          
    req.onreadystatechange = function() {
            if(
    req.readyState == 4) {
              if(
    req.responseText.length 10) {
                
    div_res.style.display "";
                
    div_res.innerHTML "<select name='selectfield' id='selectfield' size='4' onMouseOver='javascript:omov();' onMouseOut='javascript:omo();' onClick='javascript:selectfield_click();' multiple>" req.responseText "</select>";
              }
              else {
                
    div_res.style.display "none";
              }
            }
          }
        }
        catch(
    err) {
          
    alert(err);
        }

        
    // посылаем запрос.
        
    req.send(null);
      }
    }

    </script>
    </head>

    <body>
    <!-- в HTML нет элемента под названием "список", который к тому же мог бы редактироваться - или я просто не знаю, если знаете - скажите, буду благодарен; поэтому можно схитрить - поставить текстовое поле, а под ним - select с параметром multiple, что значит что список будет скроллируемый, но всегда открытый. -->
    <!-- теперь надо подобрать шрифт и размер поля, а так же подумать о максимальной длине возвращаемого значения из БД. -->
    <input type='text' id='textfield' size='20' onBlur='javascript:omo();' onKeyUp='javascript:textfield_change();'>

    <!--  изначально слой невидим, положение его "относительно" - то есть он будет сдвигать остальные элементы на странице. Это некрасиво, рекомендую сделать position:absolute, но для примера достаточно и этого. -->

    <div style='display:none;position:relative;' id='div_res'></div>
    </body>

    </html>
    // Я не думаю, что это идеал, но это хоть что-то...
     
    #15 [hidden], 19 Oct 2006
    Last edited: 19 Oct 2006
    1 person likes this.
  16. SMiX

    SMiX Elder - Старейшина

    Joined:
    25 Jul 2005
    Messages:
    227
    Likes Received:
    55
    Reputations:
    29
    Насчет скрипта на php: во-первых, переменную $req надо сначала брать из $_GET['req']; воизбежание ошибок при отключенной REGISTER_GLOBALS, во-вторых, ;куй_ надо фильтровать, т.к. там sql-инъекция, явная, никакая не "потенциальная", ну и в-третьихя, это мелочь, но все же: в данном случае вместо mysql_fetch_array используй mysql_fetch_assoc, т.к. при таком использовании первой, без доп. параметров, генерятся еще помимо элементов $array['name'], элементы $array[номер].