博客园 :: 首页 ::  ::  ::  :: 管理
现在用脚本控制 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中的兼容写法

firefox下的addRule---(insertRule)

 


 

Feedback

#1楼  回复 引用   

2006-11-29 23:00 by TJBLOG[未注册用户]
seen
欢迎回访我的个人BLOG,S
阅读了你的这篇文章,
My blog:
http://blog.run2me.com/jiangyouxiaozi/

#2楼  回复 引用   

2006-11-30 00:01 by cody[匿名][未注册用户]
拿来恶作剧先,,呼呼

#3楼[楼主]  回复 引用 查看   

2006-11-30 00:40 by Go_Rush      
@TJBLOG
欢迎光临鄙站

#4楼  回复 引用 查看   

2006-11-30 08:59 by 布尔      
看你的名字Go_Rush,你是不是比较喜欢打游戏啊,呵呵

#5楼  回复 引用 查看   

2006-11-30 09:16 by 风云      
细微之处见技术

#6楼  回复 引用 查看   

2006-11-30 11:12 by Harrison      
测试了一下,IE6会有问题,IE7已经没问题了

#7楼[楼主]  回复 引用 查看   

2006-11-30 11:35 by Go_Rush      
@Harrison
是吗? 我手头没有 ie7. 是完全修复正确了,还是在ie7下不会崩溃,但不运行

#8楼[楼主]  回复 引用 查看   

2006-11-30 11:36 by Go_Rush      
@风云
为了找这个错误,我当时找了好久呀,呵呵

#9楼[楼主]  回复 引用 查看   

2006-11-30 11:37 by Go_Rush      
@布尔
是的,游戏我只玩星际和罗马复兴,罗马我不惧怕任何高手,星际我不惧怕任何中手。

#10楼  回复 引用   

2006-11-30 13:32 by ChuPaChuPs[未注册用户]
一定是z吧,我也是z,最近goRush不太行啊...看ipx的了,haha

#11楼[楼主]  回复 引用 查看   

2006-11-30 19:05 by Go_Rush      
@ChuPaChuPs
No, 是P, P才具有灵气和激情。我比较喜欢技术含量高的东西,种族也一样

#12楼  回复 引用   

2006-12-23 11:39 by 快乐笛子[未注册用户]
《网站重构》里面对元素id的命名规则有描述:不能用数字开头,class好像也一样。
除了id与class,我们常用的属性(自定义属性)、变量、函数等最好都不要用数字开头啊,这是个避免意外的好习惯,xixixi~~~~

#13楼[楼主]  回复 引用 查看   

2006-12-24 02:45 by Go_Rush      
js 没有纵容我们的坏习惯,因为 变量,函数如果用数字开头的话,运行是通不过的
会报错的.
就是ie纵容了我们的, 用一些非法的字符做id都可以,这对我们来说是祸不是福

#14楼  回复 引用 查看   

2011-06-15 19:43 by K_Reverter      
我也遇到类似的问题,在楼主的提示下解决了,另外,我发现下划线开头的ID也是不行的,IE6真晕