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 相关文章推荐
js获取单选框或复选框值及操作
Dec 18 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
Jan 11 Javascript
Table冻结表头示例代码
Aug 20 Javascript
解析页面加载与js函数的执行 onload or ready
Dec 12 Javascript
深入学习jQuery Validate表单验证(二)
Jan 18 Javascript
浅谈javascript基础之客户端事件驱动
Jun 10 Javascript
Ionic3实现图片瀑布流布局
Aug 09 Javascript
BetterScroll 在移动端滚动场景的应用
Sep 18 Javascript
在Vue项目中引入腾讯验证码服务的教程
Apr 03 Javascript
three.js 将图片马赛克化的示例代码
Jul 31 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
Nov 04 Javascript
JavaScript中遍历的十种方法总结
Dec 15 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
用header 发送cookie的php代码
2007/03/16 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
浅析javascript 定时器
2014/12/23 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
python 数据加密代码
2008/12/24 Python
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
基于python实现聊天室程序
2018/07/27 Python
python实现Zabbix-API监控
2018/09/17 Python
Python SMTP发送邮件遇到的一些问题及解决办法
2018/10/24 Python
python实现按日期归档文件
2021/01/30 Python
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
美德好少年主要事迹
2014/01/29 职场文书
关于安全的演讲稿
2014/05/09 职场文书
运动会的口号
2014/06/09 职场文书
企业标语大全
2014/07/01 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python