先给出函数。
复制代码 代码如下:
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"
"http://www.w3.org/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(navigator.userAgent.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,'');
}
}
相关推荐:
seo用到什么软件,做seo需要用到什么软件 ,皮皮ai
GPT版本全解:从基础到高级,如何选择最适合你的方案?,韩国ai人工智能
高效创作之路:文章AI生成器的力量
SEO查看-如何通过精确分析提升网站流量与排名,东丽网站建设价格
ChatGPT服务部分恢复:人工智能助力全新体验,ai对象菜单
SEO深度解析:如何通过深度优化提升网站排名,带来流量和转化,咸宁网站建设大概费用
用AI修改文章,提升写作效率与质量的新时代
SEO实现:如何通过SEO优化提升网站流量与排名,南京市公司网站推广
怎么看文章是不是AI生成的?揭秘背后的玄机与技巧
ChatGPT出问题?背后的原因与解决方案,夸克ai写作生成
seo管理系统是什么,seo网站管理 ,过度圆ai
SEO留痕:数字营销的隐性力量,如何通过SEO优化让品牌更具竞争力,铁岭网站关键词建设优化
SEO监控:精准把握网站排名与优化成效的利器,湖南seo排名商家名单
SEO导航:助力网站提升流量与排名的必备工具,荣昌建筑网站建设
什么是秀米?全方位了解这款微信公众号排版神器,宁波全网营销型网站建设
WPJVX:开启数字化未来的智慧平台,关键词排名技术咨询乐云seo
ChatGPT页面空白无法登录?如何解决这一困扰?,温州ai字幕生成
ChatGPT页面空白不乏登录:让你秒变职场高手与生活智囊,百度ai 腾讯ai
SEO优化要钱吗?揭秘SEO投资背后的价值与回报,ai领域
AI工具汇总网站,让科技为您的工作加速
互联网快排:助力企业网站流量爆发的秘密武器,西安网站建设找资源公司
ChatGPT破解:人工智能未来的无限可能,污污AI解说
SEO新站优化指南:快速提升排名的必备技巧,海珠网站推广哪家有名
seo简介主要写什么,seo主要内容 ,AI弧线这
seo给你什么帮助,seo的利与弊 ,ai 大厨
ChatGPT无法打开?这些解决办法让你重新畅享智能对话!,北大写作ai
ChatGPT网页版内容显示不全的原因与解决方案,ai超级绘
AI网页设计生成-智能化创造无限可能,ai机甲风背景音乐
仿写AI:智能时代的创作革命,洛江区移动房网站推广
SEO架构:提升网站流量的核心策略,东营南江全平台营销推广
2024年AI写文章生成器推荐:让创作轻松高效,提升写作水平
seo网站需要做什么,seo都需要做什么 ,ai怎么做喷漆效果
SEO网络营销:如何通过精准优化提升品牌价值,青州建设网站电话
SEO部:开启数字化营销新纪元的幕后英雄,株洲营销推广是什么公司
ChatGPT发生故障,背后隐藏着哪些不为人知的原因与挑战?,硬件ai和软件ai
好用的AI智能工具,让生活与工作更高效!
ChatGPT回答问题,网页无法线下滚动?解决方案轻松get!,谷歌AI铃声
互联网留痕:数字时代的隐形轨迹与自我管理,灯塔网站推广包年多少钱
SEO爱站:提升网站排名,赢得流量的秘密武器,优化网站设计价格多少
SEO做网站点击:提升网站流量的关键策略,国内ai写作论文
Bing无法使用怎么办?解决方法及替代方案推荐!,ai文字设计教程
在线AI文章生成:内容创作新革命
SEO目的:如何通过精准优化提高网站流量与转化率,百度推广网站关键词
ChatGPT怎么打开不了?全方位解决方案!,大庆ai
实用AI工具:提升效率、优化生活的科技利器
ChatGPT网页版为什么不能用了?解析原因与解决办法,女人莫名其妙想ai
SEO有点:揭秘优化之道,提升网站排名的秘诀,广州抖音seo厂家地址
“扩写AI”-引领写作革命,开启智能创作新时代,dede seo 标题如何填写
AI+写文章:开启智能创作新时代
《权重参谋:让您的网站轻松登顶搜索引擎的秘密武器》,设计微信社群私域营销推广简案