向当前style sheet中插入一个新的style实现方法


Posted in Javascript onApril 01, 2013

很少会插入一个新的style rule,今天为了临时解决页面样式问题,需要更新很多页面的一些样式,这些页面都引用了一个公共的js,为了方便,直接在这个公共的js里面向style sheet插入新的style rule。

先看代码:

/** 
* Add a stylesheet rule to the document (may be better practice, however, 
* to dynamically change classes, so style information can be kept in 
* genuine styesheets (and avoid adding extra elements to the DOM)) 
* Note that an array is needed for declarations and rules since ECMAScript does 
* not afford a predictable object iteration order and since CSS is 
* order-dependent (i.e., it is cascading); those without need of 
* cascading rules could build a more accessor-friendly object-based API. 
* @param {Array} decls Accepts an array of JSON-encoded declarations 
* @example 
addStylesheetRules([ 
['h2', // Also accepts a second argument as an array of arrays instead 
['color', 'red'], 
['background-color', 'green', true] // 'true' for !important rules 
], 
['.myClass', 
['background-color', 'yellow'] 
] 
]); 
*/ 
function addStylesheetRules (decls) { 
var style = document.createElement('style'); 
document.getElementsByTagName('head')[0].appendChild(style); 
if (!window.createPopup) { /* For Safari */ 
style.appendChild(document.createTextNode('')); 
} 
var s = document.styleSheets[document.styleSheets.length - 1]; 
for (var i=0, dl = decls.length; i < dl; i++) { 
var j = 1, decl = decls[i], selector = decl[0], rulesStr = ''; 
if (Object.prototype.toString.call(decl[1][0]) === '[object Array]') { 
decl = decl[1]; 
j = 0; 
} 
for (var rl=decl.length; j < rl; j++) { 
var rule = decl[j]; 
rulesStr += rule[0] + ':' + rule[1] + (rule[2] ? ' !important' : '') + ';\n'; 
} 
if (s.insertRule) { 
s.insertRule(selector + '{' + rulesStr + '}', s.cssRules.length); 
} 
else { /* IE */ 
s.addRule(selector, rulesStr, -1); 
} 
} 
}

addStylesheetRules(["div.content", ["color": "#000"], ["border-width","1px"], ["border-style", "solid"]])

执行后当前document的head标签内,多了一个style
<style> 
div.content{color:#000;border:1px solid} 
</style

知道怎么调用了吧,每次调用都会插入一个新的style,所以最好调用一次,插入多个rule
addStylesheetRules( 
[selector, [attr, value], …], 
[selector, [attr, value], …] 
);

主要用到两个方法
标准方法:stylesheet.insertRule(rule, index)
rule:被插入的rule,如 div.content{color:#000}
index: 插入顺序,先后顺序会影响样式的。从0开始
firefox、chrome、opera、safri、ie从ie9开始也支持这个方法
ie的stylesheet.addRule (selector, styleDef [, positionIndex]);
selector:如div.content
styleDef:如color:#000
positionIndex:默认-1,插入到末尾
ie、safari、chrome支持这个方法
Javascript 相关文章推荐
jQuery弹出层插件简化版代码下载
Oct 16 Javascript
javascript开发随笔一 preventDefault的必要
Nov 25 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
Oct 15 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
Mar 07 Javascript
js实现分割上传大文件
Mar 09 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
May 03 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
Dec 26 Javascript
jquery 判断是否支持Placeholder属性的方法
Feb 07 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
Nov 27 Javascript
jQuery实现遍历XML节点和属性的方法示例
Apr 29 jQuery
使用xampp将angular项目运行在web服务器的教程
Sep 16 Javascript
select标签模拟/美化方法采用JS外挂式插件
Apr 01 #Javascript
html组件不可输入(只读)同时任何组件都有效
Apr 01 #Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 #Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 #Javascript
表单验证的完整应用案例探讨
Mar 29 #Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
Mar 29 #Javascript
图片img的src不变让浏览器重新加载实现方法
Mar 29 #Javascript
You might like
PHP图片上传类带图片显示
2006/11/25 PHP
PHP表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
CI框架Session.php源码分析
2014/11/03 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
three.js实现3D模型展示的示例代码
2017/12/31 Javascript
React BootStrap用户体验框架快速上手
2018/03/06 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
[53:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第三场 6.2
2018/06/03 DOTA
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python使用当前时间、随机数产生一个唯一数字的方法
2017/09/18 Python
Django实现文件上传和下载功能
2019/10/06 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Python实现EM算法实例代码
2020/10/04 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
倡议书格式模板
2014/05/13 职场文书
体育节口号
2014/06/19 职场文书
校园标语大全
2014/06/19 职场文书
组织生活会发言材料
2014/12/15 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android