Итак, в статье о том как настроить opensearch, я упомянула, о том, что поисковые подсказки в формате json можно использовать и на сайте. Давайте посмотрим как это сделать.
Для начала, вам нужен Jquery, писать всё на native js очень долго, а вам потребуются всяческие селекторы и анимации.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
Для того, чтобы у какого-то текстового поля отслеживать когда в нём печатают, а когда нет - неплохо использовать следующий код:
//подготовка перед функциями
var typingTimer; //таймер
var doneTypingInterval = 1000; //время в мс, 1 секунда для примера
//когда клавиша поднята, начинаем отсчёт
$('#myInput').keyup(function(){
typingTimer = setTimeout(doneTyping, doneTypingInterval);
});
//когда клавиша нажата, сбрасываем счётчик
$('#myInput').keydown(function(){
clearTimeout(typingTimer);
});
//пользователь "закончил печатать" обрабатываем
function doneTyping () {
//do something
}
Яндекс в качестве задержки использует число 42, я последовала его примеру =).
Мой друг попросил, чтобы подсказки изчезали, если кликнуть где-то на странице. (и снова появлялись если кликнуть по ним). Событие при клике event.stopPropagation(); - позволяет не передавать уведомление о том что произошёл клик от дочерних элементов родительским. Иначе документ всегда будет обрабатывать событие onclick
$('html').click(function(){
$('#search_suggestion').hide();
});
$('#search_suggestion').click(function(event){
if(suggest_count)
$('#search_suggestion').show();
event.stopPropagation();
});
Чтобы спозиционировать список с подсказками возле поле ввода, я использую функцию, для определения его координат.
function getDim(el){
for (var lx=0,ly=0;el!=null;
lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
return {x:lx,y:ly}
}
Используя эти координаты, вы легко можете создать список в нужном месте.
if(document.getElementById('search_suggestion')==null){
pa=document.getElementById('opensearch_input');
rr=getDim(pa);
var pos_left = rr.x;
var pos_top = (rr.y + pa.offsetHeight);
$('<ul id="search_suggestion"></ul>').appendTo('body').css({'display':'none', 'position':'absolute', 'left':pos_left, 'top':Math.ceil(pos_top)});
}
Чтобы при загрузке страницы курсор ввода текста сразу стоял в поле быстрого поиска - вам нужно в обработке $(window).load(function() использовать следующие функции:
$(window).load(function(){
$("#opensearch_input").focus();
$("#opensearch_input").select();
...
Чтобы загрузить данные в формате JSON удобно вместо функций $.get или $.load использовать функцию $.getJSON
function doneTyping (){
$.getJSON(search_suggestion_url+$("#opensearch_input").attr("value"), show_suggestion);
}
Ваш скрипт подсказок opensearch, может передать данные содержащие теги, кавычки и т.п., чтобы сделать это, вероятно, будет использоваться htmlspecialchars в php. Чтобы отобразить текст в нужном виде, вам понадобиться обратная функция
function unhtml(s){
return s.toString().replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&').replace(/"/g, '"');
}
Ну, и наконец пользователю будет приятно перемещаться по подсказкам с помощью стрелочек клавиатуры. Для того чтобы отследить нажатия клавиш, вы должны в обработчике $("#opensearch_input").keydown(function(I) - проверять значения 38 (стрелочка вниз) и 40 (стрелочка вверх). Программисты из яндекса (на странице http://ya.ru) использовали следующую проверку
switch(I.keyCode) {
case 18:case 9: break;
case 38:case 40:
I.preventDefault();
if(suggest_count)
key_activate(I.keyCode-39)
...
}
тогда функция key_activate будет содержать в качестве параметра -1 (стрелка вверх) или 1 (стрелка вниз).
Вы также можете обрабатывать значения 13 - Enter, 27 - Escape, и другие. Не забудьте ещё добавить вашей формы стили ссылкам при наведении мыши и т.п.
Надеюсь эта статья вам сильно сэкономит время, или просто будет полезна для изучения =)


Комментарии:
RockField (Philipp)
22.01.2013 01:29:40
RockField (Philipp)
22.01.2013 01:31:48
Елена Лунная
20.02.2013 00:44:55