1

まず、以下の状況について説明させてください。テンプレートとして機能するこのマークアップがあります。

<div class="container">
    <div class="item"></div>
</div>

今私がしたいことは、単に「.item」ノードを取得してコピーし、値を追加して「.container」(その親) に追加することです。そして、このプロセスを数回繰り返します。結果は次のようになります。

<div class="container">
    <div class="item">Happy</div>
    <div class="item">New</div>
    <div class="item">Year</div>
    <div class="item">2015</div>
</div>

私は次のコードでこれを達成しました:

$child = $node->childNodes->item(0);    
$refNode = $child;
$template = $child->cloneNode(true);

for($i=0; $i < 4; $i++){ 
    $refNode = ($node->lastChild === $child)?
                $node->appendChild($child): 
                $node->insertBefore($child, $refNode->nextSibling); # (newNode, refNode)

    $refNode->nodeValue = walk($data);
    $child = $template->cloneNode(true);
}

function walk(&$array){
    $item = current($array); next($array); return $item;
}

これはうまくいきます。しかし、私はこのコードに満足していません。

これは、次のような簡単な方法で実行できると思っていました。

$refNode = $node->childNodes->item(0)->cloneNode(false); # copy the child node
$node->nodeValue = null; # empty the container

for($i=0; $i < 4; $i++){ 
    $refNode->nodeValue = walk($data); # assign value to the reference node
    $node->appendChild( $refNode ); # append 
}

残念ながら、これは機能しません。

だから、私の質問は、これを行うためのより簡単でエレガントな方法はありますか?



編集

OK、これはうまくいきます:

$child = $node->childNodes->item(0); # copy the child before removing
$refNode = $child; # make a reference
$node->nodeValue = null; # empty parent

for($i=0; $i < 4; $i++){  
    $refNode->nodeValue = walk($data); # assign value to reference node
    $child = $refNode->cloneNode(true); # copy reference node
    $node->appendChild($child); # append to parent
}

子ノードを再追加できない理由はまだよくわかりませんが。すでに追加されているため、もう追加できないため、参照ノードを作成する必要があるのはなぜですか?

4

0 に答える 0