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 相关文章推荐
基于jQuery的遍历同id元素 并响应事件的代码
Jun 14 Javascript
JS实现静止元素自动移动示例
Apr 14 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
JavaScript实现显示函数调用堆栈的方法
Apr 21 Javascript
基于JavaScript实现验证码功能
Apr 01 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
Nov 29 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
深入了解JavaScript代码覆盖
Jun 13 Javascript
Vue Components 数字键盘的实现
Sep 18 Javascript
JavaScript实现字符串与HTML格式相互转换
Mar 17 Javascript
vue实现可拖拽的dialog弹框
May 13 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
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
javascript getElementsByClassName实现代码
2010/10/11 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
2016/12/08 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
2017/07/11 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python Tkinter简单布局实例教程
2014/09/03 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
python selenium 弹出框处理的实现
2019/02/26 Python
简述 Python 的类和对象
2020/08/21 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
学期评语大全
2014/04/30 职场文书
垃圾桶标语
2014/06/24 职场文书
幼儿园大班教学反思
2016/03/02 职场文书