Skip to content

Instantly share code, notes, and snippets.

@jcubic
Last active February 19, 2016 22:35
Show Gist options
  • Save jcubic/13cafec6da6b3b980df5 to your computer and use it in GitHub Desktop.
Save jcubic/13cafec6da6b3b980df5 to your computer and use it in GitHub Desktop.
findText function
function findText( rootElement, textToFind ) {
var walker = document.createTreeWalker( rootElement,
NodeFilter.SHOW_TEXT,
null,
false );
var texts = [],
nodes = [];
walker.firstChild();
nodes.push( walker.currentNode );
texts.push( walker.currentNode.textContent );
while ( walker.nextSibling() ) {
nodes.push( walker.currentNode );
texts.push( walker.currentNode.textContent );
}
var input = texts.join( '' ),
index = input.indexOf( textToFind ),
parts = [];
if ( index !== -1 ) {
var left = 0, start, end, startOffset, endOffset, begin,
textLeft = textToFind;
for ( var i = 0; i < texts.length; ++i ) {
left += texts[i].length;
if ( left > index && start === undefined ) {
start = i;
if ( start > 0 ) {
startOffset = index-texts.slice( 0, start ).join( '' ).length;
} else {
startOffset = index;
}
}
if ( left >= index + textToFind.length ) {
end = i;
if ( texts[start].length - startOffset >= textToFind.length ) {
endOffset = startOffset + textToFind.length;
} else {
var before = texts.slice( 0, start+1 ).join( '' ).length;
var reminder = input.substring( before, before+textToFind.length-(texts[start].length-startOffset) );
if ( end === start + 1 ) {
endOffset = reminder.length;
} else {
var s = 0;
for ( var j = start+1; j < end; ++j ) {
s += texts[j].length;
}
endOffset = reminder.substring(s).length;
}
}
break;
}
}
var range = document.createRange();
range.setStart( nodes[start], startOffset );
range.setEnd( nodes[end], endOffset );
return range;
}
}
@jcubic
Copy link
Author

jcubic commented Feb 19, 2016

usage:

var range = findText( document.querySelector( 'body' ), "search string" );
if ( range ) {
    var selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange( range );
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment