跳到主要內容

動態新增、修改、刪除 CSS Rule

需求:有一個動態網頁,每個物件都是動態載入,每一種物件都允許自訂顏色,因此我用物件的type id做為CSS的名稱,設定後立即生效。


利用jQuery搭配AJAX確實很方便,但是jQuery的selector只針對目前存在的DOM物件有效,雖然有神奇的 .live ,很可惜只對Event有效果,對於CSS並沒有類似的API。
後來找到JavaScript Kit上的Changing external style sheets using the DOM,照著這三篇的做法就可以動態新增、修改、刪除 CSS Rule,不需要在檔案定義。黑暗執行緒李明儒大師寫了篇動態加入預設Style設定,將新增預設CSS Rule擴充至jQuery。我自己先簡單地把修改的部份直接寫成先檢查存不存在,若存在就刪除再新增,這樣很不好的暴力寫法XD 程式碼如下:

function changeCSSRule(classToSet, rulesToSet) {
    for (var k = 0; k < document.styleSheets.length; k++) {
        var mysheet = document.styleSheets[k];
        var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
        mysheet.crossdelete = mysheet.deleteRule ? mysheet.deleteRule : mysheet.removeRule;
        if(myrules != null) //若不加此檢查,V8 engine 會有錯誤
        {
           for (var j = 0; j < myrules.length; j++) {
               if (myrules[j].selectorText == classToSet) {
                   mysheet.crossdelete(j)
                   j-- //decrement i by 1, since deleting a rule collapses the array by 1
               }
           }
        }
        if (mysheet.insertRule) {
            mysheet.insertRule(classToSet + "{" + rulesToSet + "}", 0);
        }
        else if (mysheet.addRule) {
            mysheet.addRule(classToSet, rulesToSet);
        }
    }
}
比較弔詭的情形是若只改document.styleSheets[0]的話是無效的,所以我昨天照著這裏的範例試並沒有成功,各位朋友可自行測試。

MSDN上addRule有許多限制,在IE7及以下並不支援selector或是"b, a"這種同時設定兩個以上class的寫法,但支援"div a"之類的寫法,請注意。

留言

這個網誌中的熱門文章

自然人憑證讀卡機驅動程式

鳥毅用的是第一代的自然人憑證讀卡機,EZ100PU(後來有同事買EZmini可以讀SIM卡似乎更好),每年報稅時用一次。 本來只是要申請些政府業務,一時之間找不到光碟,沒想到在 驅動程式下載 居然看到Linux和Mac的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

DBeaver 介面語言

DBeaver是我個人頗常用的一套跨平台Database管理工具,最近升級後發現Windows版本居然變成簡體中文,而且無法切換為英文。

如何將較高版本SQL Server複製到低版本SQL Server (降級為舊版)並保留權限及資料庫圖表

一般若是要將SQL Server裡的Database轉往其他Server時,最簡單的方式就是備份(Backup)後再還原(Restore),或者是䣃離(detach)後附加(attach)。 但是很不幸地,若是由較低版本(e.g. 2008)到較高版本(e.g. 2012)要怎麼辦呢?