UEditor不能重新載入的問題
頁面中有一個下拉框,根據這個下拉框選中的值來動態載入不同的UEditor。
根據《JavaScript DOM 程式設計藝術》這本書裡的指示,我遵循了“預留退路”的原則,也就是說不能完全依賴於指令碼來實現重要功能,因為萬一使用者的瀏覽器不支援指令碼中的某些功能,其代價是重要功能的喪失。在我的專案裡,使用者需要靠編輯器來給題庫中新增題目,所以我直接在網頁中硬編碼了一些簡單的input控制元件,這樣即使指令碼出現問題,使用者依然可以正常使用。如果指令碼沒有問題,則用指令碼來動態的將這些樸素的input控制元件替換為功能更加齊全的UEditor。
為了測試這項功能,我並沒有在網頁剛剛載入時就呼叫getEditor(),而只將getEditor()的呼叫放在了下拉框的change()函式裡。當網頁剛載入時輸入框都是簡單的input控制元件,然後我在下拉框中隨便選擇一項
通過對比兩次選擇下拉框選項之後網頁的變化,我發現了原來UEditor API中的getEditor()函式在載入UEditor的同時,會在網頁中新增好多東西:
載入UEditor之前:
載入UEditor之後
所以如果再次重新載入UEditor,getEditor()又試圖向文件中新增這些內容,可是這些內容已經在文件中存在了,於是便產生錯誤
這裡還有一點應該注意,那就是UEditor在其script標籤中使用了defer屬性,而只有 Internet Explorer 支援 defer 屬性。具體請看HTML<script> 標籤的 defer 屬性雖然現在沒出問題,誰知道以後這會捅出什麼簍子,在此Mark備查。
我首先想到的是,每次重新載入之前先把這些東西從文件樹中刪掉,後來發現這樣工作量實在太大,而且很容易出錯,所以我偷了個懶,幹錯讓整個頁面重新重新整理算了,重新整理後無論如何UEditor新增的垃圾都會被清除掉的(雖然效能有所減低,但個人覺得,實現功能為主,效能優化為次)。
不過重新整理整個頁面,就要把使用者當前選中的項也傳過去,不然等於什麼也沒做。
$(document).ready(function()
{
$("#typeList").change(function () {
var oldSelect = $("#typeList").val();
window.location.href = '../UnitTestManager/Details?unitTestId=' + $("#unitTestId").val() + '&selected=' + oldSelect;
});
loadPartialView($("#typeList").val());
});
});
其中oldSelect就是使用者當前選中的下拉框中的項,這裡通過url傳遞給重新整理後的頁面。
然後使用loadPartialView(type)函式來載入具體型別的編輯器。(引數是下拉框中使用者選中的值)
p.s. 我本來是把loadPartialView放在change函式中的,後來發現重新整理頁面的操作會在退出change()函式之後才執行,所以會看到頁面上編輯器先成功加載出來,緊接著頁面重新整理後又啥都沒有了。所以將loadPartialView放在change()函式外面,可以先讓頁面重新整理,之後再載入編輯器。