2010-07-14 23 views
0

我在寫關於這個更詳細的職位上我的博客: http://idisposable.co.uk/2010/07/chrome-are-you-sanitising-my-inputs-without-my-permission/Chrome中的錯誤或用戶中的愚蠢?消毒表單上的輸入?

但基本上,我有一個字符串,它是:

||abcdefg 
hijklmn 
opqrstu 
vwxyz 
|| 

我加給一個indiciation管道字符串開始和結束的位置,特別注意最後一行的最後一個回車符。

我需要把它放到一個隱藏的表單變量中,然後發送給供應商。

在基本上,除了鉻任何瀏覽器,我得到如下:

<input type="hidden" id="pareqMsg" value="abcdefg 
hijklmn 
opqrstu 
vwxyz 
" /> 

但在鉻,似乎應用.Trim()或別的東西,讓我:

<input type="hidden" id="pareqMsg" value="abcdefg 
hijklmn 
opqrstu 
vwxyz" /> 

注意它被切斷了最後一次回車。如果有幫助,這些回車符(編碼時)爲%0A。

基本上,除了chrome之外的任何瀏覽器,整個事情都起作用,我從第三方獲得期望的響應。在Chrome中,我收到了'無效的pareq'消息(這表明最後一次回車對供應商來說很重要)。

Chrome版本是5.0.375.99

難道我要瘋了,或者這是一個錯誤?

乾杯, 特里

回答

0

通常在輸入框中,你不能(通過鍵盤)換行進入..所以也許鉻強制執行這甚至爲嵌入式,通過屬性值..

嘗試使用textarea(使用display:none)..

+0

那爲什麼不把所有換行符都取出呢? – GSerg 2010-07-14 13:14:46

+0

奇怪的是,textarea與顯示:沒有任何作品 - 假設沒有其他答案進來,我會把它標記爲Gaby減少頭痛! 我仍然很想知道爲什麼Google Chrome會這樣做。 – 2010-07-14 13:22:32

+0

@GSerg,這是一個好點..這應該被認爲是一個bug .. – 2010-07-14 14:35:40

1

在此確認。它修剪後面的CRLF,它們不會被分析到瀏覽器的DOM中(我假設所有的HTML屬性都是這樣)。

如果您在腳本中添加了CRLF,例如

var pareqMsg = document.forms[0]['pareqMsg'] 
if (/\r\n$/.test(pareqMsg.value) == false) 
    pareqMsg.value += '\r\n'; 

......他們確實得到維護併發回服務器。雖然Gaby暗示的暗示<textarea>想法可能會更容易!

+0

贊成,現在我認爲textarea的東西是最優雅的解決方案,雖然這是我認爲所有的開發人員將不得不意識到的東西如果空白對他們很重要 - 恐怖! – 2010-07-14 15:48:42

2

您不能依靠表單提交來保存包含在隱藏字段值中的確切字符數據。過去我使用Firefox將CRLF(\r\n)序列轉換爲純粹的LF,並且您的經驗表明Chrome的行爲同樣令人困惑。事實證明,它並不是一個真正的bug。

請記住,您在此處提供的是HTML屬性值 - 嚴格來說,HTML 4 DTD定義了類型爲CDATA的<input>元素的value屬性。關於CDATA屬性值的HTML規範has this to say

用戶代理應該解釋屬性值如下:

  • ,字符替換字符實體,
  • 忽略換行符,
  • 替換每個回車或帶有一個空格的選項卡。

用戶代理可能忽略CDATA屬性值中的前導和尾隨空白(例如,「myval」可能被解釋爲「myval」)。作者不應該使用前導空白或尾隨空白聲明屬性值。

所以屬性值中的空白是受到衆多用戶代理變換 - 符合瀏覽器都顯然被丟棄所有的換行,不僅是後一個 - 因此Chrome的行爲的確是越野車,但在相反的方向到你想要的那個。

但是請注意,瀏覽器還有望用字符替換字符實體 - 這意味着你應該能夠編碼您的CR和LF類爲&#13;&#10;,甚至空間爲&#32;,消除任何實際的空白字符你的價值領域完全。

但是,正如您發現的那樣,瀏覽器對這些SGML解析規則的遵從性是不完整的,所以您的里程可能會有所不同。

+0

upvoted你詹姆斯,這是一個'爲什麼'問題 – 2010-07-15 06:38:37

+0

upvoted作爲幫助我解決問題的破解總結。用html字符引用替換了CR和Lf。 – 2011-03-22 14:36:34