diff --git a/readme.md b/readme.md index 2eb0bef..43195ba 100644 --- a/readme.md +++ b/readme.md @@ -62,4 +62,5 @@ findAndReplaceDOMText(/foo/g, myElement, span); ### Changelog -0.1: Initial commit + Fix for IE's broken HTML5 cloneNode ([pull request](https://github.com/padolsey/findAndReplaceDOMText/pull/3)) \ No newline at end of file +0.1: Initial commit + Fix for IE's broken HTML5 cloneNode ([pull request](https://github.com/padolsey/findAndReplaceDOMText/pull/3)) +0.11: Minor fix: Make sure replacement node function is called in order of matches (see [issue #4](https://github.com/padolsey/findAndReplaceDOMText/issues/4)) \ No newline at end of file diff --git a/src/findAndReplaceDOMText.js b/src/findAndReplaceDOMText.js index f9f0840..359eef1 100644 --- a/src/findAndReplaceDOMText.js +++ b/src/findAndReplaceDOMText.js @@ -1,5 +1,5 @@ /** - * findAndReplaceDOMText v 0.1 + * findAndReplaceDOMText v 0.11 * @author James Padolsey http://james.padolsey.com * @license http://unlicense.org/UNLICENSE * @@ -205,9 +205,8 @@ window.findAndReplaceDOMText = (function() { var before = document.createTextNode(node.data.substring(0, range.startNodeIndex)); node.parentNode.insertBefore(before, node); } + // Create the replacement node: - // var el = stencilNode.cloneNode(false); - //el.appendChild(document.createTextNode(range.match[0])); var el = makeReplacementNode(range.match[0], matchIndex); node.parentNode.insertBefore(el, node); if (range.endNodeIndex < node.length) { @@ -224,25 +223,24 @@ window.findAndReplaceDOMText = (function() { }); return el; } else { - // B4 - innerNodes - After + // Replace startNode -> [innerNodes...] -> endNode (in that order) var before = document.createTextNode(startNode.data.substring(0, range.startNodeIndex)); var after = document.createTextNode(endNode.data.substring(range.endNodeIndex)); var elA = makeReplacementNode(startNode.data.substring(range.startNodeIndex), matchIndex); - var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex); var innerEls = []; - //elA.appendChild(document.createTextNode()); - startNode.parentNode.insertBefore(before, startNode); - startNode.parentNode.insertBefore(elA, startNode); - startNode.parentNode.removeChild(startNode); - endNode.parentNode.insertBefore(elB, endNode); - endNode.parentNode.insertBefore(after, endNode); - endNode.parentNode.removeChild(endNode); for (var i = 0, l = range.innerNodes.length; i < l; ++i) { var innerNode = range.innerNodes[i]; var innerEl = makeReplacementNode(innerNode.data, matchIndex); innerNode.parentNode.replaceChild(innerEl, innerNode); innerEls.push(innerEl); } + var elB = makeReplacementNode(endNode.data.substring(0, range.endNodeIndex), matchIndex); + startNode.parentNode.insertBefore(before, startNode); + startNode.parentNode.insertBefore(elA, startNode); + startNode.parentNode.removeChild(startNode); + endNode.parentNode.insertBefore(elB, endNode); + endNode.parentNode.insertBefore(after, endNode); + endNode.parentNode.removeChild(endNode); reverts.push(function() { innerEls.unshift(elA); innerEls.push(elB); diff --git a/test/test.js b/test/test.js index b234087..22bb616 100644 --- a/test/test.js +++ b/test/test.js @@ -90,4 +90,20 @@ test('Custom replacement function', function() { return e; }); htmlEqual(d.innerHTML, '1_2_3_4_'); +}); + +test('Custom replacement function - correct ordering', function() { + var d = document.createElement('div'); + var nCalled = 0; + d.innerHTML = 'testing123'; + findAndReplaceDOMText(/testing[0-9]+/g, d, function(fill) { + switch (nCalled++) { + case 0: equal(fill, 'test'); break; + case 1: equal(fill, 'ing'); break; + case 2: equal(fill, '123'); break; + default: ok(false, 'Not expecting further matches'); + } + return document.createTextNode(fill); + }); + equal(nCalled, 3); }); \ No newline at end of file