我需要用跨度替换每个具有同级的#text,以使它们具有ids。下面的代码应该这样做,但由于某种原因它会导致许多文档重新塑造:文档的部分移动,页面会改变其外观。用跨度替换#text元素会导致文档重新塑造
var eltId = 0;
function genEltId() {
return "my-id-" + ++eltId;
}
function hashTextsToSpans(elt) {
for (var i in elt.childNodes) {
var eltChild = elt.childNodes[i];
if (eltChild.nodeName == "#text" && elt.childNodes.length > 1) {
// #text is one of multiple childs
var eltDiv = document.createElement("span");
eltDiv.setAttribute("id", genEltId());
elt.replaceChild(eltDiv, eltChild);
eltDiv.appendChild(eltChild);
} else {
if (eltChild.nodeName != "IFRAME") {
hashTextsToSpans(eltChild);
}
}
}
}
function onKeyPress(e) {
if (e.keyCode == 105) {
// key I
hashTextsToSpans(document.body);
}
}
window.parent.addEventListener("keypress", onKeyPress);
例如,(用“CJS”插件)注入它铬成https://en.wikipedia.org/wiki/Linux,按“i”的,并且观察到页面重塑。
什么问题?是否#text并跨越两个内联元素,并且在文本相同且跨度没有样式时应以相同的方式显示?
假设:没有iframe元素,没有其他JavaScript同时操作DOM树。
你使用任何CSS框架? – doge1ord
没有框架,我正在注入js到维基百科作为一个例子“cjs”插件。 –
不是一个答案,但你可能想看看['TreeWalker' API](https://developer.mozilla.org/en-US/docs/Web/API/TreeWalker),它可以在所有现代浏览器中使用并使这个任务更容易编码和维护。 – rvighne