Javascript 替换DOM节点内容。为什么是';node.nodeValue=原始切片(0,hits.index)';用过吗?能快点吗?

Javascript 替换DOM节点内容。为什么是';node.nodeValue=原始切片(0,hits.index)';用过吗?能快点吗?,javascript,html,dom,Javascript,Html,Dom,我搜索并找到了许多有用的线索,但这种方法对我来说最有希望。这里是到的链接。我想让它快一点,因为我有时要更换很多东西。但是在这段代码中,我不理解作者为什么要在函数“handleResult”中这样做:node.nodeValue=orig.slice(0,hits.index)。每次命中后,他都会将节点的一部分切掉。如果您有“word”,则他将替换最后一个单词并返回“word”,然后替换第二个单词并返回“word”,替换并返回“”。例如,如果我有'word2 word',我首先替换'word',那

我搜索并找到了许多有用的线索,但这种方法对我来说最有希望。这里是到的链接。我想让它快一点,因为我有时要更换很多东西。但是在这段代码中,我不理解作者为什么要在函数“handleResult”中这样做:
node.nodeValue=orig.slice(0,hits.index)。每次命中后,他都会将节点的一部分切掉。如果您有“word”,则他将替换最后一个单词并返回“word”,然后替换第二个单词并返回“word”,替换并返回“”。例如,如果我有'word2 word',我首先替换'word',那么'word2'就不能被替换,因为节点部分已经被切掉了。所以我需要在每个单词之后运行
var textNodes=findAllTextNodes(document.body)我认为这需要很多时间。我的问题是,有没有一种方法可以使用jQuery的“replaceAll”之类的东西,但不能使用jQuery,因为它将字符串作为“html”代码处理,我不想将可能写入
something
的文本转换为实际运行的文本,如本例所示。我希望能够向您展示此代码并与您讨论

我的第二个问题是,是否有可能使这段代码以某种方式异步运行。我的问题是,更换后,我需要运行一些其他的东西,这些东西取决于更换。但是,如果将替换设置为异步,那么其他代码将在替换完成之前运行。有什么解决办法

function findAllTextNodes(n){
  var walker = n.ownerDocument.createTreeWalker(n,NodeFilter.SHOW_TEXT);
  var textNodes = [];
  while (walker.nextNode())
    if (walker.currentNode.parentNode.tagName!='SCRIPT')
      textNodes.push(walker.currentNode);
  return textNodes;
}

function textNodeReplace(node,regex,handler) {
  var mom=node.parentNode, nxt=node.nextSibling,
      doc=node.ownerDocument, hits;
  if (regex.global) {
    while(node && (hits=regex.exec(node.nodeValue))){
      regex.lastIndex = 0;
      node=handleResult( node, hits, handler.apply(this,hits) );
    }
  } else if (hits=regex.exec(node.nodeValue))
    handleResult( node, hits, handler.apply(this,hits) );

  function handleResult(node,hits,results){
    var orig = node.nodeValue;
    node.nodeValue = orig.slice(0,hits.index);
    [].concat(create(mom,results)).forEach(function(n){
      mom.insertBefore(n,nxt);
    });
    var rest = orig.slice(hits.index+hits[0].length);
    return rest && mom.insertBefore(doc.createTextNode(rest),nxt);
  }

  function create(el,o){
    if (o.map) return o.map(function(v){ return create(el,v) });
    else if (typeof o==='object') {
      var e = doc.createElementNS(o.namespaceURI || el.namespaceURI,o.name);
      if (o.attrs) for (var a in o.attrs) e.setAttribute(a,o.attrs[a]);
      if (o.content) [].concat(create(e,o.content)).forEach(e.appendChild,e);
      return e;
    } else return doc.createTextNode(o+"");
  }
}