javascript插入样式实现代码


Posted in Javascript onFebruary 22, 2012

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 相关文章推荐
DOMAssitant最新版 DOMAssistant 2.5发布
Dec 25 Javascript
ExtJS 2.0实用简明教程 之获得ExtJS
Apr 29 Javascript
js 获取子节点函数 (兼容FF与IE)
Apr 18 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
Aug 02 Javascript
Js 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
基于jquery ajax 用户无刷新登录方法详解
Apr 28 Javascript
ajax处理php返回json数据的实例代码
Jan 24 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
Mar 04 Javascript
详解JS中Array对象扩展与String对象扩展
Jan 07 Javascript
jQuery中slidedown与slideup方法用法示例
Sep 16 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
May 02 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 Vue.js
Javascript 中的 call 和 apply使用介绍
Feb 22 #Javascript
JS对象与JSON格式数据相互转换
Feb 20 #Javascript
js 代码优化点滴记录
Feb 19 #Javascript
JQuery.closest(),parent(),parents()寻找父结点
Feb 17 #Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
Feb 17 #Javascript
jquery实现奇偶行赋值不同css值
Feb 17 #Javascript
qTip2 精致的基于jQuery提示信息插件
Feb 17 #Javascript
You might like
PHP环境搭建最新方法
2006/09/05 PHP
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
2014/06/26 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
JavaScript 的方法重载效果
2009/08/07 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
js中iframe调用父页面的方法
2014/10/30 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
基于Vue+ElementUI的省市区地址选择通用组件
2019/11/20 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
Python中将字典转换为列表的方法
2016/09/21 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
Probikekit日本:自行车套件,跑步和铁人三项装备
2017/04/03 全球购物
Lancome兰蔻官方旗舰店:来自法国的世界知名美妆品牌
2018/06/14 全球购物
德国自行车商店:Tretwerk
2019/06/21 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
学生爱国演讲稿
2014/01/14 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
2015新学期家长寄语
2015/02/26 职场文书
清明扫墓感想
2015/08/11 职场文书
导游词之崇武古城
2019/10/07 职场文书
python blinker 信号库
2022/05/04 Python