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
Форумы портала PHP.SU :: Версия для печати :: проблема при использовании нескольких полей с "живым поиском"
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » проблема при использовании нескольких полей с "живым поиском"

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

1. FarawaySlv - 11 Апреля, 2016 - 14:27:34 - перейти к сообщению
При использовании нескольких полей input с "живым поиском" возникла проблема при выборе значения из вариантов результатов поиска. При вводе в первое поле все ОК, при выборе значения для следующего поля значение подставляется не только в нужное поле, но и все вышестоящие и т.д. Необходимо чтобы в каждом поле сохранялся только выбранный для него вариант.
В реальном случает работа идет с базой данных откуда подбираются значения полей, в приведенном же ниже коде я просто смоделировал эту ситуацию в более простом варианте.

html страница:

CODE (html):
скопировать код в буфер обмена
  1.  
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.         <meta charset="UTF-8">
  6.         <title>Girls</title>
  7.         <script type="text/javascript" src="js/jquery-2.2.0.min.js"></script>
  8.         <script type="text/javascript" src="js/function.js"></script>
  9. </head>
  10. <body>
  11.         <table>
  12.                 <thead>
  13.                         <tr>
  14.                                 <td>
  15.                                         Имя:
  16.                                 </td>
  17.                         </tr>
  18.                 </thead>
  19.                 <tbody>
  20.                         <tr>
  21.                                 <td>
  22.                                         <input type="text" name="name1" class="for_name">
  23.                                 </td>
  24.                         </tr>
  25.                         <tr>
  26.                                 <td>
  27.                                         <input type="text" name="name2" class="for_name">
  28.                                 </td>
  29.                         </tr>
  30.                         <tr>
  31.                                 <td>
  32.                                         <input type="text" name="name3" class="for_name">
  33.                                 </td>
  34.                         </tr>
  35.                         <tr>
  36.                                 <td>
  37.                                         <input type="text" name="name4" class="for_name">
  38.                                 </td>
  39.                         </tr>
  40.                         <tr>
  41.                                 <td>
  42.                                         <input type="text" name="name5" class="for_name">
  43.                                 </td>
  44.                         </tr>
  45.                 </tbody>
  46.         </table>
  47.         <ul class="search_result"></ul>
  48. </body>
  49. </html>
  50.  



Скрипт:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var d = document;
  3. $(d).ready(function() {
  4.         $('input.for_name').on("keyup", function() {
  5.         var ask = this.value; //после приема введенных в input данных записываю значение и имя тэга
  6.         var name = this.name;
  7.         var row = "";
  8. //отправляю запрос на php для подбора похожих имен
  9.          $.ajax({
  10.                 type: 'post',
  11.                 url: "test.php",
  12.                 data: {'ask' : ask},
  13.                 success: function(data) {
  14.                         variants = JSON.parse(data);
  15.                          //формирую результат для вывода в виде списка
  16.                         for (var i = 0; i < variants.length; i++) {
  17.                              row = row + "<li>" + variants[i] + "</li>";
  18.                         }
  19.                                 //вывожу список
  20.                         $(".search_result").html(row).fadeIn();
  21.                 }
  22.         })
  23.                    //при клике на вариант результатов поиска вношу его в поле input
  24.                 $(".search_result").on("click", "li", function() {
  25.                         $(d.getElementsByName(name)[0]).val($(this).text());
  26.                 })
  27.  
  28.         })
  29. })
  30.  



