好的,所以 createTreeWalker 方法是正确的方法,它是一个好方法。不幸的是,我需要这样做来支持不支持 document.createTreeWalker 的 IE8。伤心的伊恩很伤心。
如果您想像顽皮的孩子一样使用非标准的 innerHTML 调用在页面文本上使用 .replace 来执行此操作,您需要小心,因为它会替换标签内的文本,导致 XSS 漏洞和一般破坏您的页面。
您需要做的只是替换标签之外的文本,我与之匹配:
var search_re = new RegExp("(?:>[^<]*)(" + stringToReplace + ")(?:[^>]*<)", "gi");
恶心,不是吗。您可能希望通过替换一些结果然后将其余结果保留在 setTimeout 调用中来缓解任何缓慢,如下所示:
// replace some chunk of stuff, the first section of your page works nicely
// if you happen to have that organization
//
setTimeout(function() { /* replace the rest */ }, 10);
它会在替换第一个块后立即返回,让您的页面继续其快乐的生活。对于您的替换调用,您还需要替换临时字符串中的大块
var tmp = element.innerHTML.replace(search_re, whatever);
/* more replace calls, maybe this is in a for loop, i don't know what you're doing */
element.innerHTML = tmp;
以尽量减少重排(当页面重新计算定位并重新渲染所有内容时)。对于大页面,除非您小心,否则这可能会很慢,因此需要优化指针。再一次,除非你绝对需要,否则不要这样做。使用 zetlen 在上面发布的 createTreeWalker 方法..