hit counter for blogger

黑暗執行緒

 黑暗執行緒搬新家囉!! http://www.darkthread.net

8/18/2006

KB-Javascript字串的特殊字元處理

猜猜看,以下的程式碼中,jsAlert函式有什麼"可議之處"?

private void Page_Load(object sender, System.EventArgs e)
{
     string msg="Hello, World!";
     jsAlert(msg);
}
private void jsAlert(string msg)
{
     Response.Write("<script>alert(\""+msg+"\");</script>");
     Response.Write("<button onclick=\"alert('"+msg+"');\">CLICK</button>");
}


問題出在,當msg參數含有一些特殊字元時,這個網頁有可能產生JavaScript Error。


例如: 若msg="L1\r\nL2\rL3\n<Words>\"It's good!\"</Words>",其中的換行及雙引號會造成<script>列出錯,而單引號及換行則會讓<button>列掛點


簡單來說,當傳入的參數要形成Javascript的字串內容時,我們要特別留意換行及單雙引號這些特殊字元。廢話不多說,我寫了個函數來處理,大家直接看Code就明白。我想得到,該攔的應該都攔了,沒想到的就有勞大家集思廣義,多多檢舉了。


private void betterJsAlert(string msg)
{
     Response.Write("<script>alert('"+JSStringEscape(msg,false)+"');</script>");
     Response.Write("<button onclick=\"alert('"+JSStringEscape(msg,true)+"');\">CLICK</button>");
}
/// <summary>
///
字串要被宣告成JavaScript字串時的特殊處理。例如: Response.Write("&lt;script&gt;alert('"+msg+"');&lt;/script&gt;");
/// 中的msg有特殊字元如換行時,會造成JavaScript Error。此函數可以進行特殊字元的置換處理。
/// </summary>
///
<param name="raw">原始字串</param>
///
<param name="htmlAttribute">是否要宣告在HTML Attribute中,對單雙引號加入特別處理。
/// 例如: "&lgt;a onclick="alert('"+msg+"');"&gt;時,注意Attribute請使用雙引號包含字串</param>


/// <returns>置換特殊字元之後的字串</returns>
///
<remarks></remarks>
private string JSStringEscape(string raw, bool inHtmlAttribute)
{
     raw=raw.Replace("\r\n","\\n").Replace("\r","").Replace("\n","\\n");
     if (inHtmlAttribute)
           raw=raw.Replace("\"", "&quot;").Replace("'", "\\'");
     else
          raw=raw.Replace("'","\\'").Replace("\"","\\\"");
     return raw;
}

3 Comments:

  • 大師有沒有被 parseInt("08") 扁過?
    還蠻痛的.....

    By Anonymous Anonymous, at 8/23/2006 10:41 am  

  • 所幸沒被扁過,不過看起來應該很痛!!
    0x就算了,用0開頭似乎不是好的In-band表示法,這樣看來,寫程式時的陷阱可多了!

    By Blogger Darkthread, at 8/23/2006 10:48 am  

  • 事情是這樣的
    DateTime欄位日期格式轉換麻煩->不想使用DateTime格式->使用字串儲存日期(20060801)->月份日期出現0開頭->使用cint或parseInt將0去掉並且拿來做運算.....

    By Anonymous Anonymous, at 8/23/2006 6:30 pm  

Post a Comment

<< Home