addRule在firefox下的兼容写法

 更新时间:2006年11月30日 00:00:00   作者:  
现在用脚本控制 html 元素样式的方法真的很多很多。
对单个元素可以直接 element.style.display=......修改一个样式,也可以 element.className=...修改它的多个样式。
对于多个元素修改样式可以用脚本直接 import  css文件。
目前项目中有这么一个需求。 要求改变某 div下所有子孙结点的样式,但不改变div本身样式。
我当时想都没有想就留下了一下代码:
复制代码 代码如下:

<style>
  span{background-color:blue;}
  input{background-color:gray}
  button{margin-top:70px;width:50px}
</style>
<!--  by Go_Rush(阿舜) from http://ashun.cnblogs.com/ --->
<div id="a1">
divdiv
  <span>
    spanspan
    <h2>ttttt</h2>
</span>
    <input>
</div>
<button onclick='document.styleSheets[0].addRule("#a1 *","background-color:red")'>转</button>

这段代码一直工作得很好,直到有一天我同事告诉我,我的模块让他的浏览器崩溃了。

我打着手电筒,拿着放大镜在近两千多行的代码中找了又找。.
根本找不到问题出在哪里,而且当时对于上面的代码丝毫没有怀疑过。
我们div 的id 是从数据库里面直接读取的,为数字类型,比如 <div id="345"></div>等等。
对于id 能取什么字符,我以前在 ie6和 ff1.5中测试过,
复制代码 代码如下:

<div id="阿舜"></div>
<div id="???"></div>
<div  id="-1"></div>

这样的id设置,都可以用 
document.getElementById("阿舜")
document.getElementById("???"),
document.getElementById("-1"),

读出来不会有问题,更何况是纯数字呢.

最后经过反复调试,找到这个罪魁祸首 addRule.
document.styleSheets[0].addRule("#a1 *","background-color:red")
document.styleSheets[0].addRule("#123 *","background-color:red")
都没有任何问题
下面这行代码却会让ie死掉. 内存和虚拟内存一直暴涨,我512的内存,一下子xp就提示虚拟内存不够。
document.styleSheets[0].addRule("#-1 *","background-color:red");
同样,在 ff1.5中,将导致函数出错,但不会崩溃。
总结:
   1。 ie,ff对 id 的取值相当宽容,id几乎可以是任何字符,中文,英文,字母,数字,负数,特殊字符
   2。 但是 addRule 函数中, id为负数时,在 ie和ff都会失败,而且ie会崩溃。
附: 
  addRule在 ff中的兼容写法
复制代码 代码如下:

<style>
  span{}{background-color:blue;}
  input{}{background-color:gray}
  button{}{margin-top:70px;width:50px}
</style>

<!--  by Go_Rush(阿舜) from http://ashun.cnblogs.com/ --->

<div id="a1">
divdiv
  <span>
    spanspan
    <h2>ttttt</h2>
</span>
    <input>
</div>
<script>
function f(){
  var rule="#a1 *{background-color:red}";
  var index=document.styleSheets[0].cssRules.length;
  document.styleSheets[0].insertRule(rule, index);
}
</script>

<button onclick=f()>转</button>

相关文章

  • 通过webpack引入第三方库的方法

    通过webpack引入第三方库的方法

    这篇文章主要介绍了通过webpack引入第三方库的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • JavaScript新功能介绍之findLast()和findLastIndex()

    JavaScript新功能介绍之findLast()和findLastIndex()

    最近工作中遇到了一个关于查找数组里面的目标元素的方法,所以下面这篇文章主要给大家介绍了关于JavaScript新功能之findLast() 和findLastIndex()的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 基于JavaScript+HTML编写一个日期选择插件

    基于JavaScript+HTML编写一个日期选择插件

    在现代Web应用程序中,日期选择器是一个非常常见的组件,用户可以使用它来选择特定的日期,在本篇文章中,我们将使用JavaScript和HTML来创建一个简单但功能强大的日期选择插件,这个日期选择插件是比较考验Js基本功的,需要的朋友可以参考下
    2023-10-10
  • 给Flash加一个超链接(推荐使用透明层)兼容主流浏览器

    给Flash加一个超链接(推荐使用透明层)兼容主流浏览器

    给一个Flash加一个超链接,原想直接在object外直接套一个超链接即可,试了之后却发现不是这么回事
    2013-06-06
  • 10种JavaScript最常见的错误(小结)

    10种JavaScript最常见的错误(小结)

    这篇文章主要介绍了10种JavaScript最常见的错误(小结),查看了数千个项目后,发现了 10 个最常见的 JavaScript 错误。我们会告诉你什么原因导致了这些错误,以及如何防止这些错误发生
    2019-06-06
  • JS ES6展开运算符的几个妙用

    JS ES6展开运算符的几个妙用

    这篇文章主要介绍了JS ES6展开运算符的几个妙用,想了解ES6的同学,可以参考下
    2021-04-04
  • 原生js添加一个或多个类名的方法分析

    原生js添加一个或多个类名的方法分析

    这篇文章主要介绍了原生js添加一个或多个类名的方法,结合实例形式分析了javascript针对页面元素属性动态操作相关实现技巧,需要的朋友可以参考下
    2019-07-07
  • 前端显示json格式化示例代码

    前端显示json格式化示例代码

    项目开发过程中遇到JSON字符串回显的情况,直接显示的话效果很丑,不方便查看,因此需要在前端页面对JSON进行格式化显示,下面这篇文章主要给大家介绍了关于前端显示json格式化的相关资料,需要的朋友可以参考下
    2024-03-03
  • javascript一段创建层的代码

    javascript一段创建层的代码

    javascript一段创建层的代码...
    2007-10-10
  • JavaScript中判断整字类型最简洁的实现方法

    JavaScript中判断整字类型最简洁的实现方法

    这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短、最简洁的实现方法,需要的朋友可以参考下
    2014-11-11

最新评论