2011-12-16 37 views
0

我有一個Struts表單包含一個地圖Struts表單:如何處理換行符依賴於JavaScript

private Map<Long, String> questionAnswers = new TreeMap<Long, String>(); 

我對這個變量(這裏沒有顯示)正常getter和setter,和我也有getter和setter需要對Struts到(使用字符串/對象)工作:

public Object getQuestionAnswer(String questionId) { 
    return getQuestionAnswers().get(questionId); 
} 

public void setQuestionAnswer(String questionId, Object answerText) { 
    String answer = (answerText == null) ? "" : answerText.toString(); 
    getQuestionAnswers().put(Long.valueOf(questionId), answer); 
} 

在我的JSP中,我動態生成用於爲地圖輸入值的文字區域。這一切工作正常。但是,當表單無效時,我需要再次動態生成textareas,並將用戶文本放回textareas。我目前正在重新填充文字區域,像這樣:

<c:forEach items="${myForm.questionAnswers}" var="questionAnswer"> 
    var textareaBoxName = "questionAnswer(" + '${questionAnswer.key}' + ")"; 
    var textareaBox = document.getElementsByName(textareaBoxName)[0]; 
    if (textareaBox) { 
     $('textarea[name=' + textareaBoxName + ']').val('${questionAnswer.value}'); 
    } 
</c:forEach> 

這工作得很好,如果你在textarea的一個回車換行符除外。然後,JavaScript錯誤會報告「未終止的字符串常量」。我猜測新行正在執行,而不是隻讀。

setQuestionAnswer方法中,我進行了一些調試,發現在textarea中輸入的換行符被讀爲2個字符,轉換爲13和10(我認爲是\ r和\ n)。我嘗試用setQuestionAnswer方法(使用字符串replaceAll方法)中的「\ n」替換「\ r \ n」,但發生了相同的錯誤。然後我嘗試用「%0A」替換「\ r \ n」(我相信它是JavaScript換行符)。雖然這擺脫了JavaScript錯誤,但textareas現在顯示「%0A」而不是換行符。我嘗試了各種逃避和運氣(注意,我還希望保留特殊字符)。

有沒有人有任何想法如何保留無效提交textarea框中的換行符和特殊字符?我需要這個在IE中工作。我想避免使用一些特殊的字符/字符串來「代表」一個換行符,然後我用JavaScript代替它等等。

回答

1

由於$ {questionAnswer.value}放在JavaScript String文本中,因此您如果你想在JavaScript文字中使用換行符,你需要像轉義一樣:行Hello和World必須寫成'Hello \ nWorld'。看看commons-lang StringEscapeUtils escapeECMAScript方法。在iddition以逃避新行,它也將難逃標籤,撇號等

使用此法的EL方法,並直接使用它到你的JSP:

$('textarea[name=' + textareaBoxName + ']').val('${myFn:escapeJs(questionAnswer.value)}'); 

您也可以生成文本區靜態代替使用JavaScript生成它們的:

+0

我除去在我`setQuestionAnswer`方法逸出(使得\ r \ n將仍保持)中,加入用`StringEscapeUtils.escapeJavaScript`的EL方法。 +1謝謝:) – 2011-12-16 20:59:01