addRule在firefox下的兼容写法

  现在用脚本控制 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>