The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

修正一個 FCKeditor.Net 2.6.3 的 Bug

我們有個網站,每次當頁面載入 FCKeditor 的時候,全公司就只有我的電腦可以正常執行,其他的開發人員都無法正確載入 FCKeditor,都會出現【'this.LinkedField.value' 是 null 或不是一個物件】的錯誤訊息(如下圖),這真的又是一件很詭異的事,且又再度證明一點,電腦其實是會挑人出問題的!(註:好幾次客戶打電話來問我問題時,電腦都會在我接起電話的當下自動恢復正常)

JavaScript 錯誤:'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&amp;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() 而已。

FCKeditor.cs 檔案的第 359 行,將 this.ClientID 加上 HttpUtility.UrlEncode() 即可

將 QueryString 的參數加以編碼(UrlEncode)是個好習慣,各位應該盡量用網路最標準的方式開發網站,比較不會遇到這類的問題。