1

を使用してアイテムのリストを繰り返し処理してい<ui:repeat>ます。内部では、javascriptを使用して反復ごとにいくつかのデータを処理し、反復ごとに作成されるdivに出力したいと考えています。もちろん、次のコードは最後の反復のデータのみを出力します(前の反復は上書きされます)。私はそれを行う方法を考えることができません。

これはjsfコードです:

<ui:repeat var="item" value="#{someBean.items}">
    <script type="text/javascript">
        var item = "#{item.id}";
        showItem();
    </script>
    <div id="#{item.id}"></div>
</ui:repeat>

これは機能です:

function showItem(){
    document.getElementById(item).innerHTML = 'this is an item';
}
4

2 に答える 2

2

これを試してみてください:

<ui:repeat var="item" value="#{someBean.items}">
    <div id="#{item.id}"></div>
    <script type="text/javascript">
        showItem("#{item.id}");
    </script>
</ui:repeat>

-

function showItem(item){
    document.getElementById(item).innerHTML = 'this is an item';
}

その理由は、各変数がスクリプトタグでラップされていても、それらはすべてグローバルスコープ上にあるため、ループの各反復で相互に上書きするためです。

各スクリプトブロックに独自のスコープを与えるために、このような自己実行関数で変数をラップすることができますが、現在のロジックでは、少しやり過ぎのようです。

<ui:repeat var="item" value="#{someBean.items}">
    <div id="#{item.id}"></div>
    <script type="text/javascript">
    (function(){
        var item = "#{item.id}";
        showItem(item);
    })();
    </script>
</ui:repeat>
于 2012-11-30T01:15:34.710 に答える
1

「getElementsByName」を使用してすべてのアイテムを取得し、それらをループで表示できます。原因として、他の方法には「getElementsByClassName」またはjQueryが含まれます。

<ui:repeat id="outer" var="item" value="#{someBean.items}">
   <div id="#{item.id}" name="item"></div> 
</ui:repeat>

<script type="text/javascript">
function showAllItems(){
    var items = document.getElementsByName('item');
    for(var index in items)
    {
         showItem(items[index].id);
    }
};
showAllItems();
</script>
于 2012-11-30T02:45:17.037 に答える