2010-07-02 14 views
6

編碼URL成分似乎是一個非常簡單的問題在這裏:與符號&

我有一個程序,其中有人在表單中輸入字符串M&S和運行查詢。我知道&是一個保留字符,因此必須進行編碼。問題是它似乎需要在某些情況下進行兩次編碼。

如果該URL在JavaScript onClick事件中使用,正常的URL編碼似乎很好地工作(這裏的經營者可以在列標題點擊排序):

<td onClick="AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=161')"> 

但是,如果使用URL在錨(雖然錨實際上使用AJAX),它似乎需要編碼兩次:

<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')" title='Refresh'>Refresh</a> 

上述兩個示例都正常工作。但是它們是手工生成的測試用例。不幸的是,在應用程序中,當我實際生成URL時,我不知道它將如何使用。

如果我編碼URL參數一次(M%26S),它在onClick中正常工作。但是在錨點中使用這種方式時,服務器將URL視爲...Qry147=M&S&sortmethod1=147... - 因此它必須在返回服務器之前未經過編碼。

如果我編碼兩次(M%2526S),錨點工作,但對於onClick,服務器看到...Qry147=M%2526S...

我感覺我在這裏錯過了一些東西。在兩種情況下,有沒有辦法讓這項工作相同?

+0

你能舉一個例子說明你實際上如何使用該值嗎? – Gumbo 2010-07-02 15:53:44

+0

對不起,問題顯示不正確。猜猜我需要努力逃避我的意見!堅持一秒鐘我會嘗試編輯它 – asc99c 2010-07-02 15:59:55

+0

查看源代碼...談論主動性不足!:) 現在的問題顯示正確,道歉。 – asc99c 2010-07-02 16:04:49

回答

8

如果使用簡單的步驟構建整個HTML文本,一些難題將會消失。因此,通過採取你的榜樣,你要編碼以下查詢參數:

M&S 

當您嵌入此字符串作爲在網址中的查詢參數,你必須來urlencode它,因爲你已經知道了。 urlencoded字符串是M%26S。完整的URL,然後看起來是這樣的:

http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147 

現在,這個URL被嵌入的JavaScript代碼,在這種情況下,你只需要在兩端的單引號:

'http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147' 

整個JavaScript代碼看起來像這樣的:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147') 

現在這整個文本在被解釋爲URL的HTML環境中使用,所以你需要再次進行urlencode它:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147') 

最後,因爲你是在HTML中嵌入這段文字,你需要htmlescape它:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&amp;sortmethod1=147') 

這就是爲什麼你結束:

<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&amp;sortmethod1=147')" title='Refresh'>Refresh</a> 

我通常會避免這些編碼挑戰通過不將字符串M&S直接放入onclick事件或錨點。一般情況下,你不能編碼onclick事件,並以同樣的方式錨,因爲兩者的解碼過程是不同的:

onclick: html -> js -> url 
anchor: html -> url -> js -> url 

別急......如果你寫這樣的輔助函數,它的工作原理:

function myQuery(q) { 
    var encodedQ = encodeURIComponent(q); // TODO: which character encoding is used here? 
    var url = 'http://10.0.0.195/program.exe?Qry147=' + encodedQ + '&sortmethod1=147'; 
    var response = AJAX_Get(url); 
    // TODO: handle errors 
} 

現在你可以這樣寫:

<a href="javascript:myQuery('M&amp;S')">anchor</a> 
<a onclick="myQuery('M&amp;S')">event</a> 

這招有效,因爲沒有%了在錨的情況下。

+0

偉大的描述 - 我想我明白爲什麼它現在不工作。這聽起來像是一個可行的解決方案。儘管我發現了另一個稍微有點冒險的解決方案,但我可能會走這條路。 – asc99c 2010-07-02 16:47:08

1

我建議將參數存儲爲未編碼形式,然後在使用時編碼,無論是onClick事件還是錨點。

0

我已經從別處獲得了一些解決方法,但它工作得很好。

簡單地替換:

< A HREF = 「JavaScript的:AJAX_Get(...)」 >

與:

< A HREF = 「JavaScript的:無效(0);」 onClick =「AJAX_Get(...)」>

onClick操作在錨和其他元素上的作用相同。很明顯,編寫自己的HTML塊的應用程序中的任何位都可能有問題,但是在覈心代碼中做這個解決方法只是一個小改變,所以我現在使用這個路由。

編輯:剛剛發現我的答案在這裏,並意識到這種解決方案導致更多的問題比解決。我最終花時間改變它以正常工作(所以它在正確的時間使用了正確的轉義方法。