2011-08-09 93 views
0

我想創建一個使用JavaScript的動態HTML表。我已經寫了一個小功能,可以將行添加到表中。但是,單個單元本身應該是gsp標籤要素。在下面的示例中,我嘗試使用由grails-UI插件提供的autoComplete標記。儘管我將單元格的innerHTML設置爲gsp標記,但它並未呈現在頁面上。使用JavaScript的GSP標籤

function addIngredientRow(tableName,element){ 

var table = document.getElementById(tableName); 
var lastRow = table.rows.length; 
var row = table.insertRow(lastRow); 
var leftCell = row.insertCell(0); 
var autoCompleteDiv = document.createElement('div'); 
leftCell.appendChild(autoCompleteDiv); 
autoCompleteDiv.innerHTML= '<gui:autoComplete id="autoCompleteIngredient" resultName="ingredients" labelField="name" idField="id" controller="recipe" \ 
     action="getIngredientAsJSON" forceSelection="true" \ 
     useShadow="true" width=60px queryDelay=0.5 />'; 

var rightCell = row.insertCell(1); 
var autoCompleteDivR = document.createElement('div'); 
rightCell.appendChild(autoCompleteDivR); 
autoCompleteDivR.innerHTML= '<p>test</p>'; 

}

的HTML代碼段調用此代碼如下:

<tr> 
        <td> 
         <gui:autoComplete 
           id="autoCompleteIngredient" 
           resultName="ingredients" 
           labelField="name" 
           idField="id" 
           controller="recipe" 
           action="getIngredientAsJSON" 
           forceSelection="true" 
           useShadow="true" 
            width=60px 
            queryDelay=0.5  
         /> 
        </td> 
        <td> 
         <div onclick="addIngredientRow('createRecipeTable',this)"><img alt="Add Ingredient" src="${resource(dir:'images/icons',file:'Add16.png')}" ></div> 
        </td> 
       </tr> 

我已經檢查了JavaScript是被放在一個警報調用。所以所有的接線都很好。我認爲問題在於通過瀏覽器解析gsp標籤。我如何從JavaScript調用gsp標籤?

回答

2

GSP頁面在服務器上呈現,很久很久很久很久很久很久很久,瀏覽器EVER才獲得html並可以開始運行Javascript。您需要使用AJAX調用將gsp標記發送回服務器,然後將其(可能)呈現爲HTML,然後從AJAX響應中獲取HTML並將其插入到您的文檔中。

+0

很酷...非常感謝您的回覆。你認爲在grails世界裏,一個好的框架/插件可以實現這一點嗎? –

+0

考慮構建一個更好的系統 - 使用客戶端生成的代碼並在服務器端運行它是一個巨大的安全風險。對於有人查看網頁源代碼並提交可能會導致服務器死機的惡意gsp標籤,這是微不足道的。 –

0

GSP在渲染到瀏覽器之前進行評估。如果你想讓javascript使用它們,那麼javascript源代碼必須由grails引擎來提供/評估。

您可以爲js創建一個控制器,並使用gsp將它像其他Grails應用程序頁面一樣呈現。

+0

請注意,這可能會影響您的js的緩存能力,除非您通過響應頭手動控制它。 – codelark

+0

可以使用jquery完成這樣的事情嗎? –