Подскажите по аякс поиску
Здравствуйте уважаемые! Вот изобретаю велосипед по быстрому поиску пользователями среди своих друзей в чате. Есть такой код:
<div class="friend-header"><input id="search_input" class="friend-search" type="text" placeholder="Поиск друзей..." onkeyup="friend_search(this.value);" maxlength="100" autocomplete="off"><div id="search_button"><i class="icon-search cursor-hand" onclick="$(" .friend-search").focus();"=""></i></div></div> function friend_search(query) { var ajax_timeout; var obj_search_user_list = $("#search_user_list"); if(query.length == 0) { obj_search_user_list.hide(); $("#user_list").show(); $("#search_button").empty(); $("#search_button").prepend('<i class="icon-search cursor-hand" onclick="$(".friend-search").focus();"></i>'); obj.find('#user_list > .select_user').prependTo($('#user_list')); $(".scroll_bar").customScrollbar("resize", true); show_chat(); //clearTimeout(ajax_timeout_search); //clearTimeout(ajax_timeout); //ajax_timeout.abort(); //ajax_timeout_search.abort(); return false; } $("#search_button").empty(); $("#search_button").prepend("<div class='loading-search'></div>"); ajax_timeout = setTimeout(function() { var ajaxurl = CHAT_SITE_URL+'/index.php?act=web_chat&op=search_friend&n=99&f_id='+user['u_id']+'&q='+query; $.ajax({ type: "GET", url: ajaxurl, dataType:"jsonp", async: false, cache: false, success: function(friend_list){ obj_search_user_list.empty(); $("#search_button").empty(); $("#search_button").prepend('<div class="clear-search"></div>'); for (var u_id in friend_list){ var class_html = 'offline'; if ( user_list[u_id]['online'] > 0 ) class_html = 'online'; obj_search_user_list.prepend('<li class="user" select_u_id="'+u_id+'" onclick="show_message('+u_id+');"><i class="'+class_html+'"></i><span class="user-avatar avatar-'+user_list[u_id]['online']+'" title="'+user_list[u_id]['u_name']+'"><img alt="'+user_list[u_id]['u_name']+'" src="'+user_list[u_id]['avatar']+'"></span><span class="user-name" title="'+user_list[u_id]['u_name']+'">'+user_list[u_id]['u_name']+'<em></em></span><em unread_id="'+u_id+'" class=""></em></li>'); } }, complete: function() { $("#user_list").hide(); obj_search_user_list.show(); //getconnect(); $(".loading-search").remove(); $(".scroll_bar").customScrollbar("resize", true); } }); }, 500); } public function search_friendOp() { $model_chat = Model('web_chat'); $f_id = intval($_GET['f_id']); $n = intval($_GET['n']); $member_list = $model_chat->getFriendList(array('friend_frommid'=> $f_id, 'friend_tomname' => array('like','%'.trim($_GET['q']).'%')),$n,$member_list); $this->json($member_list); } Подскажите как можно улучшить данный код, в плане нагрузки на базу. И еще интересует как сделать запуск функции только когда пользователь ввел последнюю букву и остановился, а то сейчас при каждой введенной буквы запрос отправляется. И еще как сделать что бы при удалении символов из поля поиска до 0 скрипт не выполнялся, а то быстро удалишь и запрос все равно выполняется. Заранее благодарен! |
Оператор LIKE использует символы _ и % как спецсимволы, и если таковые будут в запросе, оператор может выдать некорректный результат. И слеши используемые в выражении для поиска нужно удваивать. Поэтому данные для LIKE нужно предварительно обработать:
array('like','%'.addCslashes(trim($_GET['q']), '\%_').'%')),$n,$member_list); В плане нагрузки на базу - так ваш код, это живой поиск, иначе бы просто SELECT по полю индексированному. как сделать запуск функции только когда пользователь ввел последнюю букву А какой считать последнюю, разве можно на это ответить однозначно? Можно по таймеру определять - нет определенного времени нажатий, значит запрос. Можно и через N введенных символов делать запрос, но в этом случае, если введено меньшее количество, то запроса вообще не будет. И еще как сделать что бы при удалении символов из поля поиска до 0 скрипт не выполнялся Это проще - длину строки проверять. |
Цитата:
|
Подсмотрел тут http://javascript.ru/forum/dom-windo...nazhatijj.html и сделал так:
function searchGo(query) { var obj_search_user_list = $("#search_user_list"); var ajaxurl = CHAT_SITE_URL+'/index.php?act=web_chat&op=search_friend&n=99&f_id='+user['u_id']+'&q='+query; $.ajax({ type: "GET", url: ajaxurl, dataType:"jsonp", async: false, cache: false, success: function(friend_list){ obj_search_user_list.empty(); $("#search_button").empty(); $("#search_button").prepend('<div class="clear-search"></div>'); for (var u_id in friend_list){ var class_html = 'offline'; if ( user_list[u_id]['online'] > 0 ) class_html = 'online'; obj_search_user_list.prepend('<li class="user" select_u_id="'+u_id+'" onclick="show_message('+u_id+');"><i class="'+class_html+'"></i><span class="user-avatar avatar-'+user_list[u_id]['online']+'" title="'+user_list[u_id]['u_name']+'"><img alt="'+user_list[u_id]['u_name']+'" src="'+user_list[u_id]['avatar']+'"></span><span class="user-name" title="'+user_list[u_id]['u_name']+'">'+user_list[u_id]['u_name']+'<em></em></span><em unread_id="'+u_id+'" class=""></em></li>'); } }, complete: function() { $("#user_list").hide(); obj_search_user_list.show(); //getconnect(); $(".loading-search").remove(); $(".scroll_bar").customScrollbar("resize", true); } }); return false; } var ajax_timeout; function friend_search(query) { if(query.length == 0) { window.clearTimeout(ajax_timeout); $("#search_user_list").hide(); $("#user_list").show(); $("#search_button").empty(); $("#search_button").prepend('<i class="icon-search cursor-hand" onclick="$(".friend-search").focus();"></i>'); obj.find('#user_list > .select_user').prependTo($('#user_list')); $(".scroll_bar").customScrollbar("resize", true); show_chat(); return false; } else { $("#search_button").empty(); $("#search_button").prepend("<div class='loading-search'></div>"); window.clearTimeout(ajax_timeout); ajax_timeout = setTimeout(function() { searchGo (query); },500); } } Теперь при быстром наборе отправляется один запрос. При удалении не выполняется ни одного. |
По поводу этого кода подскажите подробнее как улучшить, а то я что то не понял:
public function search_friendOp() { $model_chat = Model('web_chat'); $f_id = intval($_GET['f_id']); $n = intval($_GET['n']); $member_list = $model_chat->getFriendList(array('friend_frommid'=> $f_id, 'friend_tomname' => array('like','%'.trim($_GET['q']).'%')),$n,$member_list); $this->json($member_list); } |
Да нечего в ней улучшать, про LIKE я говорил, единственное что бы сделал, так это выбросил определения совсем не нужных промежуточных переменных, и написал бы так:
public function search_friendOp() { $model_chat = Model('web_chat'); $member_list = $model_chat->getFriendList(array('friend_frommid'=> (int)$_GET['f_id'], 'friend_tomname' =>array('like','%'.addCslashes(trim($_GET['q']), '\%_').'%')),(int)$_GET['n'],$member_list); $this->json($member_list); } А если скрипт работает под РНР 5.4 или выше, не array(), а []. |
Цитата:
|
Да, если у вас 5.4 или выше, в ней слава богу стало доступно объявлять массивы также просто как и в JS - []. Есть и другие мелкие, но давно желаемые штучки, которые позволяют не писать лишнего совсем не нужного.
|
Часовой пояс GMT +3, время: 13:03. |