我需要用跨度替換每個具有同級的#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