`

JavaScript动态添加样式,IE下通过

阅读更多
在.js文件对文档动态引入一些CSS样式。对于一些短小的CSS代码来说,这好办,我们可以调用其style方法,如

var ddd = document.getElementById("ddd");
ddd.style.border = "1px solid red";

如果再长一点也无所谓:

var ddd = document.getElementById("ddd");
ddd.style.cssText = "border:1px solid red;color:#000;background:#444;float:left";

本人而言,我是喜欢后者。因为前者有严重的兼容问题 。如float这个样式,在IE是styleFloat,在火狐等W3C标准游览器是cssFloat。而cssText则是通吃。

如果很长,我们可以动态导入一CSS文件。如

function addSheetFile(path){
  var fileref=document.createElement("link")
  fileref.rel = "stylesheet";
  fileref.type = "text/css";
  fileref.href = path;
  fileref.media="screen";
  var headobj = document.getElementsByTagName('head')[0];
  headobj.appendChild(fileref);
}

这个函数在IE中有点累赘。我向来是支持哪个游览器就用哪个游览器的原生函数,直接使用二进制代码效率最高。

var oStylesheet = document.createStyleSheet ( sURL , iIndex );

createStyleSheet带的两个参数都是可选的。

但如果我们的样式是某个页面独有的,而且只有管理 员才能使用到,而且那部分页面是动态生成的,我们需要一开始就引入它吗?需要特意弄个文件来装载它吗?最好的方法让这些样式与动态脚本捆绑在一起。我这个函数就为此而开发的。

坦白说,它最开始是为富文本编辑器而开发的。大家都知道,富文本输入框最流行的做法是把要输入的内容放到iframe中,这就涉及到两种 document,一个主页面的document,另一个是iframe的document。 iframe的document又涉及到兼容问题。我们可以:

      var iframe = document.createElement('iframe');//生成用于编辑的rich text editor
      var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
……

嘛,扯远了。总而言之,函数最开始的判定就是为这两种document而准备。如果没有涉及到iframe,我们只传入一个参数就行了。最后一个参数永远是CSS字符串。

然后是动态生成styleSheet元素,把CSS字符串加入到此元素的问题。当然如果有现阶段的,当然就用现成的。DOM元素越多对游览器的负担就越大。我们想到document.styleSheets方法。它返回一个集合,包含style元素与link元素,还涉及一兼容问题,如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <%# 强制IE8像IE7一样呈现网页 -%>
  <meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE7″ />
  <%#--默认所有的链接都在本窗口打开 -%>
  <base target="_self" />
  <title><%= h(yield(:title)) || controller.action_name  %></title>
  <%= stylesheet_link_tag "screen","button","style"  %>
  <link rel="stylesheet" href="/stylesheets/print.css" type="text/css" media="print">
  <!--[if lt IE 8]>
   <link rel="stylesheet" href="/stylesheets/ie.css" type="text/css" media="screen">
  <![endif]-->
  <%= javascript_tag "window._token = '#{form_authenticity_token}'" if ActionController::Base.allow_forgery_protection %>
  <%= javascript_include_tag :defaults  %>
   <style type="text/css" media="print"></style>
</head>

上面用alert(document.styleSheets.length);测试一下,IE返回6,W3C游览器返回5。因此,否决了它。而且我们只用到style元素,不使用外联。第二部分的判定就针对head中的style元素而言,没有就创建一个。然后我们把CSS字符串加在第一个 style元素就行了。

接着我们要加把保险锁,因为当media="print"时,只在页面打印时,定义的效果才有效。为了防止第一个style元素的media值不是screen,我们得改一改。

  var  styleElement = styleElements[0];
  var media = 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.table td{font-size:12px;color:red;text-align:center;}\
" );*/

对比一下51js的客服果果脚本,更短小,但是它会可能会创建多个style元素,还有一些效率的问题……毕竟我这个最初是为开发富文本编辑而开发的,功能不强大不行啊!

/*
动态添加样式表的规则
*/
iCSS={add:function(css){
      var D=document,$=D.createElement('style');
      $.setAttribute("type","text/css");
      $.styleSheet&&($.styleSheet.cssText=css)||
              $.appendChild(D.createTextNode(css));
      D.getElementsByTagName('head')[0].appendChild($);
}};
iCSS.add("\
      .dhoooListBox,.dhoooListBox li{margin:0;padding:0;list-style-type:none;font-size:12px;cursor:default}\
      .dhoooListBox{border:1px solid #aaa;width:180px;background:#eee;height:200px;overflow:auto;float:left}\
      .dhoooListBox li{margin:5px;line-height:24px;background:url(images/smilies/time.gif) no-repeat 0 60%;padding-left:25px;color:#555;}\
      .dhoooListBox li.selected{background-color:#FFCC33}\
");

最后追加几个相关的方法:

var getClass = function(ele) {
  return ele.className.replace(/\s+/,' ').split(' ');
};
var hasClass = function(ele,cls) {
  return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
var addClass = function(ele,cls) {
  if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
var removeClass = function(ele,cls) {
  if (hasClass(ele,cls)) {
      var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
      ele.className=ele.className.replace(reg,' ');
  }
}

===============================================================
通用函数:
var ads_addSheet = function(){
var doc,cssCode;
    if(arguments.length == 1){
        doc = document;
        cssCode = arguments[0]
    }else if(arguments.length == 2){
        doc = arguments[0];
        cssCode = arguments[1];
    }else{
        return false;
    }
if(!+"\v1"){//增加自动转换透明度功能,用户只需输入W3C的透明样式,它会自动转换成IE的透明滤镜
var t = cssCode.match(/opacity:(\d?\.\d+);/);
if(t!= null){
  cssCode = cssCode.replace(t[0], "filter:alpha(opacity="+ parseFloat(t[1]) * 100+")")
}
}
cssCode = cssCode + "\n";//增加末尾的换行符,方便在firebug下的查看。
var headElement = doc.getElementsByTagName("head")[0];
var styleElements = headElement.getElementsByTagName("style");
if(styleElements.length == 0){//如果不存在style元素则创建
if(doc.createStyleSheet){    //ie
    doc.createStyleSheet();
}else{
    var tempStyleElement = doc.createElement('style');//w3c
    tempStyleElement.setAttribute("type", "text/css");
    headElement.appendChild(tempStyleElement);
}
}
var  styleElement = styleElements[0];
var media = styleElement.getAttribute("media");
if(media != null && !/screen/.test(media.toLowerCase()) ){
    styleElement.setAttribute("media","screen");
}
if(styleElement.styleSheet){    //ie
    styleElement.styleSheet.cssText += cssCode;
}else if(doc.getBoxObjectFor){
    styleElement.innerHTML += cssCode;//火狐支持直接innerHTML添加样式表字串
}else{
    styleElement.appendChild(doc.createTextNode(cssCode))
}
}
分享到:
评论

相关推荐

    javascript 动态样式添加的简单实现

    总的来说,JavaScript动态样式添加是一种强大的技术,它可以让你在不刷新整个页面的情况下更新或添加样式,提高网页的响应性和性能。无论是加载外部CSS文件还是内联CSS模块,都能帮助你更有效地管理网页的样式表现。

    javascript添加背景水印

    综上所述,"javascript添加背景水印"涉及到的主要知识点包括JavaScript编程、CSS样式设计、HTML结构构建以及可能的响应式和跨浏览器兼容性处理。"watermark.js"文件提供了这种功能的实现,通过分析和学习这个插件的...

    再谈javascript 动态添加样式规则 W3C校检

    JavaScript 动态添加样式规则是前端开发中一种常见的技术,特别是在需要实时调整元素样式或创建交互效果时。本文将深入探讨如何使用JavaScript来动态添加、修改和管理样式规则,并确保这些规则符合W3C标准。 首先,...

    javascript动态操作表格

    // 添加样式类 ``` 在JavaScript中,还可以监听`click`事件来实现单元格的点击选择效果: ```javascript cell.addEventListener('click', function() { this.classList.toggle('selected'); }); ``` 最后,关于...

    IE下的JAVASCRIPT调试

    标题"IE下的JAVASCRIPT调试"直指主题,意味着我们将讨论的是在Internet Explorer环境中如何查找和修复JavaScript代码中的错误。由于IE的市场占有率逐渐下降,现代开发者可能更倾向于使用Chrome或Firefox等浏览器的...

    javascript动态显示钟表

    ### JavaScript动态显示钟表知识点详解 ...通过以上分析可以看出,使用JavaScript实现动态时钟不仅可以提升用户体验,还可以作为学习JS基础知识的一个良好实践项目。希望本文能够帮助你更好地理解和掌握相关知识点。

    IE7标签效果javascript

    总的来说,这个主题涉及的是如何使用JavaScript在IE7浏览器环境下实现类似现代浏览器的标签页功能,这需要对JavaScript的DOM操作、事件处理、样式控制以及浏览器兼容性有深入的理解。通过分析提供的HTML文件和示例...

    JavaScript动态添加style节点的方法

    在探讨JavaScript动态添加style节点的过程中,我们将重点阐述与JavaScript节点操作相关的技术细节。...通过以上介绍,开发者可以了解到如何在JavaScript中操作DOM来动态添加样式,进而实现更加动态和响应式的Web页面。

    Javascript的IE和Firefox兼容性问题集合

    JavaScript是一种广泛应用于网页和网络应用的编程语言,它在实现动态交互、页面更新以及与服务器通信等方面发挥着关键作用。然而,由于不同的浏览器对JavaScript的支持程度和实现方式存在差异,尤其是Internet ...

    javascript动态创建表格及添加数据实例详解

    通过编写JavaScript函数,可以向现有的表格中动态添加数据。这些函数在被触发时,会根据提供的数据结构(如对象或数组),循环创建表格行和单元格,并设置其内容。 #### 实例分析 1. 不兼容IE6的代码示例中展示了...

    javascript日历控件 兼容ie firefox opera

    综上所述,"javascript日历控件 兼容ie firefox opera"意味着开发者已经解决了不同浏览器之间的兼容性问题,为用户提供了一种可以在多种浏览器环境下稳定使用的日期选择工具。通过理解和应用上述技术,开发者可以...

    js添加css样式小技巧

    - 在IE浏览器中动态添加样式表。 #### 四、处理iframe中的样式 在处理`iframe`内的样式时,需要注意以下几点: **1. 创建iframe** ```javascript var iframe = document.createElement('iframe'); ``` **...

    完美解决IE6下select控件样式

    1. **样式覆盖**:通过添加自定义CSS类,覆盖IE6中select控件的默认样式,使其外观更接近现代浏览器的样式。 2. **事件处理**:使用JQuery的事件绑定功能,确保在select控件被选中或取消选中时,能正确触发相应的回...

    javascript登录时判断ie6,分别处理

    在标题提到的“javascript登录时判断ie6,分别处理”中,主要涉及到的是JavaScript在处理浏览器兼容性问题,特别是针对老旧版本的Internet Explorer(IE6)的特有情况。 在早期,IE6是市场份额较大的浏览器之一,但...

    ie6 ie7 ff浏览器兼容

    - **特征检测**:使用JavaScript进行特征检测,根据用户的浏览器类型和版本动态调整页面样式。 #### 总结 在面对浏览器兼容性问题时,开发者需要灵活运用多种技术手段,以确保页面能够在各种浏览器中正常显示。...

    兼容多种IE的javascript日期控件

    它是一个经过改造的calendar日期控件,旨在确保在不同版本的Internet Explorer(如IE6、IE8、IE9)中能够正常运行,尽管在Google浏览器中可能未通过测试。 JavaScript日期控件是一种用户界面元素,允许用户在网页上...

    解决IE6、IE7、IE8样式不兼容问题

    本文将深入探讨如何解决IE6、IE7、IE8下的样式兼容性问题,包括但不限于CSS hack技术、布局调整策略以及脚本修复方案。 #### 二、CSS Hack技术 **1. Conditional Comments与X-UA-Compatible** 为了区分不同的IE...

    javascript动态向网页中添加表格实现代码.docx

    ### JavaScript 动态向网页中添加表格实现...通过上述步骤,我们可以利用JavaScript动态地向网页中添加表格。这种方法不仅能够提高页面的灵活性,还能够让开发者更方便地处理和展示数据。希望这篇文章能对你有所帮助。

    IE滤镜操作(关于IE滤镜效果的一般演示,初级滤镜的学习操作,结合了HTML和Javascript,javascript)

    在互联网的早期,微软的Internet Explorer(IE)浏览器引入了一种独特的特性,称为"滤镜",这使得开发者可以通过CSS或JavaScript对网页元素应用特殊视觉效果。这些滤镜主要适用于IE,因为它们不是W3C标准的一部分,...

Global site tag (gtag.js) - Google Analytics