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引用对象的方法代码
Aug 13 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
Jul 30 Javascript
Firefox中使用outerHTML的2种解决方法
Jun 07 Javascript
深入了解Node.js中的一些特性
Sep 25 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
Yii2使用Bootbox插件实现自定义弹窗
Apr 02 Javascript
微信小程序 动态绑定事件并实现事件修改样式
Apr 13 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
vue.js 添加 fastclick的支持方法
Aug 28 Javascript
如何HttpServletRequest文件对象并储存
Aug 14 Javascript
vue.js watch经常失效的场景与解决方案
Jan 07 Vue.js
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
基于mysql的论坛(2)
2006/10/09 PHP
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
smarty中js的调用方法示例
2014/10/27 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
详解JS中定时器setInterval和setTImeout的this指向问题
2017/01/06 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
微信小程序停止其他视频播放当前视频的实例代码
2019/12/25 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
Python实现豆瓣图片下载的方法
2015/05/25 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
2019/06/20 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
存储过程的优点有哪些
2012/09/27 面试题
计算机通信专业推荐信
2014/02/22 职场文书
商务经理岗位职责
2014/08/03 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
求职信格式范文
2015/03/19 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python
为Centos安装指定版本的Docker
2022/04/01 Servers
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python