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 相关文章推荐
Javascript Ajax异步读取RSS文档具体实现
Dec 12 Javascript
js控制当再次点击按钮时的间隔时间
Jun 03 Javascript
javascript中Number对象的toString()方法分析
Dec 20 Javascript
js实现屏幕自适应局部代码分享
Jan 30 Javascript
js实现上一页下一页的效果【附代码】
Mar 10 Javascript
javascript基础知识讲解
Jan 11 Javascript
详谈js对url进行编码和解码(三种方式的区别)
Aug 16 Javascript
ES6基础之字符串和函数的拓展详解
Aug 22 Javascript
Vue路由之JWT身份认证的实现方法
Aug 26 Javascript
JS实现百度搜索框关键字推荐
Feb 17 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
Jul 17 Javascript
jQuery实现雪花飘落效果
Aug 02 jQuery
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实现变色验证码实例
2014/01/06 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
一个简洁实用的PHP缓存类完整实例
2014/07/26 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
PHP分享图片的生成方法
2018/04/25 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
window.name代替cookie的实现代码
2010/11/28 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
JS基于onclick事件实现单个按钮的编辑与保存功能示例
2017/02/13 Javascript
canvas简单快速的实现知乎登录页背景效果
2017/05/08 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
Python算法之栈(stack)的实现
2014/08/18 Python
python机器学习之神经网络(三)
2017/12/20 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
YUV转为jpg图像的实现
2019/12/09 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
信息专业个人的自我评价
2013/12/27 职场文书
公司节能减排方案
2014/05/16 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
陕西导游词
2015/02/04 职场文书
2016高一新生军训心得体会
2016/01/11 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
python中对列表的删除和添加方法详解
2022/02/24 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