Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.07.2013, 11:58
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

Поиск по странице с помощью jQuery highlight plugin — поиск и подсветка слов в тексте
источник jQuery highlight — подсветка слов в тексте или HTML и здесь на форуме Поиск в тексте

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

Параметры (settings)
Параметры являются необязательными, заданы значения по умолчанию.

className — имя класса, которое проставляется элементу span, с помощью которого выделяются искомые слова.
По умолчанию — highlight
caseSensitive — зависит от регистра или нет.
По умолчанию — false, т.е. если передана строка «тест», в тексте будет выделено в том числе слово «ТЕСТ».
split — разделитель между словами.
По умолчанию — "\\s+" (пробел/пробелы), т.е. если передана строка «слово1 слово2″, будут выделены и «слово1″ и «слово2″.
strictly — искать точное совпадение с 'образцом'
По умолчанию — false, т.е. выделит полностью слово, а не часть его.
remove — убирать предыдущее выделение.
По умолчанию — true.
чтобы убрать выделение ввести только пробел/ы
<!DOCTYPE html>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <script src="https://code.jquery.com/jquery-1.9.1.js"></script>
  <script>
 $.fn.highlight = function (b, k) {
     function l() {
         $("." + c.className).each(function (c, e) {
             var a = e.previousSibling,
                 d = e.nextSibling,
                 b = $(e),
                 f = "";
             a && 3 == a.nodeType && (f += a.data, a.parentNode.removeChild(a));
             e.firstChild && (f += e.firstChild.data);
             d && 3 == d.nodeType && (f += d.data, d.parentNode.removeChild(d));
             b.replaceWith(f)
         })
     }

     function h(b) {
         b = b.childNodes;
         for (var e = b.length, a; a = b[--e];)
             if (3 == a.nodeType) {
                 if (!/^\s+$/.test(a.data)) {
                     var d = a.data,
                         d = d.replace(m, '<span class="' + c.className + '">$1</span>');
                     $(a).replaceWith(d)
                 }
             } else 1 == a.nodeType && a.childNodes && (!/(script|style)/i.test(a.tagName) && a.className != c.className) && h(a)
     }
     var c = {
         split: "\\s+",
         className: "highlight",
         caseSensitive: !1,
         strictly: !1,
         remove: !0
     }, c = $.extend(c, k);
     c.remove && l();
     b = $.trim(b);
     var g = c.strictly ? "" : "\\S*",
         m = RegExp("(" + g + b.replace(RegExp(c.split, "g"), g + "|" + g) + g + ")", (c.caseSensitive ? "" : "i") + "g");
     return this.each(function () {
         b && h(this)
     })
 };
 $(function () {
 $('#scan').click(function () {
        var settings = {};
        var pattern = $('#pattern').val();
        $("#right").prop("checked") && (settings.strictly = true);
        $("#case").prop("checked") && (settings.caseSensitive = true);
        $("#remove").prop("checked") && (settings.remove = false);
        pattern && $("div").highlight(pattern, settings)
    })
 })

 </script>
  <style type="text/css">
   body{
     background-color: #FFFF42;
   }

span.highlight {
    color: #FFFFFF;
    padding:0px 12px 2px;
	background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#0000CD), to(#DBDBFF));
    background: -webkit-linear-gradient(left, #0000CD, #DBDBFF);
    background: -moz-linear-gradient(left, #0000CD, #DBDBFF);
    background: -o-linear-gradient(left, #0000CD, #DBDBFF);
    background: -ms-linear-gradient(left, #0000CD, #DBDBFF);
    background: linear-gradient(left, #0000CD, #DBDBFF);
    background-color: #0000CD;
	-webkit-border-radius: 15px;
    -moz-border-radius: 15px;
    -o-border-radius: 15px;
    -ms-border-radius: 15px;
    border-radius: 15px;


    }  </style>
</head>

<body>
  <div >
    Вот только как организовать этот код ума не приложу)
    Я мог бы взять и изменить допустим цвет всего абзаца
    с указанным ID или еще какие то свойства целого
    элемента. Но как взять и изменить отдельное слово
    ума не приложу, по сути мне только этот момент и
    нужно объяснить желательно на примере и с
    коментариями. У меня цель не просто скопировать
    готовый скрипт но еще и разобраться в нем что бы в
    будущем таких вопросов не возникало. Вот объясните
    мне как взять и организовать поиск слова на ВСЕЙ
    странице и что бы после нахождения тут же
    обратиться к свойству данной строки и изменить ее
    цвет. Как я понял функция match() по идеи должна
    заниматься поиском совпадений в строке но как при
    этом цвет поменять? С этим я окончательно запутался.
  </div>

  <form>
    <input id="pattern" name="" value="вот     поиск слов"><label> слова через пробел|ы</label><br>
    <input id="right" name="" type="checkbox"><label>точное совпадение</label><br>
    <input id="case" name="" type="checkbox"><label>зависит от регистра</label><br>
    <input id="remove" name="" type="checkbox"><label>не убирать предыдущее выделение</label><br>
    <input id="scan" name="" type="button" value="scan">
  </form>
</body>
</html>

Последний раз редактировалось рони, 27.11.2020 в 14:30.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery contextMenu plugin и IE 6 xber9 jQuery 1 12.11.2012 07:37
jQuery plugIn Nightmare jQuery 6 18.09.2011 16:26
jQuery Cycle Plugin - position: absolute; brabuz jQuery 1 26.08.2011 15:56
jQuery jTreeMenu plugin Seafnox jQuery 9 12.01.2010 21:55
Замена слов в тексте Dan T Общие вопросы Javascript 8 18.03.2009 12:36