我使用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')"
。但是,在实际应用程序中,脚本更复杂,由我使用的组件呈现,因此更改它可能非常棘手。
所以我的问题是:如何在重新渲染的区域中重新执行脚本?
答案 0 :(得分:1)
您提供的代码示例完全符合您的要求。每次单击按钮 - test
文本都会写入控制台。这是RichFaces中的开箱即用行为 - 重新评估重新渲染区域中的脚本。
答案 1 :(得分:0)
脚本应该是静态的,并且它们在动态上运行的数据,所以不要试图这样做。相反,在重新渲染区域时,执行一些对某些已更改的动态数据进行操作的回调。您已经有了这样的机制:oncomplete="rerendered('infoBlock')"
。
然后,您将在某处使用静态代码来读取动态数据并对其执行某些操作 - 静态代码不应嵌入页面上的脚本元素中:
function rerendered(regionName) {
//Do something depending on regionName
}
至于为何它不能正常工作,我们需要进入一个“较低”的水平。
给定的脚本元素对象有一个标志,告诉内容是否已经执行,当一个脚本元素插入主DOM树时,只有当标志为false
时才会执行。
使用.innerHTML
等时,html中的脚本元素根本不会被执行。
似乎上述任何一种机制都在使用中。