2012-10-03 49 views
0

我在JSP文件中的代碼看起來是這樣的:爲什麼替換反斜槓代碼在JS中不起作用?

<s:form namespace="/user" action="list" method="POST" id="filterListForm" theme="simple" 
     onsubmit="document.getElementById('filterSearchText').value=document.getElementById('filterSearchText').value.replace(/\\/g,'')"> 

它不會取代反斜槓字符。我試過以下,他們沒有工作:

replace('/\\/g','') 
replace(/\\\\/g,'') 
replace(\/\\\/g,'') 

但如果我將它更改爲以下,它的工作原理:

<s:form namespace="/user" action="list" method="POST" id="filterListForm" theme="simple" 
     onsubmit="replaceBackslash()"> 

<script type="text/javascript"> 
    function replaceBackslash() { document.getElementById('filterSearchText').value=document.getElementById('filterSearchText').value.replace(/\\/g,''); } 
</script> 

爲什麼?有沒有辦法讓它在第一種情況下工作?

+0

JSP本身必須解析字符串常量,並將JavaScript放在這樣的字符串中會造成麻煩。 – Pointy

回答

4

你想:

var replaced = original.replace(/\\/g, ''); 

在正則表達式文本,所有你需要做的是雙引用它反斜槓。

至於爲什麼當您嘗試通過JSP標記傳遞代碼時不起作用,那麼可能是JSP爲您改變了字符串。它可能工作要做到這一點:

<s:form ... onsubmit=' ... .replace(/\\\\/g, "") ... ' > 

,但我沒有一個很好的方式來嘗試,在目前

編輯 —其實我發現這個具有挑戰性。這可能取決於你的標籤庫的功能。我的框架(Stripes)喜歡HTML轉義屬性值,所以很難通過&#92;(很好,不可能)。

+0

我很想念這與他已經嘗試的不同。 – jrajav

+0

@Kiyura不是 - 他說他已經嘗試過的東西是有效的。他認爲第一個示例的問題在於他傳遞給JSP標記的字符串正在被JSP翻譯器損壞。 – Pointy

+0

是的,但問題似乎是如何使它在第一種情況下工作 - 在JSP中內聯。他似乎已經知道它在外面工作(即使他可能不知道爲什麼)。 – jrajav

0

(這是不是一個真正的解決方案,只是恰好解決了這個問題,也是一個通例的建議。)

底線:與分離的Javascript去。如果你覺得把它完全分解成不同的文件太繁重了(儘管這會幫助你徹底避免所有這些問題),但至少要把它全部放在底部的腳本標記中。它有助於分離佈局和邏輯,並將所有Javascript保存在一個已知的位置,使其更易於理解和維護。你甚至不需要onclick/onsubmit屬性,你也可以在Javascript中指定這些屬性(通常在html #id屬性上鍵入)。如果您仍然使用on [event]屬性,只需調用一個明智命名的函數,並將函數的實現放在主腳本中。

+0

不錯的建議,謝謝! – Frank