Поиск текста на странице при помощи Jquery

Техника которая будет рассмотрена в данной статье позволит лучше показать сложный контент, позволит пользователю найти информацию намного быстрее, а также сильно отразится на юзабилити сайта.

[mantra-button-light url="http://pontyk.com.ua/wp-content/uploads/2012/08/highlight"]Demo урока[/mantra-button-light] [mantra-button-dark url="http://pontyk.com.ua/wp-content/uploads/2012/08/highlight.zip"]Скачать урок[/mantra-button-dark]

Стоит отметить, что все веб сайты очень часто позволяют пользователям совершать поиск по их это категориям, статьям, записям и т.д., но в основном это поиск по БД. Но когда нибудь мы задумывались над тем, что мы можем совершать по странице, продвинутые пользователи могут сказать: «Просто нажать CTRL + F!». Но а если я не знаю комбинации клавишь, или ваш пользователь только научился пользоваться браузером, бывает и такое, что тогда, пускай учит комбинации? Нет! Можно облегчить жизнь пользователю, и добавить форму поиска по содержимому сайта, и при вводе текста в данную форму, на странице ему просто подсвечивается набираемый им текст, просто, не правда ли?

Hазметки и взаимодействие с DOM

Для этого понадобиться обыкновенный input с указаным id:

<input type="text" id="text-search" />

Далее прицепить обработчики события keyUp и change на форму ввода:

$(function() {
    $('#text-search').bind('keyup change', function(ev) {
        // вставка нового искомого значения
        var searchTerm = $(this).val();
    )};
});

Эти обработчики гарантируют нам, что текст будет искаться в случае ввода текста в поле, или нажатии кнопки ctrl + v.

Теперь давайте подключим плагин подсвечивания на страницу. Его можно взять с сайта разработчика Highlight или скачать отсюда

После подключения, нужно немного модернизировать функцию для подсветки искомого материала.

$(function() {
    $('#text-search').bind('keyup change', function(ev) {
        // вставка нового искомого значения
        var searchTerm = $(this).val();
        // отключить подсвечивание, если переменная посиска пуста
        if ( searchTerm ) {
            // подсветить, если введено новое слово или значение
            $('body').highlight( searchTerm );
        }
    });
});

В этой конструкции мы проверяем, чтобы было введено искомое слово

 if ( searchTerm ) 

Здесь указываем область поиска, вместо body можно использовать .className и #id

 $('body').highlight( searchTerm ); 

Стилизация подсветки

После того как все размечено, и подключена обработка событий(взаимодействие с dom), нужно все красиво оформить.

Плагин подсветки(Highlight) для подсветки оборачивает искомое значение в , ну вот этот highlight класс над и нужно стилизовать при помощи CSS.

.highlight {
    background-color: #fff34d;
    -moz-border-radius: 5px; /* FF1+ */
    -webkit-border-radius: 5px; /* Saf3-4 */
    border-radius: 5px; /* Opera 10.5, IE 9, Saf5, Chrome */
    -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.7); /* FF3.5+ */
    -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.7); /* Saf3.0+, Chrome */
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.7); /* Opera 10.5+, IE 9.0 */
    padding:1px 4px;
    margin:0 -4px;
}

Завершение взаимодействия

Последнее не самое немаловажное, удаление любого старого подсвеченного значения.

$(function() {
    $('#text-search').bind('keyup change', function(ev) {
        // вставка нового искомого значения
        var searchTerm = $(this).val();

        // удаление любого старого подсвеченного значения
        $('body').removeHighlight();
        // отключить подсвечивание, если переменная посиска пуста
        if ( searchTerm ) {
            // подсветить, если введено новое слово или значение
            $('body').highlight( searchTerm );
        }
    });
});

Здесь просто добавилась функция removeHighlight () которая и совершает удаления подсветки.
Эта функция работает в большинстве браузеров, но есть небольшое исключение, этим исключением является IE6. ( В принцепе вы можете и не фиксить эту проблему, но а вдруг если у вашего пользователя будет IE6 😉 ).

В общем просто замените код плагина со строки 45 до 53 и будет вам счастье 😉

jQuery.fn.removeHighlight = function() {
 function newNormalize(node) {
    for (var i = 0, children = node.childNodes, nodeCount = children.length; i < nodeCount; i++) {
        var child = children[i];
        if (child.nodeType == 1) {
            newNormalize(child);
            continue;
        }
        if (child.nodeType != 3) { continue; }
        var next = child.nextSibling;
        if (next == null || next.nodeType != 3) { continue; }
        var combined_text = child.nodeValue + next.nodeValue;
        new_node = node.ownerDocument.createTextNode(combined_text);
        node.insertBefore(new_node, child);
        node.removeChild(child);
        node.removeChild(next);
        i--;
        nodeCount--;
    }
 }
 return this.find("span.highlight").each(function() {
    var thisParent = this.parentNode;
    thisParent.replaceChild(this.firstChild, this);
    newNormalize(thisParent);
 }).end();
};

[mantra-button-light url="http://pontyk.com.ua/wp-content/uploads/2012/08/highlight"]Demo урока[/mantra-button-light]        [mantra-button-dark url="http://pontyk.com.ua/wp-content/uploads/2012/08/highlight.zip"]Скачать урок[/mantra-button-dark]