Javascript动态引用CSS文件的2种方法介绍


Posted in Javascript onJune 06, 2014

最近做一个项目,需要javascript动态插入样式,结果以前的方法失效了!查了2个小时的原因竟然是自己手贱,这个最后再说!

javascript插入样式在前端开发中应用比较广泛,特别是在修改前端表现和页面换肤的时候。最近做的这个任务是用户在别人的站点上点击一个按钮,就会在别的站点页面下插入一个脚本,执行,这其中包含了样式的插入。

一般情况下javascript动态插入样式有两种,一种页面中引入外部样式,在<head>中使用<link>标签引入一个外部样式文件,另一种是在页面中使用<style>标签插入页面样式(这里说的不是style属性)。

一、页面中引入外部样式:

在<head>中使用<link>标签引入一个外部样式文件,这个比较简单,各个主流浏览器也不存在兼容性问题:

function includeLinkStyle(url) {
 var link = document.createElement("link");
 link.rel = "stylesheet";
 link.type = "text/css";
 link.href = url;
 document.getElementsByTagName("head")[0].appendChild(link);
}
includeLinkStyle("http://css.3water.com/home/css/reset.css?v=20101227");

但是在我目前做的这个项目中本身应用的样式非常少,直接用引入一个外部样式文件似乎不合适,所以我选择了第二种方案,在页面中使用<style>标签插入页面样式。

二、使用<style>标签插入页面样式:

这种方式在各个主流浏览器存在兼容性问题,像firefox等标准浏览器无法直接获取设置styleSheet的cssText值,标准浏览器下只能使用document.styleSheets[0].cssRules[0].cssText单个获取样式;同时使用:document.styleSheets[0].cssRules[0].cssText=newcssText;页面不会自动更新样式,必须使用:document.styleSheets[0].cssRules[0].style.cssText=newcssText;这点似乎没坑爹的IE来的人性化和简便。YUI中使用了一个很好的办法:style.appendChild(document.createTextNode(styles));采用createTextNode将样式字符串添加到<style>标签内;

function includeStyleElement(styles, styleId) {
    if (document.getElementById(styleId)) {
        return
    }
    var style = document.createElement("style");
    style.id = styleId;
    //这里最好给ie设置下面的属性
    /*if (isIE()) {
style.type = "text/css";
style.media = "screen"
}*/
    (document.getElementsByTagName("head")[0] || document.body).appendChild(style);
    if (style.styleSheet) { //for ie
        style.styleSheet.cssText = styles;
    } else { //for w3c
        style.appendChild(document.createTextNode(styles));
    }
}
var styles = "#div{background-color: #FF3300; color:#FFFFFF }";
includeStyleElement(styles, "newstyle");

这样页面中的元素就能直接应用样式了,不管你的这些元素是不是通过脚本追加的。

关于手贱:

看这段代码:

var divObj = document.createElement("div");
divObj.id = "__div";
divObj.innerHTML = "测试js插入DOM和样式";
document.body.appendChild(divObj);
var styles = "#__div{background-color: #FF3300; color:#FFFFFF }";
includeStyleElement(styles, "newstyle");

前面说了这个项目是用户在别人的站点上点击一个按钮,就会在别的站点页面下插入一个脚本,执行,这其中包含了样式的插入,我为了尽可能的保证我创建的元素ID唯一性,手贱在元素ID前加了“__”,表示私有防止冲突。结果悲剧了,IE6,IE7 class和id的命名不能以下划线开头(“_”),竟然把这个给忘了!花了两个小时才找到原因。悲剧啊!得出一个结论!做前端千万不能手贱!

Javascript 相关文章推荐
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
开发跨浏览器javascript常见注意事项
Jan 01 Javascript
JS setCapture 区域外事件捕捉
Mar 18 Javascript
JavaScript中对象property的读取和写入方法介绍
Dec 30 Javascript
深入理解JavaScript定时机制
Oct 27 Javascript
js原生实现FastClick事件的实例
Nov 20 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
详解node.js搭建代理服务器请求数据
Apr 08 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
JavaScript实现移动端轮播效果
Jun 06 Javascript
微信小程序实现手势滑动卡片效果
Aug 26 Javascript
vuex + keep-alive实现tab标签页面缓存功能
Oct 17 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 #Javascript
Node.js中对通用模块的封装方法
Jun 06 #Javascript
JavaScript中对循环语句的优化技巧深入探讨
Jun 06 #Javascript
jquery修改网页背景颜色通过css方法实现
Jun 06 #Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
Jun 06 #Javascript
JavaScript也谈内存优化
Jun 06 #Javascript
Javascript中的delete操作符详细介绍
Jun 06 #Javascript
You might like
php写的带缓存数据功能的mysqli类
2012/09/06 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
PHP7 新增功能
2021/03/09 PHP
JQuery伸缩导航练习示例
2013/11/13 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
JS中去掉array中重复元素的方法
2017/05/26 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
python实现汉诺塔递归算法经典案例
2021/03/01 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
Puppeteer使用示例详解
2019/06/20 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
python读取Kafka实例
2019/12/23 Python
Python解析微信dat文件的方法
2020/11/30 Python
基于PyTorch中view的用法说明
2021/03/03 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
DELPHI面试题研发笔试试卷
2015/11/08 面试题
数学检讨书1000字
2014/02/24 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
立春观后感
2015/06/18 职场文书
天气温馨提示语
2015/07/14 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