Skip to content

Instantly share code, notes, and snippets.

@kkxlkkxllb
Created April 1, 2014 02:48
Show Gist options
  • Save kkxlkkxllb/9906762 to your computer and use it in GitHub Desktop.
Save kkxlkkxllb/9906762 to your computer and use it in GitHub Desktop.
var TextFind = {};
TextFind.visibleTextNodes = function(container){
var walker = document.createTreeWalker(
container,
NodeFilter.SHOW_ALL,
function(node) {
if (node.nodeType == 3) {
return NodeFilter.FILTER_ACCEPT;
} else if (node.offsetWidth && node.offsetHeight && node.style.visibility != 'hidden') {
return NodeFilter.FILTER_SKIP;
} else {
return NodeFilter.FILTER_REJECT;
}
},
false
);
for (var nodes = []; walker.nextNode();) {
nodes.push(walker.currentNode);
}
return nodes;
}
TextFind.highlight = function(needle, container){
needle = needle.replace(/\s/g, '').toLowerCase();
var textNodes = this.visibleTextNodes(container);
for (var i = 0, texts = []; i < textNodes.length; i++) {
// texts.push(textNodes[i].nodeValue.replace(/\s/g, '').toLowerCase());
texts.push(textNodes[i].nodeValue);
}
var matchStart = texts.join('').indexOf(needle);
if (matchStart < 0) {
return false;
}
var nodeAndOffsetAtPosition = function(position) {
for (var i = 0, consumed = 0; consumed + texts[i].length < position; i++) {
consumed += texts[i].length;
}
var whitespacePrefix = textNodes[i].nodeValue.match(/^\s*/)[0];
return [textNodes[i], position - consumed + whitespacePrefix.length];
};
var range = document.createRange();
range.setStart.apply(range, nodeAndOffsetAtPosition(matchStart));
range.setEnd.apply( range, nodeAndOffsetAtPosition(matchStart + needle.length));
window.getSelection().removeAllRanges();
window.getSelection().addRange(range);
range.startContainer.parentNode.scrollIntoView();
}
module.exports = TextFind;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment