Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Очередной autocomplete

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите сделать правильный автокомплит
hungel
Отправлено: 19 Января, 2016 - 16:43:06
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)




Здравствуйте уважаемые форумчане.
Делаю автокомплит для веб приложения и столкнулся с проблемой.
Мне не удалось найти ни одного готового примера для моей задачи. Суть в том, что в большинстве автокомплитов не работают стрелки вверх и вниз, а даже если они работают то клавиша enter помещает содерживое из выпадающего списка в INPUT, а мне нужно, чтобы совершался переход по ссылке из которых у меня и состоит выпадающий список.

Я с JS дружу очень плохо, потому и прошу вашей помощи.
Самый удачный пример который мне удалось найти привожу тут.

html
CODE (htmlphp):
скопировать код в буфер обмена
  1. echo "<script src='".INCLUDES."jscripts/custom.js'></script>";
  2.  
  3. echo "<style>
  4.        .search_area{
  5.            width: 350px;
  6.            margin: 0px;
  7.            position: relative;
  8.        }
  9.  
  10.        #search_box{
  11.            width:200px;
  12.            padding:2px;
  13.            margin:1px;
  14.            border:1px solid #000;
  15.        }
  16.  
  17.        #search_advice_wrapper{
  18.            display:none;
  19.            width: 350px;
  20.            background-color: #eee;
  21.            color: rgb(255, 227, 189);
  22.            -moz-opacity: 0.95;
  23.            opacity: 0.95;
  24.            -ms-filter:'progid:DXImageTransform.Microsoft.Alpha'(Opacity=95);
  25.            filter: progid:DXImageTransform.Microsoft.Alpha(opacity=95);
  26.            filter:alpha(opacity=95);
  27.            z-index:999;
  28.            position: absolute;
  29.            top: 24px; left: 0px;
  30.        }
  31.  
  32.        #search_advice_wrapper .advice_variant{
  33.            cursor: pointer;
  34.            padding: 5px;
  35.            text-align: left;
  36.        }
  37.        #search_advice_wrapper .advice_variant:hover{
  38.            color:#FEFFBD;
  39.            background-color:#818187;
  40.        }
  41.        #search_advice_wrapper .active{
  42.            cursor: pointer;
  43.            padding: 5px;
  44.            color:#FEFFBD;
  45.            background-color:#818187;
  46.        }
  47.  
  48.    </style>";
  49.  
  50. echo "<div class='search_area'>
  51.                 <form action='' method='GET'>
  52.                     <input type='text' name='id' id='search_box' value='' autocomplete='off'>
  53.                 </form>
  54.                 <div id='search_advice_wrapper'></div>
  55.             </div>";


php
CODE (htmlphp):
скопировать код в буфер обмена
  1. if(!empty($_GET['query'])){
  2.     $query = (string)$_GET['query'];
  3.     $array = array();
  4.     $result = dbquery("SELECT personal_id, surname, first_name, middle_name FROM ".$db_prefix."personal WHERE surname like '".$query."%' ORDER BY surname LIMIT 0,6");
  5.     while($data =dbarray($result)){
  6.         $array[] = "<a href=crew_personal.php?id=".$data['personal_id'].">".$data['surname']." ".$data['first_name']." ".$data['middle_name']."</a>";
  7.     }
  8.     echo "['".implode("','", $array)."']";
  9.     //echo "['".implode("','", $array)."']";
  10. }


JS
CODE (javascript):
скопировать код в буфер обмена
  1. var suggest_count = 0;
  2. var input_initial_value = '';
  3. var suggest_selected = 0;
  4.  
  5. $(window).load(function(){
  6.     // читаем ввод с клавиатуры
  7.     $("#search_box").keyup(function(I){
  8.         // определяем какие действия нужно делать при нажатии на клавиатуру
  9.         switch(I.keyCode) {
  10.             // игнорируем нажатия на эти клавишы
  11.             case  9:  // tab
  12.             case 13:  // enter
  13.             case 27:  // escape
  14.             case 38:  // стрелка вверх
  15.             case 40:  // стрелка вниз
  16.             break;
  17.  
  18.             default:
  19.                 // производим поиск только при вводе более 1х символов
  20.                 if($(this).val().length>=1){
  21.  
  22.                     input_initial_value = $(this).val();
  23.                     // производим AJAX запрос к crew_search.php, передаем ему GET query, в который мы помещаем наш запрос
  24.                     $.get("crew_search.php", { "query":$(this).val() },function(data){
  25.                         //php скрипт возвращает нам строку, ее надо распарсить в массив.
  26.                         // возвращаемые данные: ['test','test 1','test 2','test 3']
  27.                         var list = eval('('+data+')');
  28.                         suggest_count = list.length;
  29.                         if(suggest_count > 0){
  30.                             // перед показом слоя подсказки, его обнуляем
  31.                             $("#search_advice_wrapper").html("").show();
  32.                             for(var i in list){
  33.                                 if(list[i] != ''){
  34.                                     // добавляем слои позиции
  35.                                     $('#search_advice_wrapper').append('<div class="advice_variant">'+list[i]+'</div>');
  36.                                 }
  37.                             }
  38.                         }
  39.                     }, 'html');
  40.                 }
  41.             break;
  42.         }
  43.     });
  44.  
  45.     //считываем нажатие клавишь, уже после вывода подсказки
  46.     $("#search_box").keydown(function(I){
  47.         switch(I.keyCode) {
  48.             // по нажатию клавишь прячем подсказку
  49.             case 13: // enter
  50.                 $('#search_advice_wrapper').hide();
  51.                 return false;
  52.             break;
  53.             case 27: // escape
  54.                 $('#search_advice_wrapper').hide();
  55.                 return false;
  56.             break;
  57.             // делаем переход по подсказке стрелочками клавиатуры
  58.             case 38: // стрелка вверх
  59.             case 40: // стрелка вниз
  60.                 I.preventDefault();
  61.                 if(suggest_count){
  62.                     //делаем выделение пунктов в слое, переход по стрелочкам
  63.                     //key_activate( I.keyCode-39 );
  64.                     if (key_activate( I.keyCode == 40 )) {
  65.                         var focused = $(':focus');
  66.                         //$(this).parent().next().find("a").focus();
  67.                         focused.parent().next().find('a').focus();
  68.                         //$(".advice_variant:focus").next().find('a.advice_variant').focus();      
  69.                         //$('.advice_variant:focus').next().focus();      
  70.                     }    
  71.                     if (key_activate( I.keyCode == 38 )) {      
  72.                         $('.advice_variant:focus').prev().focus();      
  73.                     }      
  74.                    
  75.                 }
  76.             break;
  77.         }
  78.     });
  79.  
  80.     // делаем обработку клика по подсказке
  81.     $('.advice_variant').live('click',function(){
  82.         $('.advice_variant:focus').focus();
  83.         // ставим текст в input поиска
  84.         $('#search_box').val($(this).text());
  85.         // прячем слой подсказки
  86.         $('#search_advice_wrapper').fadeOut(350).html('');
  87.     });
  88.  
  89.     // если кликаем в любом месте сайта, нужно спрятать подсказку
  90.     $('html').click(function(){
  91.         $('#search_advice_wrapper').hide();
  92.     });
  93.     // если кликаем на поле input и есть пункты подсказки, то показываем скрытый слой
  94.     $('#search_box').click(function(event){
  95.         //alert(suggest_count);
  96.         if(suggest_count)
  97.             $('#search_advice_wrapper').show();
  98.         event.stopPropagation();
  99.     });
  100. });
  101.  
  102. function key_activate(n){
  103.     $('#search_advice_wrapper div').eq(suggest_selected-1).removeClass('active');
  104.  
  105.     if(n == 1 && suggest_selected < suggest_count){
  106.         suggest_selected++;
  107.     }else if(n == -1 && suggest_selected > 0){
  108.         suggest_selected--;
  109.     }
  110.  
  111.     if( suggest_selected > 0){
  112.         $('#search_advice_wrapper div').eq(suggest_selected-1).addClass('active');
  113.         $("#search_box").val( $('#search_advice_wrapper div').eq(suggest_selected-1).text() );
  114.     } else {
  115.         $("#search_box").val( input_initial_value );
  116.     }
  117. }
  118.  
 
 Top
Viper
Отправлено: 19 Января, 2016 - 20:21:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)






-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
hungel
Отправлено: 21 Января, 2016 - 13:40:34
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Авг. 2012  


Помог: 0 раз(а)




Проблема решена. допиливанием JS.
Никак не мог заставить его брать ссылку в фокус, теперь работает как надо.

Вот код.

