Reputation: 13542
I have a list of keywords and then a list of sentences containing those keywords on a page. I'd like to make the keyword list clickable. When a user clicks on a keyword, all occurrences of that keyword would highlight in the sentences.
How can I do this with jQuery or raw Javascript?
The only way I can think is to wrap every word on the page with a class containing itself as the class name. Then make the keywords buttons that add a highlight class to the matching word classes. This may work, but seems like a LOT of unnecessary code injection.
List of Keywords
<button>this</button>
<button>example</button>
Sentences
<span class='word_this'>This</span> <span class='word_is'>is</span> <span class='word_an'>an</span> <span class='word_example'>example</span>.
Upvotes: 7
Views: 17208
Reputation: 36541
The best way is probably to use a .highlight
class to highlight the words and just wrap the matches in a span with that highlight class. Here is a basic example:
var sentences = document.querySelector('#sentences');
var keywords = document.querySelector('#keywords');
keywords.addEventListener('click', function(event){
var target = event.target;
var text = sentences.textContent;
var regex = new RegExp('('+target.textContent+')', 'ig');
text = text.replace(regex, '<span class="highlight">$1</span>');
sentences.innerHTML = text;
}, false);
.highlight {
background-color: yellow;
}
<div id="keywords">
<span>This</span>
<span>Example</span>.
</div>
<div id="sentences">
This is an example. An example is shown in this. Here is another example.
</div>
Fiddle: https://jsfiddle.net/xukay3hf/3/
Updated Fiddle which leaves existing word highlighting: https://jsfiddle.net/avpLn7bf/3/
Upvotes: 11
Reputation: 47968
You can wrap words with a specific class only when included in the search result. The wrapping will be removed the next time the word is not part of the search result:
var highlightRe = /<span class="highlight">(.*?)<\/span>/g,
highlightHtml = '<span class="highlight">$1</span>';
$(function() {
$('#search').change(function() {
var term = $(this).val();
var txt = $('#txt').html().replace(highlightRe,'$1');
if(term !== '') {
txt = txt.replace(new RegExp('(' + term + ')', 'gi'), highlightHtml);
}
$('#txt').html(txt);
});
});
.highlight {
background-color: yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type="text" id="search"/>
<div id="txt">
I have a list of keywords and then a list of sentences containing those keywords on a page. I'd like to make the keyword list clickable. When a user clicks on a keyword, all occurrences of that keyword would highlight in the sentences.
How can I do this with jQuery or raw Javascript?
The only way I can think is to wrap every word on the page with a class containing itself as the class name. Then make the keywords buttons that add a highlight class to the matching word classes. This may work, but seems like a LOT of unnecessary code injection.
</div>
Upvotes: 8
Reputation: 1865
The glossarizer plug-in will do this. You put your sentences into a JSON file and each occurrence is given a dotted underline and acts as a tooltip. Set the replaceOnce
parameter to false
for each occurrence to be highlighted. You can change the js file to customize the appearance, and add any heading tags containing the words, since normally people don't want those highlighted.
Upvotes: 1