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 回答