2013-03-15 88 views
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')"。但是,在实际的应用程序中,脚本更复杂,我使用的组件呈现该脚本,因此更改此脚本可能非常棘手。

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

回答

1

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

+0

我再次尝试,没有控制台日志,甚至警报不起作用。但我使用的是旧版本的Ajax4jsf:1.0.6。也许这就是问题所在?他们是否在新版本/丰富的面孔中改变了这一点? – 2013-03-18 09:33:51

+1

更新到RichFaces 3.3后,它工作得很好! – 2013-03-18 11:00:17

0

脚本应该是静态的,它们在动态操作的数据,所以不要试图做到这一点。相反,当区域被重新渲染时,执行一些回调操作一些更改的动态数据。您已有此机制:oncomplete="rerendered('infoBlock')"

然后,您将有静态代码某处读取动态数据,并用它做什么 - 静态代码不应该被嵌入脚本元素的网页上:

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

至于为什么它不工作的是,我们需要去一点“更低”的水平。

给定的脚本元素对象具有一个标志,该标志告诉脚本元素是否插入到主DOM树中,是否已经执行了内容,仅在标志为false时才执行。

当使用.innerHTML或者这样的话,HTML内的脚本元素根本不会被执行。

看来上述任何一种机制都在使用中。

+0

我得到你说的,但脚本标记由我使用的组件呈现,并将代码移到oncomplete事件可能会非常棘手。其次,脚本标签的内容因为依赖于后台bean的属性而发生变化。 – 2013-03-15 11:20:12

+0

@TimBüthe对不起,但我不认为你得到它 - 将代码移动到一个静态JS文件。如果需要动态生成,那么就是将静态代码与动态数据混合在一起,这就是我所说的不好的。在'oncomplete'属性中你所需要的只是一个函数调用,就像我所表明的那样,永远不会被修改。例如:你可以动态生成类似'console.log(“test”)'的东西。只有字符串“test”是动态数据,而console.log是静态代码。他们可以并且应该分开。 – Esailija 2013-03-15 11:24:42

+0

这是不可能的,或者至少有很多工作。我使用[Apache MyFaces](http://myfaces.apache.org/)和使用的组件[inputCalendar](http://myfaces.apache.org/tomahawk-project/tomahawk12/tagdoc/t_inputCalendar.html)呈现HTML以及包含20行动态JavaScript的脚本标签。要改变这一点,我将不得不重写整个组件。所以我想我会寻找某种解决方法。 – 2013-03-15 12:47:45