CODE (javascript):
скопировать код в буфер обмена
  1. var suggest_count = 0;
  2. var input_initial_value = '';
  3. var suggest_selected = 0;
  4.  
  5. $(window).load(function(){
  6.     // читаем ввод с клавиатуры
  7.     $("#search_box").keyup(function(I){
  8.         // определяем какие действия нужно делать при нажатии на клавиатуру
  9.         switch(I.keyCode) {
  10.             // игнорируем нажатия на эти клавишы
  11.             case  9:  // tab
  12.             case 13:  // enter
  13.             case 27:  // escape
  14.             case 38:  // стрелка вверх
  15.             case 40:  // стрелка вниз
  16.             break;
  17.  
  18.             default:
  19.                 // производим поиск только при вводе более 1х символов
  20.                 if($(this).val().length>=1){
  21.  
  22.                     input_initial_value = $(this).val();
  23.                     // производим AJAX запрос к crew_search.php, передаем ему GET query, в который мы помещаем наш запрос
  24.                     $.get("crew_search.php", { "query":$(this).val() },function(data){
  25.                         //php скрипт возвращает нам строку, ее надо распарсить в массив.
  26.                         // возвращаемые данные: ['test','test 1','test 2','test 3']
  27.                         var list = eval('('+data+')');
  28.                         suggest_count = list.length;
  29.                         if(suggest_count > 0){
  30.                             // перед показом слоя подсказки, его обнуляем
  31.                             $("#search_advice_wrapper").html("").show();
  32.                             for(var i in list){
  33.                                 if(list[i] != ''){
  34.                                     // добавляем слои позиции
  35.                                     $('#search_advice_wrapper').append('<div class="advice_variant">'+list[i]+'</div>');
  36.                                 }
  37.                             }
  38.                         }
  39.                     }, 'html');
  40.                 }
  41.             break;
  42.         }
  43.     });
  44.  
  45.     //считываем нажатие клавишь, уже после вывода подсказки
  46.     $("#search_box").keydown(function(I){
  47.         switch(I.keyCode) {
  48.             // по нажатию клавишь прячем подсказку
  49.             case 13: // enter
  50.                 $('#search_advice_wrapper').hide();
  51.                 return false;
  52.             break;
  53.             case 27: // escape
  54.                 $('#search_advice_wrapper').hide();
  55.                 return false;
  56.             break;
  57.             // делаем переход по подсказке стрелочками клавиатуры
  58.             case 38: // стрелка вверх
  59.             case 40: // стрелка вниз
  60.                 I.preventDefault();
  61.                 if(suggest_count){
  62.                     //делаем выделение пунктов в слое, переход по стрелочкам
  63.                     key_activate( I.keyCode-39 );
  64.                 }
  65.             break;
  66.         }
  67.     });
  68.    
  69.     // Добавляем фокусировку на элементах в списке
  70.     $("#search_advice_wrapper").keydown(function(I){
  71.         switch(I.keyCode) {
  72.             // по нажатию клавишь прячем подсказку
  73.             case 27: // escape
  74.                 $('#search_advice_wrapper').hide();
  75.                 return false;
  76.             break;
  77.             // делаем переход по подсказке стрелочками клавиатуры
  78.             case 38: // стрелка вверх
  79.             case 40: // стрелка вниз
  80.                 I.preventDefault();
  81.                 if(suggest_count){
  82.                     //делаем выделение пунктов в слое, переход по стрелочкам
  83.                     key_activate( I.keyCode-39 );                    
  84.                 }
  85.             break;
  86.         }
  87.     });
  88.    
  89.    
  90.  
  91.     // делаем обработку клика по подсказке
  92.     $('.advice_variant').live('click',function(){
  93.         // ставим текст в input поиска
  94.         $('#search_box').val($(this).text());
  95.         // прячем слой подсказки
  96.         $('#search_advice_wrapper').fadeOut(350).html('');
  97.     });
  98.  
  99.     // если кликаем в любом месте сайта, нужно спрятать подсказку
  100.     $('html').click(function(){
  101.         $('#search_advice_wrapper').hide();
  102.     });
  103.     // если кликаем на поле input и есть пункты подсказки, то показываем скрытый слой
  104.     $('#search_box').click(function(event){
  105.         //alert(suggest_count);
  106.         if(suggest_count)
  107.             $('#search_advice_wrapper').show();
  108.         event.stopPropagation();
  109.     });
  110. });
  111.  
  112. function key_activate(n){
  113.     $('#search_advice_wrapper div').eq(suggest_selected-1).removeClass('active');
  114.  
  115.     if(n == 1 && suggest_selected < suggest_count){
  116.         suggest_selected++;
  117.     }else if(n == -1 && suggest_selected > 0){
  118.         suggest_selected--;
  119.     }
  120.  
  121.     if( suggest_selected > 0){
  122.         $('#search_advice_wrapper div').eq(suggest_selected-1).addClass('active');
  123.         $('.advice_variant a').eq(suggest_selected-1).focus();
  124.         $("#search_box").val( $('#search_advice_wrapper div').eq(suggest_selected-1).text() );
  125.     } else {
  126.         $("#search_box").val( input_initial_value );
  127.     }
  128. }


Тему можно закрывать.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB