要处理AJAX内容,可以使用
MutationObservers或使用计时器进行轮询。前者会变得棘手和复杂,而计时器则简单,健壮,并且对于大多数实际应用都适用。
要处理类似的属性
placeholder,只需使用
document.querySelectorAll("[placeholder]")获取节点并遍历生成的NodeList即可 。
当您使用它时,您可能还需要转换
title属性。
简而言之:
- 将替换代码放入函数中。
- 在中调用该函数
setInterval
。 - 在间隔内,为要更改的属性添加一个单独的循环。
放在一起,跨浏览器用户脚本将如下所示。查看内联注释,
您可以 针对 此jsFiddle页面测试脚本。
// ==Userscript==// @name Replace lots of terms on an AJAX'd page// @include http://fiddle.jshell.net/Hp6K2/show var txtWalker = document.createTreeWalker ( document.body, NodeFilter.SHOW_TEXT, { acceptNode: function (node) { //-- Skip whitespace-only nodes if (node.nodevalue.trim() ) { if (node.tmWasProcessed) return NodeFilter.FILTER_SKIP; else return NodeFilter.FILTER_ACCEPT; } return NodeFilter.FILTER_SKIP; } }, false ); var txtNode = null; while (txtNode = txtWalker.nextNode () ) { txtNode.nodevalue = replaceAllTerms (txtNode.nodevalue); txtNode.tmWasProcessed = true; } // //--- Now replace user-visible attributes. // var placeholderNodes = document.querySelectorAll ("[placeholder]"); replaceManyAttributeTexts (placeholderNodes, "placeholder"); var titleNodes = document.querySelectorAll ("[title]"); replaceManyAttributeTexts (titleNodes, "title");}function replaceAllTerms (oldTxt) { for (var J = 0; J < numTerms; J++) { oldTxt = oldTxt.replace (replaceArry[J][0], replaceArry[J][1]); } return oldTxt;}function replaceManyAttributeTexts (nodeList, attributeName) { for (var J = nodeList.length - 1; J >= 0; --J) { var node = nodeList[J]; var oldText = node.getAttribute (attributeName); if (oldText) { oldText = replaceAllTerms (oldText); node.setAttribute (attributeName, oldText); } else throw "attributeName does not match nodeList in replaceManyAttributeTexts"; }}


