3

I am using createNodeIterator to find words inside my document.

Actually I am using almost the exact example code from MDN and MSDN:

This works as expected in Chrome and Firefox.
Unfortunately Internet Explorer 11 just says Exception occurred. and stops once I call iterator.nextNode

Exception occurred.

Error Debugger

Codepen: https://codepen.io/anon/pen/PKmQEe?editors=1011

Code Example:

var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_TEXT, {
  acceptNode: function acceptNode(node) {
    if (node.parentNode.tagName.toLowerCase() === 'span') {
      return NodeFilter.FILTER_REJECT;
    }

    return NodeFilter.FILTER_ACCEPT;
  }
}, false);

var nextNode = void 0;
var nodes = [];
while (nextNode = iterator.nextNode()) {
  if (nextNode.nodeValue.indexOf('o') > -1) {
    nodes.push(nextNode);
  }
}

console.log(nodes.length);
nodes.forEach(function (node) {
  return node.nodeValue = node.nodeValue.replace('o', 'OO');
});
<p>Lorem</p>
<p>Ipsum</p>
<div><div><div><div><p>Etiam ipsum purus, elementum vitae congue id, scelerisque nec lectus. Sed at urna id nulla elementum rhoncus. Praesent aliquet turpis justo, blandit eleifend sem. In purus eros, commodo vel pretium non, blandit non elit. Mauris tristique velit in neque malesuada congue. Suspendisse luctus varius nisi quis dignissim. Proin magna urna, tristique et adipiscing ut, ultrices ut leo.</p></div><span>Dolor</span></div></div></div>

1 Answer 1

4

As written in createNodeIterator fails in IE9 when acceptNode is specified you must not pass an object for IE9 - IE11 but pass the function directly:

var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_TEXT, function acceptNode(node) {
    if (node.parentNode.tagName.toLowerCase() === 'span') {
      return NodeFilter.FILTER_REJECT;
    }

    return NodeFilter.FILTER_ACCEPT;
  }, false);

var nextNode = void 0;
var nodes = [];
while (nextNode = iterator.nextNode()) {
  if (nextNode.nodeValue.indexOf('o') > -1) {
    nodes.push(nextNode);
  }
}

console.log(nodes.length);
nodes.forEach(function (node) {
  return node.nodeValue = node.nodeValue.replace('o', 'OO');
});
<p>Lorem</p>
<p>Ipsum</p>
<div><div><div><div><p>Etiam ipsum purus, elementum vitae congue id, scelerisque nec lectus. Sed at urna id nulla elementum rhoncus. Praesent aliquet turpis justo, blandit eleifend sem. In purus eros, commodo vel pretium non, blandit non elit. Mauris tristique velit in neque malesuada congue. Suspendisse luctus varius nisi quis dignissim. Proin magna urna, tristique et adipiscing ut, ultrices ut leo.</p></div><span>Dolor</span></div></div></div>

1
  • man! this saved me a LOOOT of time. Even with TypeScript typings it says it wants Object, but for IE it needs Function!
    – Romko
    Commented Sep 5, 2018 at 19:15

Not the answer you're looking for? Browse other questions tagged or ask your own question.