JS函数实现动态添加CSS样式表文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JS函数实现动态添加CSS样式表⽂件
先给出函数。

复制代码代码如下:
varaddSheet=function(){
vardoc,cssCode;
if(arguments.length==1){
doc=document;
cssCode=arguments[0]
}elseif(arguments.length==2){
doc=arguments[0];
cssCode=arguments[1];
}else{
alert("addSheet函数最多接受两个参数!");
}
if(!+"v1"){//增加⾃动转换透明度功能,⽤户只需输⼊W3C的透明样式,它会⾃动转换成IE的透明滤镜
vart=cssCode.match(/opacity:(d?.d+);/);
if(t!=null){
cssCode=cssCode.replace(t[0],"filter:alpha(opacity="+parseFloat(t[1])*100+")")
}
}
cssCode=cssCode+" ";//增加末尾的换⾏符,⽅便在firebug下的查看。

varheadElement=doc.getElementsByTagName("head")[0];
varstyleElements=headElement.getElementsByTagName("style");
if(styleElements.length==0){//如果不存在style元素则创建
if(doc.createStyleSheet){//ie
doc.createStyleSheet();
}else{
vartempStyleElement=doc.createElement('style');//w3c
tempStyleElement.setAttribute("type","text/css");
headElement.appendChild(tempStyleElement);
}
}
varstyleElement=styleElements[0];
varmedia=styleElement.getAttribute("media");
if(media!=null&&!/screen/.test(media.toLowerCase())){
styleElement.setAttribute("media","screen");
}
if(styleElement.styleSheet){//ie
styleElement.styleSheet.cssText+=cssCode;
}elseif(doc.getBoxObjectFor){
styleElement.innerHTML+=cssCode;//⽕狐⽀持直接innerHTML添加样式表字串
}else{
styleElement.appendChild(doc.createTextNode(cssCode))
}
}
有时我们需要在.js⽂件对⽂档动态引⼊⼀些CSS样式。

对于⼀些短⼩的CSS代码来说,这好办,我们可以调⽤其style⽅法,如
复制代码代码如下:
varddd=document.getElementById("ddd");
ddd.style.border="1pxsolidred";
如果再长⼀点也⽆所谓:
复制代码代码如下:
varddd=document.getElementById("ddd");
ddd.style.cssText="border:1pxsolidred;color:#000;background:#444;float:left";
本⼈⽽⾔,我是喜欢后者。

因为前者有严重的兼容问题。

如float这个样式,在IE是styleFloat,在⽕狐等W3C标准游览器是cssFloat。

⽽cssText则是通吃。

如果很长,我们可以动态导⼊⼀CSS⽂件。


复制代码代码如下:
functionaddSheetFile(path){
varfileref=document.createElement("link")
fileref.rel="stylesheet";
fileref.type="text/css";
fileref.href=path;
fileref.media="screen";
varheadobj=document.getElementsByTagName('head')[0];
headobj.appendChild(fileref);
}
这个函数在IE中有点累赘。

我向来是⽀持哪个游览器就⽤哪个游览器的原⽣函数,直接使⽤⼆进制代码效率最⾼。

复制代码代码如下:
varoStylesheet=document.createStyleSheet(sURL,iIndex);
createStyleSheet带的两个参数都是可选的。

但如果我们的样式是某个页⾯独有的,⽽且只有管理员才能使⽤到,⽽且那部分页⾯是动态⽣成的,我们需要⼀开始就引⼊它吗?需要特意弄个⽂件来装载它吗?最好的⽅法让这些样式与动态脚本捆绑在⼀起。

我这个函数就为此⽽开发的。

坦⽩说,它最开始是为富⽂本编辑器⽽开发的。

⼤家都知道,富⽂本输⼊框最流⾏的做法是把要输⼊的内容放到iframe 中,这就涉及到两种document,⼀个主页⾯的document,另⼀个是iframe的document。

iframe的document⼜涉及到兼容问题。

我们可以:
variframe=document.createElement('iframe');//⽣成⽤于编辑的richtexteditor
variframeDocument=iframe.contentDocument||iframe.contentWindow.document;
……
嘛,扯远了。

总⽽⾔之,函数最开始的判定就是为这两种document⽽准备。

如果没有涉及到iframe,我们只传⼊⼀个参数就⾏了。

最后⼀个参数永远是CSS字符串。

然后是动态⽣成styleSheet元素,把CSS字符串加⼊到此元素的问题。

当然如果有现阶段的,当然就⽤现成的。

DOM元素越多对游览器的负担就越⼤。

我们想到document.styleSheets⽅法。

