如何在重新渲染的区域中重新执行脚本?

时间:2013-03-15 10:39:00

标签: javascript richfaces ajax4jsf

我使用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>

我的问题是,重新呈现infoBlock时,脚本console.log('test')不会被重新执行。

顺便说一句,我知道我可以删除脚本标记并在上面的示例中使用oncomplete="console.log('test')"。但是,在实际应用程序中,脚本更复杂,由我使用的组件呈现,因此更改它可能非常棘手。

所以我的问题是:如何在重新渲染的区域中重新执行脚本?

2 个答案:

答案 0 :(得分:1)

您提供的代码示例完全符合您的要求。每次单击按钮 - test文本都会写入控制台。这是RichFaces中的开箱即用行为 - 重新评估重新渲染区域中的脚本。

答案 1 :(得分:0)

脚本应该是静态的,并且它们在动态上运行的数据,所以不要试图这样做。相反,在重新渲染区域时,执行一些对某些已更改的动态数据进行操作的回调。您已经有了这样的机制:oncomplete="rerendered('infoBlock')"

然后,您将在某处使用静态代码来读取动态数据并对其执行某些操作 - 静态代码不应嵌入页面上的脚本元素中:

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

至于为何它不能正常工作,我们需要进入一个“较低”的水平。

给定的脚本元素对象有一个标志,告诉内容是否已经执行,当一个脚本元素插入主DOM树时,只有当标志为false时才会执行。

使用.innerHTML等时,html中的脚本元素根本不会被执行。

似乎上述任何一种机制都在使用中。