2013-03-15 32 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