它返回⼀个集合,包含style元素与link元素,还涉及⼀兼容问题,如:
复制代码代码如下:
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="
<head>
<metahttp-equiv="content-type"content="text/html;charset=UTF-8"/>
<%#强制IE8像IE7⼀样呈现⽹页-%>
<metahttp-equiv=”X-UA-Compatible”content=”IE=EmulateIE7″/>
<%#--默认所有的链接都在本窗⼝打开-%>
<basetarget="_self"/>
<title><%=h(yield(:title))||controller.action_name%></title>
<%=stylesheet_link_tag"screen","button","style"%>
<linkrel="stylesheet"href="/stylesheets/print.css"type="text/css"media="print">
<!--[ifltIE8]>
<linkrel="stylesheet"href="/stylesheets/ie.css"type="text/css"media="screen">
<![endif]-->
<%=javascript_tag"window._token='#{form_authenticity_token}'"ifActionController::Base.allow_forgery_protection%>
<%=javascript_include_tag:defaults%>
<styletype="text/css"media="print"></style>
</head>
上⾯⽤alert(document.styleSheets.length);测试⼀下,IE返回6,W3C游览器返回5。

因此,否决了它。

⽽且我们只⽤到style元素,不使⽤外联。

第⼆部分的判定就针对head中的style元素⽽⾔,没有就创建⼀个。

然后我们把CSS字符串加在第⼀个style元素就⾏了。

接着我们要加把保险锁,因为当media="print"时,只在页⾯打印时,定义的效果才有效。

为了防⽌第⼀个style元素的media值不是screen,我们得改⼀改。

复制代码代码如下:
varstyleElement=styleElements[0];
varmedia=styleElement.getAttribute("media");
if(media!=null&&!/screen/.test(media.toLowerCase())){
styleElement.setAttribute("media","screen");
}
附上media的⼀些说明。

screen(缺省值),提交到计算机屏幕;
print,输出到打印机;
projection,提交到投影机;
aural,扬声器;
braille,提交到凸字触觉感知设备;
tty,电传打字机(使⽤固定的字体);
tv,电视机;
all,所有输出设备。

最后是如此添加的问题。

分IE,⽕狐与其他游览器三种。

判定游览器也⽤各⾃的私有属性或⽅法。

如styleSheet是IE独⽤的,getBoxObjectFor是⽕狐独⽤的(当然你也可以使⽤(/firefox/.test(erAgent.toLowerCase())),通常DOM操作是最耗时的,能⽤私有就⽤私有!
使⽤⽅法。

复制代码代码如下:
addSheet("
.RTE_iframe{width:600px;height:300px;}
.RTE_toolbar{width:600px;}
.color_result{width:216px;}
.color_view{width:110px;height:25px;}
.color_code{text-align:center;font-weight:700;color:blue;font-size:16px;}
div.table{width:176px;position:absolute;padding:1px;}
div.tabletd{font-size:12px;color:red;text-align:center;}
");*/
对⽐⼀下51js的客服果果脚本,更短⼩,但是它会可能会创建多个style元素,还有⼀些效率的问题……毕竟我这个最初是为开发富⽂本编辑⽽开发的,功能不强⼤不⾏啊!
/*
动态添加样式表的规则
*/
iCSS={add:function(css){
varD=document,$=D.createElement('style');
$.setAttribute("type","text/css");
$.styleSheet&&($.styleSheet.cssText=css)||
$.appendChild(D.createTextNode(css));
D.getElementsByTagName('head')[0].appendChild($);
}};
iCSS.add("
.dhoooListBox,.dhoooListBoxli{margin:0;padding:0;list-style-type:none;font-size:12px;cursor:default}
.dhoooListBox{border:1pxsolid#aaa;width:180px;background:#eee;height:200px;overflow:auto;float:left}
.dhoooListBoxli{margin:5px;line-height:24px;background:url(images/smilies/time.gif)no-repeat060%;padding-
left:25px;color:#555;}
.dhoooListBoxli.selected{background-color:#FFCC33}
");
最后追加⼏个相关的⽅法:
vargetClass=function(ele){
returnele.className.replace(/s+/,'').split('');
};
varhasClass=function(ele,cls){
returnele.className.match(newRegExp('(\s|^)'+cls+'(\s|$)'));
}
varaddClass=function(ele,cls){
if(!this.hasClass(ele,cls))ele.className+=""+cls;
}
varremoveClass=function(ele,cls){
if(hasClass(ele,cls)){
varreg=newRegExp('(\s|^)'+cls+'(\s|$)'); ele.className=ele.className.replace(reg,''); }
}。

相关文档
最新文档