(ご容赦ください。あなたの最新の編集の前にこれを書き始めました。ただし、それでも役立つと思います。)
何を達成したいのかわかりませんが、JavaScript を使用して求めていることを正確に達成するのは非常に難しいと言えます。これは主に、HTML が無効になるためです。
まず、HTML が無効になる理由を見ていきましょう。ブラウザーが HTML を解析するとき、 DOM ノードのネストされたツリーを構築します。最初の例は次のように表すことができます。
JavaScript と DOM を使用すると、このツリーをたどって操作できます。さまざまなタグのテキスト ノードを組み合わせて、問題なく<p>
1 つの<p>
タグに配置できます。しかし、2 番目の例の構造を作成することはできません。単純に DOM ツリーの形をしていないため、DOM を使用してその HTML を作成することはできません。
HTML を操作して 2 番目の例の形にする唯一の方法は、 Jon Hanna が説明してinnerHTML
いるように、. 幸いなことに、ブラウザーは常に無効な HTML を有効な DOM 構造に修正します。悪いニュースは、ブラウザごとにこれが異なるため、最終的にどうなるか分からないことです.
唯一の本当の解決策は、最新の編集で行ったように、HTML 構造を再考することです。
元の問題を解決する方法は、元の HTML がどの程度静的であるかによって異なります。大まかな例を挙げますが、それについては次のように推測します。
- 常に正確に5
<p>
があります
- の 2 番目から 4 番目まで
<p>
は常に の内側<span>
にあり、1 番目と 5 番目は常に の外側にあります。
これら 2 つの条件が満たされている場合は、次のようなものを使用できます。
var paragraphs = document.getElementsByTagName('p');
var newParagraphs = [];
function createElementWithText(tagname, text, classname) {
var classname = classname || '';
var element = document.createElement(tagname);
element.className = classname;
element.appendChild(document.createTextNode(text));
return element;
}
newParagraphs[0] = createElementWithText('p', paragraphs[0].textContent);
newParagraphs[0].appendChild(createElementWithText('span', paragraphs[1].textContent, 'myclass mytext'));
newParagraphs[1] = createElementWithText('p', paragraphs[2].textContent, 'myclass mytext');
newParagraphs[2] = document.createElement('p');
newParagraphs[2].appendChild(createElementWithText('span', paragraphs[3].textContent, 'myclass mytext'));
newParagraphs[2].appendChild(document.createTextNode(paragraphs[4].textContent));
JSFiddle に実例を投稿しました: jsfiddle.net/vSrLJ/