getElementsByTagName()
возвращает live NodeList. Поэтому, когда вы заменяете тег, индексы всех следующих элементов смещаются вниз, и код завершается сбоем, когда у вас есть более одного тега <strong>
в одном и том же абзаце. В результате некоторые теги будут пропущены.
Решение состоит в том, чтобы преобразовать NodeList
в массив, чтобы он не изменялся во время зацикливания.
Другая проблема в вашем реальная страница, которой нет во фрагменте, - это то, что теги <strong>
могут быть глубоко вложены в <p>
. Вы должны использовать strongs[j].parentElement
, чтобы получить его прямого родителя, а не предполагать, что p[i]
является родителем.
var p = document.getElementsByTagName("p");
for (var i = 0; i < p.length; i++) {
var strongs = Array.from(p[i].getElementsByTagName("strong"));
for (var j = 0; j < strongs.length; j++) {
strongs[j].parentElement.replaceChild(document.createTextNode(strongs[j].innerText), strongs[j]);
}
}
<html>
<body>
<p>aaa
<Strong>bbbbb</Strong> - <strong>12345</strong></p>
<p>acccaa <span><Strong>ddddd</Strong> x</span></p>
<p>eeee
<Strong>ffff</Strong>
</p>
</body>
</html>
Вы также можете избежать вложенных циклов, используя селектор запросов.
var strongs = document.querySelectorAll("p strong");
strongs.forEach(strong => strong.parentElement.replaceChild(document.createTextNode(strong.innerText), strong));
<html>
<body>
<p>aaa
<Strong>bbbbb</Strong> - <strong>12345</strong></p>
<p>acccaa <span><Strong>ddddd</Strong> x</span></p>
<p>eeee
<Strong>ffff</Strong>
</p>
</body>
</html>