jQuery Autocomplete: автозаполнение

нужна помощь по кирилице

#1 7 апреля 2013 в 19:29
есть мод автоматического поиска товара на аякс
кто разбирается в js?
поиск ищет только английские буквы и цифры… русские буквы игнорирует вот код скрипта кто знает решение?

вот код скрипта
  1. /*
  2. * jQuery Autocomplete plugin 1.1
  3. *
  4. * Copyright (c) 2009 Jörn Zaefferer
  5. *
  6. * Dual licensed under the MIT and GPL licenses:
  7. * http://www.opensource.org/licenses/mit-license.php
  8. * http://www.gnu.org/licenses/gpl.html
  9. *
  10. * Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
  11. */
  12.  
  13. ;(function($) {
  14.  
  15. $.fn.extend({
  16. autocomplete: function(urlOrData, options) {
  17. var isUrl = typeof urlOrData == "string";
  18. options = $.extend({}, $.Autocompleter.defaults, {
  19. url: isUrl ? urlOrData : null,
  20. data: isUrl ? null : urlOrData,
  21. delay: isUrl ? $.Autocompleter.defaults.delay : 10,
  22. max: options && !options.scroll ? 10 : 150
  23. }, options);
  24.  
  25. // if highlight is set to false, replace it with a do-nothing function
  26. options.highlight = options.highlight || function(value) { return value; };
  27.  
  28. // if the formatMatch option is not specified, then use formatItem for backwards compatibility
  29. options.formatMatch = options.formatMatch || options.formatItem;
  30.  
  31. return this.each(function() {
  32. new $.Autocompleter(this, options);
  33. });
  34. },
  35. result: function(handler) {
  36. return this.bind("result", handler);
  37. },
  38. search: function(handler) {
  39. return this.trigger("search", [handler]);
  40. },
  41. flushCache: function() {
  42. return this.trigger("flushCache");
  43. },
  44. setOptions: function(options){
  45. return this.trigger("setOptions", [options]);
  46. },
  47. unautocomplete: function() {
  48. return this.trigger("unautocomplete");
  49. }
  50. });
  51.  
  52. $.Autocompleter = function(input, options) {
  53.  
  54. var KEY = {
  55. UP: 38,
  56. DOWN: 40,
  57. DEL: 46,
  58. TAB: 9,
  59. RETURN: 13,
  60. ESC: 27,
  61. COMMA: 188,
  62. PAGEUP: 33,
  63. PAGEDOWN: 34,
  64. BACKSPACE: 8
  65. };
  66.  
  67. // Create $ object for input element
  68. var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
  69.  
  70. var timeout;
  71. var previousValue = "";
  72. var cache = $.Autocompleter.Cache(options);
  73. var hasFocus = 0;
  74. var lastKeyPressCode;
  75. var config = {
  76. mouseDownOnSelect: false
  77. };
  78. var select = $.Autocompleter.Select(options, input, selectCurrent, config);
  79.  
  80. var blockSubmit;
  81.  
  82. // prevent form submit in opera when selecting with return key
  83. $.browser.opera && $(input.form).bind("submit.autocomplete", function() {
  84. if (blockSubmit) {
  85. blockSubmit = false;
  86. return false;
  87. }
  88. });
  89.  
  90. // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
  91. $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
  92. // a keypress means the input has focus
  93. // avoids issue where input had focus before the autocomplete was applied
  94. hasFocus = 1;
  95. // track last key pressed
  96. lastKeyPressCode = event.keyCode;
  97. switch(event.keyCode) {
  98.  
  99. case KEY.UP:
  100. event.preventDefault();
  101. if ( select.visible() ) {
  102. select.prev();
  103. } else {
  104. onChange(0, true);
  105. }
  106. break;
  107.  
  108. case KEY.DOWN:
  109. event.preventDefault();
  110. if ( select.visible() ) {
  111. select.next();
  112. } else {
  113. onChange(0, true);
  114. }
  115. break;
  116.  
  117. case KEY.PAGEUP:
  118. event.preventDefault();
  119. if ( select.visible() ) {
  120. select.pageUp();
  121. } else {
  122. onChange(0, true);
  123. }
  124. break;
  125.  
  126. case KEY.PAGEDOWN:
  127. event.preventDefault();
  128. if ( select.visible() ) {
  129. select.pageDown();
  130. } else {
  131. onChange(0, true);
  132. }
  133. break;
  134.  
  135. // matches also semicolon
  136. case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
  137. case KEY.TAB:
  138. case KEY.RETURN:
  139. if( selectCurrent() ) {
  140. // stop default to prevent a form submit, Opera needs special handling
  141. event.preventDefault();
  142. blockSubmit = true;
  143. return false;
  144. }
  145. break;
  146.  
  147. case KEY.ESC:
  148. select.hide();
  149. break;
  150.  
  151. default:
  152. clearTimeout(timeout);
  153. timeout = setTimeout(onChange, options.delay);
  154. break;
  155. }
  156. }).focus(function(){
  157. // track whether the field has focus, we shouldn't process any
  158. // results if the field no longer has focus
  159. hasFocus++;
  160. }).blur(function() {
  161. hasFocus = 0;
  162. if (!config.mouseDownOnSelect) {
  163. hideResults();
  164. }
  165. }).click(function() {
  166. // show select when clicking in a focused field
  167. if ( hasFocus++ > 1 && !select.visible() ) {
  168. onChange(0, true);
  169. }
  170. }).bind("search", function() {
  171. // TODO why not just specifying both arguments?
  172. var fn = (arguments.length > 1) ? arguments[1] : null;
  173. function findValueCallback(q, data) {
  174. var result;
  175. if( data && data.length ) {
  176. for (var i=0; i < data.length; i++) {
  177. if( data[i].result.toLowerCase() == q.toLowerCase() ) {
  178. result = data[i];
  179. break;
#2 7 апреля 2013 в 19:51
можно прикрутить тот, что в дистрибутиве autocomplete
#3 7 апреля 2013 в 19:58
не то
#4 7 апреля 2013 в 19:59
нашел такое решение но не помогло
Отрываем файл jquery.autocomplete.js, находим в нем

data: $.extend({
q: lastWord(term),
limit: options.max
}, extraParams),

Заменяем на:

data: $.extend({
q: encodeURIComponent(lastWord(term)),
limit: options.max
}, extraParams),
#5 7 апреля 2013 в 20:10
всё остальное в UTF-8? включая форму
#6 7 апреля 2013 в 20:15
всё в UTF-8… всё равно поиск выдаёт только по агло клавиатуре и цифры… рускую клаву не хочет воспринемать
может файле запроса подправить?
  1. <?php
  2.  
  3.  
  4.  
  5. define ('IN_SITE', 1);
  6. define ('IN_AJAX', 1);
  7.  
  8. $q = strtolower($_GET["q"]);
  9. if (!$q) return;
  10.  
  11. include_once('../includes/global.php');
  12.  
  13. $auctions = $db->query("SELECT name FROM " . DB_PREFIX . "auctions WHERE closed=0 AND deleted=0 AND active = 1 AND name LIKE '%".$q."%'");
  14.  
  15. while ($auction_name = $db->fetch_array($auctions))
  16. {
  17. $aname = $auction_name['name'];
  18. print "$aname\n";
  19.  
  20. }
  21. ?>
#7 7 апреля 2013 в 20:20
сам параметр $_GET['q'] в нормальном виде приходит?
#8 7 апреля 2013 в 20:26
попробуйте как вариант использовать mb_strtolower
#9 7 апреля 2013 в 20:36
mb_strtolower
не помогло так же и осталось… поиск русские буквы не воспринемает
#10 7 апреля 2013 в 20:43
добавил после $q = strtolower($_GET["q"]);
$q = urldecode($q);
стал воспринемать только букву И и П… мистика)))) остальные буквы по поиску не работают только англ и цифры scratch
#11 7 апреля 2013 в 20:46
"auctions WHERE LOWER(name) LIKE '%{$q}%' AND closed=0 AND deleted=0 AND active = 1"

а чем стандартный то не подходит, практически тот же самый код /core/ajax/tagsearch.php и тот автокомплит что во втором посте
#12 7 апреля 2013 в 20:49
разные движки
#13 7 апреля 2013 в 20:53
$q = urldecode($q); — переменные в суперглобальных массивах уже декодированы, нужно искать раньше,
просто вывести echo $q; в коде что выдаёт?
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.