我們有個網站,每次當頁面載入 FCKeditor 的時候,全公司就只有我的電腦可以正常執行,其他的開發人員都無法正確載入 FCKeditor,都會出現【'this.LinkedField.value' 是 null 或不是一個物件】的錯誤訊息(如下圖),這真的又是一件很詭異的事,且又再度證明一點,電腦其實是會挑人出問題的!(註:好幾次客戶打電話來問我問題時,電腦都會在我接起電話的當下自動恢復正常)
即便我更新 FCKeditor.Net 組件到 2.6.3 目前的最新版,還是一樣有這個問題。這個問題也是另一個累積好幾個星期的問題,我也是一直沒時間看,到昨天才靜下心來把問題給解決。
問題是這樣的,FCKeditor 在載入的時候,會透過一個 iframe 載入編輯器,語法如下:
<iframe id="ctl00_main_DetailsView1___內文_FCKEdit___Frame"
src="/js/fckeditor/editor/fckeditor.html?InstanceName=ctl00_main_DetailsView___內文_FCKEdit&Toolbar=FullPage"
width="100%" height="600px"
frameborder="no" scrolling="no"></iframe>
由以上範例得知,於我們的欄位有用到中文,不過因為我們整個網站的網頁、CSS與JavaScript全部都用 UTF-8 編碼,照理說不會有這個問題,像我的 IE 就無此問題,且在 Firefox 中也從未發生過問題過,但是我在這個 iframe 中的 src 屬性看出了端倪,因為載入 fckeditor.html 的時候有載入幾個 QueryString,其中的 InstanceName 參數並沒有用 UrlEncode 編碼過,我就猜想應該是這裡誤判了!
因為 FCKeditor.Net 是 Open Source 的產品,所以我就將原始碼抓回來小改了一下,就真的把問題給徹底解決了!
首先,先下載 FCKeditor.Net_2.6.3.zip 回來,找到 FCKeditor.cs 檔案的第 359 行,將此行改成以下即可:
sLink += "editor/" + sFile + "?InstanceName=" + HttpUtility.UrlEncode(this.ClientID);
其實也只是將 this.ClientID 加上 HttpUtility.UrlEncode() 而已。
將 QueryString 的參數加以編碼(UrlEncode)是個好習慣,各位應該盡量用網路最標準的方式開發網站,比較不會遇到這類的問題。