ここで直面している課題は、JavaScript が空白もテキスト ノードとして認識することです。したがって、JavaScript の観点からは、この HTML:
<div id="test">
<h2>Try 1</h2>
Test Test Test
<h2>Try 2</h2>
</div>
次の HTML とは異なります。
<div id="test"><h2>Try 1</h2>
Test Test Test
<h2>Try 2</h2>
</div>
最初のケースでは、 内の最初のノードdiv
は textNode ( nodeType == 3
) です。2 番目の HTML の例では、 内の最初のノードdiv
はh2
ノードです。
これは、jQuery とネイティブ JavaScript を組み合わせてすべての要素をループする便利な関数です。
解決
var objNodes = $(".wrapper").contents().get();
function loopNodes(objNodes, i) {
i = (typeof i === "undefined") ? 0 : i;
if (objNodes[i].nodeType !== 3) {
return {"isHeader":true, "first":$(objNodes[i])};
} else {
var strText = objNodes[i].innerText || objNodes[i].textContent;
if ($.trim(strText).length === 0) {
return loopNodes(objNodes, i+1);
} else {
return {"isHeader":false, "first":null};
}
}
}
使用法
var objResults = loopNodes(objNodes);
if (objResults.isHeader) {
console.log("Coolness");
objResults.first.text("AWESOME FIRST HEADER!");
} else {
console.log("Less Coolness");
}
実際の動作:
http://jsbin.com/welcome/61883/edit
編集: innerText/textContent を取得するクロスブラウザーの方法を追加しました。この件に関する完全なリファレンスについては、 Quirksmodeを参照してください。