0

私は richfaces / ajax4jsf を使用してページの領域を部分的に再レン​​ダリングします。

<a4j:commandButton value="..." reRender="infoBlock" action="#{...}"/>
<h:panelGrid id="infoBlock">
  <h:outputText value="..."/>
  <f:verbatim>
    <script type="text/javascript">
      console.log('test')
    </script>
  </f:verbatim>
</h:panelGrid>

私の問題は、console.log('test')infoBlock が再レンダリングされたときにスクリプトが再実行されないことです。

ちなみに、スクリプトタグを削除oncomplete="console.log('test')"して上記の例で使用できることは承知しています。ただし、実際のアプリケーションでは、スクリプトはより複雑で、私が使用するコンポーネントによってレンダリングされるため、これを変更するのは非常に難しい場合があります。

だから私の質問は:再レンダリングされた領域でスクリプトを再実行する方法は?

4

2 に答える 2

1

あなたが提供したコード例は、まさにあなたが求めていることを行います。ボタンをクリックするたびに、testテキストがコンソールに書き込まれます。これは、RichFaces の既定の動作です。再レンダリングされた領域のスクリプトは再評価されます。

于 2013-03-17T04:47:32.323 に答える
0

スクリプトは静的で、スクリプトが操作するデータは動的でなければならないため、これを実行しないでください。代わりに、領域が再レンダリングされるときに、変更された動的データに作用するコールバックを実行します。あなたはすでにこれのためのメカニズムを持っています: oncomplete="rerendered('infoBlock')".

次に、動的データを読み取って何かを行うための静的コードがどこかにあります。静的コードは、ページのスクリプト要素に埋め込まれるべきではありません。

function rerendered(regionName) {
   //Do something depending on regionName
}

そのままでは機能しない理由については、もう少し「低い」レベルに進む必要があります。

特定のスクリプト要素オブジェクトには、コンテンツが既に実行されているかどうかを示すフラグがあります。スクリプト要素がメイン DOM ツリーに挿入されると、フラグが の場合にのみ実行されfalseます。

などを使用する.innerHTMLと、html内のスクリプト要素はまったく実行されません。

上記のメカニズムのいずれかが使用されているようです。

于 2013-03-15T10:51:06.013 に答える