`
mutongwu
  • 浏览: 439000 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

动态添加style元素

阅读更多
/**
 * @description IE6~9下,页面的样式规则有如下限制:
 *  1)link+style元素的个数不能大于31个;
 *  2)单个css文件的rule条数,不能大于4095条;
 *  3)<pre>@import</pre> 命令不能嵌套超过4层。
 *  
 * 文件处理了动态加载 link/style元素的情况,但不能处理页面一开始就已经违反了限制1的情况。
 * @author shawnwu
 * @date 2013-09-03
 */
(function(win){
    var doc = document,
        head = document.getElementsByTagName("head")[0],
        linkEls = doc.getElementsByTagName("link"),
        styleEls = doc.getElementsByTagName("style"),
        poorIE = /MSIE ([^;]+)/.test(navigator.userAgent) && parseInt(RegExp.$1,10) < 10,
        IMPORT_ID = "importLink_ID",
        APPEND_ID = "appendStyle_ID",
        /**
         * IE6~9 的BUG:link+style元素的个数,不能大于31个。
         */
        LIMIT = 31,
        // 至少保留两个位置给我们定义的style元素:一个用于import,一个用于append
        maxNum =  LIMIT - 2,
        isLimited = false;
    
    /**
     * @description 创建添加一个LINK元素
     * @param {String} url 样式链接
     * @return link元素
     */
    function createLinkEl(url){
        var link = doc.createElement("link");
        link.type = "text/css";
        link.rel = "stylesheet";
        link.href = url;
        head.appendChild(link);
        return link;
    }
    
    /**
     * @description 创建添加一个style元素
     * @param {String} str 样式规则
     * @param {String} id 元素ID
     * @return style元素
     */
    function createStyleEl(str,id){
        var el = doc.createElement("style");
        el.type = "text/css";
        if(id){
            el.id = id;
        }
        if(str){
            if(poorIE){
	            el.styleSheet.cssText = str; //IE  
	        }else{
	            el.appendChild(document.createTextNode(str));  
	        }
        }
        head.appendChild(el);
        return el;
    }
  
    function checkLimit(){
        if(!isLimited && poorIE){
            if(linkEls.length + styleEls.length >= maxNum){
                isLimited = true;
            }
        }
        return isLimited;
    }
    
    function loadStyle(url){
        if(checkLimit()){
            doImportStyle(url);
        }else{
            doLoadStyle(url);
        }
    }
    
    function loadStyleStr(str){
        if(checkLimit()){
            doAppendStr(str);
        }else{
            doLoadStr(str);
        }
    }
    
    function doLoadStr(str){
        createStyleEl(str);
    }
    
    function doAppendStr(str){
        var el = doc.getElementById(APPEND_ID);
        if(!el){
            createStyleEl(str,APPEND_ID);
        }else{
            el.styleSheet.cssText = el.styleSheet.cssText + str;
        }
    }
    
    function doImportStyle(url){ 
        var el = doc.getElementById(IMPORT_ID),
            styleEl = null;
        if(!el){
            styleEl = createStyleEl(null,IMPORT_ID);
            styleEl.styleSheet.addImport(url);
        }else{
            el.styleSheet.addImport(url);
        }
    }
    
    function doLoadStyle(url){
        createLinkEl(url)
    }
    
    //export
    win.cssUtil = {
        //加载外链css
        loadStyle: loadStyle,

        //直接添加样式规则
        loadStyleStr: loadStyleStr
    };
})(window);
分享到:
评论

相关推荐

    用js动态添加html元素,以及属性的简单实例

    用js动态添加html元素,以及属性的简单实例 function test(){ //创建节点 var lswt_2=document.createElement("div"); //设置节点id lswt_2.id='lswtColse'; //设置节点属性 lswt_2.style.width='11px'; lswt_2....

    javaScript动态添加Li元素的实例

    **javaScript动态添加Li元素**&lt;/title&gt; &lt;style type=text/css&gt; ul li{list-style:none;display:block;text-align:left;} ul li span{display:inline-block;margin-top:5px;margin-right:35px;} &lt;/...

    jquery动态添加带有样式的HTML标签元素方法

    如下所示: &lt;table class=exhibit_table xss=removed&gt; 上传计划单 &lt;td xss=removed&gt;&lt;input type=file name=file style=display:inline;...button type=button class=btn btn-success btn-xs style=bord

    markdown-it-style:markdown-it插件-为您的markdwon添加样式

    它可以为结果html元素添加样式。安装 npm install markdown-it-style --save-dev或者,如果使用纱线 yarn add -D markdown-it-style用 var Markdown = require('markdown-it')var markdowStyle = require('markdown...

    jQuery实现标签子元素的添加和赋值方法

    select class="dept-name-show" style="width: 70%;"&gt; &lt;/select&gt; 二、编写js语句: [removed] $(function () { var dname = $(".dept-name-show").eq(0);//选定&lt;select&gt;标签 var url = "${...

    CSS 指层叠样式表 (Cascading Style Sheets)

    CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题 外部样式表可以极大提高工作效率 外部样式表通常...

    详解vue添加删除元素的方法

    vue实例:添加删除元素r&lt;/title&gt; &lt;style type="text/css"&gt; .form-group{ margin:10px; } .form-group&gt;label{ display: inline-block; width: 5rem; text-align: right; } &lt;/style&gt; &lt;...

    Jquery动态添加及删除页面节点元素示例代码

    通常我们会遇到选中某个条件...Jquery动态添加及删除页面节点&lt;/title&gt; [removed][removed]&lt;!–引用jqurey库文件–&gt; &lt;style&gt; .container{ width:1000px; margin:0 auto;} .top{ height:25px; line-heigh

    silverstripe-elemental-style:SilverStripe元素块的灵活而动态的样式

    水母元素动态样式介绍通过YML文件将任意数量的样式下拉字段添加到任意元素。 样式按位置分组。 这使您可以将CSS类插入模板中的不同位置,而不仅仅是保持容器。 当您需要提供更改网格中的列数的功能时,可以在模板中...

    全源码版本StyleControls - 4.80 FS.rar

    2、支持所有元素和控件中的经典绘图、系统主题和VCL样式 3、控件的集合,它基于GDI+矢量图形(控件可以为不同的元素自动使用样式或自定义颜色) 4、特殊组件,添加按钮,标签在数控领域的风格形式和改善形式的...

    vue动态生成dom并且自动绑定事件

    用jquery的时候你会发现,页面渲染后动态生成的dom,在生成之前的代码是没办法取到相应对象的,必须重新获取.但是vue基于数据绑定的特性让它能生成的时候直接绑定数据。 html: &lt;input type=text v-model...

    JQuery为元素添加样式的实现方法

    为定义好的css样式可以调用元素的css方法添加样式 $(“span”).css(“css属性名”,”属性值”) 如 $(“span”).css(“color”,”red”) 将标签为span的字体都设为红色的 $(“#id”) $(“span”)  如果是定义好的...

    通过js为元素添加多项样式,浏览器全兼容写法

    js给元素添加多项样式,浏览器全兼容示例写法: 测试3 [removed] var obj=document.getElementById("test"); var oldStyle=obj.style.cssText; alert&#40;oldStyle&#41;; obj.style.cssText="border:2px red solid;...

    ember-style-modifier:ember.js的{{style}}元素修饰符

    余烬风格修饰符 此插件提供了{{style}}元素修饰符,用于设置元素的样式。 这允许设置元素的自定义CSS,而无需style-src-attr: "unsafe-inline" 。兼容性Ember.js v3.4或更高版本Ember CLI v2.13或更高版本Node.js ...

    customStyle

    向网站添加样式html元素 @param styleidentifier:字符串,定义样式元素的ID,以标识样式以供以后使用 @param选择器:字符串,有效CSS选择器 @param属性:任意,带有花括号的css属性的对象,例如:{display:none} ...

    在vue中动态修改css其中一个属性值操作

    我就废话不多说了,大家还是直接看代码吧~ &lt;!--此div的高度取屏幕可视区域的高度--&gt; &lt;h5&gt;{{ msg }} [removed] export default { data() { return { msg: Welcome to Your Vue.js App, ... /

    利用DOM设置背景图

    a)在页面设置元素,并使用document.querySelector ("div"),获取div元素。 b)给元素添加onclick ()单击事件。 c)处理onclick函数逻辑 d)通过style属性修改元素的背景色和宽度;

    【JavaScript源代码】vue添加自定义右键菜单的完整实例.docx

    在所编辑的页面,需要添加右键菜单的元素,绑定contextmenu事件,如下:  v-for="item in resourceList" :key="item.id" @click="handleClickFolder(item)" @contextmenu.prevent="openMenu($event,item)" &gt; ...

    Android代码-一个对安卓应用支持多种主题的库

    它支持静态设置控件使用主题元素的方式——layout的xml中定义控件时使用,也支持程序动态设置——主题控件辅助类来动态改变主题元素。 目前已经支持Style中设置attrRes来支持多主题控件属性切换。 可以很容易地在...

Global site tag (gtag.js) - Google Analytics