И php файл:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.         $girls = array('Катя', 'Кристина', 'Кира', 'Таня', 'Тамара', 'Тина', 'Наташа', 'Настя', 'Надежда', 'Маргарита', 'Мария', 'Мила', 'Антонина', 'Аня', 'Александра', 'Анастасия', 'Агрипина', 'Акулина', 'Амфиса', 'Вилена', 'Виолета', 'Виктория', 'Виталина');
  4.        
  5. //функция транслитерации
  6.         function translit($s) {
  7.                   $s = (string) $s;
  8.                   $s = strip_tags($s);
  9.                   $s = str_replace(array("\n", "\r"), " ", $s);
  10.                   $s = preg_replace("/\s+/", ' ', $s);
  11.                   $s = trim($s);
  12.                   $s = mb_strtolower($s, 'utf-8');
  13.                   $s = strtr($s, array("А"=>"A","Б"=>"B","В"=>"V","Г"=>"G", "Д"=>"D","Е"=>"E","Ж"=>"J","З"=>"Z","И"=>"I", "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N", "О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T", "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH", "Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"", "Э"=>"E","Ю"=>"YU","Я"=>"YA", 'а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'e','ж'=>'j','з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'shch','ы'=>'y','э'=>'e','ю'=>'yu','я'=>'ya','ъ'=>'','ь'=>''));
  14.                   $s = preg_replace("/[^0-9a-z-_ ]/i", "", $s);
  15.                   return $s;
  16. }
  17.  
  18.  
  19.         if ($_POST["ask"]) {
  20.                 $ask = translit($_POST["ask"]);
  21.                 $row = array();
  22.                 $k = 0;
  23.                 $num = strlen($ask);
  24.                      // иду по массиву и ищу похожие имена
  25.                 for ($i = 0; $i< count($girls); $i++) {
  26.                         $tmp_str = translit($girls[$i]);
  27.                         if ((substr($tmp_str, 0, $num)) == $ask) {
  28.                                 $row[$k] = $girls[$i];
  29.                                 $k++;
  30.                                 }
  31.                 }
  32.                 //перевожу json в формат
  33.                 echo json_encode($row);
  34.         }
  35. ?>
  36.  



Если из скрипта убрать ajax запрос и данные брать просто из массива сформированного в самом скрипте, а выбор варианта поиска описать
$(".search_result li").on("click", function() {
$(d.getElementsByName(name)[0]).val($(this).text());
})

все работает корректно. Т.е. если я правильно понял - проблема в формировании результатов поиска как результата ajax запроса (вынести данные за него и вывести строки li у меня не получилось...).

Помогите пожалуйста, неделю уже мучаюсь Улыбка.
2. Viper - 11 Апреля, 2016 - 14:54:19 - перейти к сообщению
Не мешайте чистый javascript и jquery синтаксисы. Выглядит как говно, и сложно дебажить.
Формируйте всё внутри $.ajax метода. Вы не сможете вынести за этот метод результаты. Да это и не нужно.
variants = JSON.parse(data); лишнее

CODE (javascript):
скопировать код в буфер обмена
  1. var $this = $(this);
  2.  
  3. $.ajax({
  4.         ...
  5.         success: function(data) {
  6.                 //формирую результат для вывода в виде списка
  7.                 for (var i = 0; i < data.length; i++) {
  8.                         row = row + "<li>" + data[i] + "</li>";
  9.                 }
  10.  
  11.                 $(".search_result").on("click", "li", function() {
  12.                         $this.val($(this).text());
  13.                 });
  14.                 //вывожу список
  15.                 $(".search_result").html(row).fadeIn();
  16.         }
  17. });
3. FarawaySlv - 11 Апреля, 2016 - 16:33:55 - перейти к сообщению
Насчет качества кода согласен, но пока по другому не могу Недовольство, огорчение.
Вы проверяли написанный вами код на работоспособность? У меня почему-то без variants = JSON.parse(data), data - это кодированная строка, которая абсолютно нечитабельная (возможно в настройках ajax запроса можно что-то указать и решить эту проблему без использования parse). Сам результат выполнения скрипта ничем не отличается от того что был у меня - все-равно при изменении нижних полей изменяются значения и верхних... Недовольство, огорчение.
А не подскажите почему не работает вариант с записью (при такой форме записи у меня все корректно работало в тестовом варианте без ajax запроса)
$(".search_result li").on("click", function() {
$this.val($(this).text());
});
а, только с $(".search_result").on("click", "li", function() {
$this.val($(this).text());
});
?

Провел эксперимент, хочу уточнить что синхронно меняются значения только у тех полей, у которых событие keyup уже происходило, независимо от их порядка. Может скрипт "запоминает" что за этим полем уже закреплено событие и каждый раз обновляет его значение...
4. Viper - 11 Апреля, 2016 - 17:48:36 - перейти к сообщению
Мда. Есть траблы. После keyup нужно делать что-то типа unbind события, иначе вешается на все поля где жмем кнопки.
Я бы переделал иначе.
1. Взял готовое решение.
2. или если свой велосипед, то обрабатывать каждый инпут.
5. FarawaySlv - 11 Апреля, 2016 - 18:21:14 - перейти к сообщению
попробовал поставить $this.unbind() в разных вариациях, не срабатывает. Каждый инпут отдельно обрабатывать не вариант, на практике их может быть больше 10. Готового варианта тоже найти не получилосьНедовольство, огорчение.

 

Powered by ExBB FM 1.0 RC1