JavaScript для добавления тегов HTML вокруг контента - PullRequest
2 голосов
/ 19 мая 2009

Мне было интересно, можно ли использовать JavaScript для добавления тега

вокруг слова на странице HTML.

У меня есть поиск JS, который ищет набор файлов HTML и возвращает список файлов, которые содержат ключевое слово. Я хотел бы иметь возможность динамически добавлять

вокруг ключевого слова, чтобы оно выделялось.

Если выполняется альтернативный поиск, необходимо удалить исходные

и добавить новые. Кто-нибудь знает, возможно ли это вообще?

Любые советы или предложения будут очень признательны.

Приветствия

Laurie.

Ответы [ 4 ]

3 голосов
/ 19 мая 2009

В общем случае вам потребуется проанализировать HTML-код, чтобы убедиться, что вы выделяете только ключевые слова, а не невидимый текст или код (например, атрибуты alt text для изображений или фактическую разметку). Если вы делаете так, как предложил Джесси Халлетт :

$('body').html($('body').html().replace(/(pretzel)/gi, '<b>$1</b>'));

У вас возникнут проблемы с определенными ключевыми словами и документами. Например:

<html>
<head><title>A history of tables and tableware</title></head>
<body>
<p>The table has a fantastic history.  Consider the following:</p>
<table><tr><td>Year</td><td>Number of tables made</td></tr>
<tr><td>1999</td><td>12</td></tr>
<tr><td>2009</td><td>14</td></tr>
</table>
<img src="/images/a_grand_table.jpg" alt="A grand table from designer John Tableius">
</body>
</html>

Этот относительно простой документ можно найти, выполнив поиск по слову «таблица», но если вы просто замените текст перенесенным текстом, вы можете получить следующее:

<<span class="highlight">table</span>><tr><td>Year</td><td>Number of <span class="highlight">table</span>s made</td></tr>

и это:

<img src="/images/a_grand_<span class="highlight">table</span>.jpg" alt="A grand <span class="highlight">table</span> from designer John <span class="highlight">Table</span>ius">

Это означает, что вам нужно разобрать HTML. И разбирать HTML сложно. Но если вы можете принять на себя определенный контроль качества HTML-документов (т.е. без открытых угловых скобок без закрывающих угловых скобок и т. Д.), То вы сможете сканировать текст в поисках данных без тегов, без атрибутов, которые можно дальше-размеченный.

Вот некоторый Javascript, который может это сделать:

function highlight(word, text) {
  var result = '';

  //char currentChar;
  var csc; // current search char
  var wordPos = 0;
  var textPos = 0;
  var partialMatch = ''; // container for partial match

  var inTag = false;

  // iterate over the characters in the array
  // if we find an HTML element, ignore the element and its attributes.
  // otherwise try to match the characters to the characters in the word
  // if we find a match append the highlight text, then the word, then the close-highlight
  // otherwise, just append whatever we find.

  for (textPos = 0; textPos < text.length; textPos++) {
    csc = text.charAt(textPos);
    if (csc == '<') {
      inTag = true;
      result += partialMatch;
      partialMatch = '';
      wordPos = 0;
    }
    if (inTag) {
      result += csc ;
    } else {
      var currentChar = word.charAt(wordPos);
      if (csc == currentChar && textPos + (word.length - wordPos) <= text.length) {
        // we are matching the current word
        partialMatch += csc;
        wordPos++;
        if (wordPos == word.length) {
          // we've matched the whole word
          result += '<span class="highlight">';
          result += partialMatch;
          result += '</span>';
          wordPos = 0;
          partialMatch = '';
        }
      } else if (wordPos > 0) {
        // we thought we had a match, but we don't, so append the partial match and move on
        result += partialMatch;
        result += csc;
        partialMatch = '';
        wordPos = 0;
      } else {
        result += csc;
      }
    }


    if (inTag && csc == '>') {
      inTag = false;
    }
  }
  return result;
}
0 голосов
/ 19 мая 2009

DOM API не предоставляет супер простой способ сделать это. Насколько я знаю, лучшим решением является чтение текста в JavaScript, используйте replace, чтобы внести необходимые изменения, и записать весь контент обратно. Вы можете сделать это либо по одному HTML-узлу за раз, либо изменить весь <body> сразу.

Вот как это может работать в jQuery:

$('body').html($('body').html().replace(/(pretzel)/gi, '<b>$1</b>'));
0 голосов
/ 19 мая 2009

не могли бы вы просто написать селектор как таковой, чтобы обернуть все это?

$("* :contains('foo')").wrap("<div class='bar'></div>");

Адам написал приведенный выше код для удаления:

$('div.bar').each(function(){ $(this).after( $(this).text() ); }).remove();

edit: если подумать, первый оператор возвращает элемент, который обернет элемент тегом div, а не единственным словом. может быть, замена регулярного выражения будет лучшим решением здесь.

0 голосов
/ 19 мая 2009

Упаковка довольно проста с jQuery :

$('span').wrap('<div class="highlight"></div>'); // wraps spans in a b tag

Затем, чтобы удалить, что-то вроде этого:

$('div.highlight').each(function(){ $(this).after( $(this).text() ); }).remove();

Звучит так, будто вам придется выполнить некоторое разбиение строк, поэтому перенос может не сработать, если вы не хотите предварительно заключить все слова в какой-либо тег (например, span).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...