在做DHTML的前端开发过程中,经常需要动态的添加、移除或者获取元素的Attribute。也就是说经常会用到setAttribute、removeAttribute和getAttribute。同时与getAttribute(attri)配对来得到相应的自定义attribute的值。昨天遇到的一个IE bug,开发将一个自定义属性中的一个字母写成了大写,结果造成IE浏览器下的判断失效。今天要讨论的是开发中遇到的几处IE浏览器与Firefox对Attribute操作的差异。这里记录一下,并在其它浏览器下作了测试,希望大家在IE浏览器下处理Attribute元素的时候要小心。
属性名大小写
在Firefox中,属性没有小写的概念,就算属性名全用大写,Firefox也会解析成小写,用Firebug看就能看到。所以下面的代码在Firefox与IE浏览器中运行结果会不一样。
假设有下面一个button,怎么可以得到button的value属性?
其实上,在IE下,无论是btn.getAttribute(”value”)、btn.value、btn.innerHTML还是btn.innerText都得”b”,但是在Firefox下,btn.getAttribute(”value”)、btn.value得到的都是”a”,btn.innerHTML得到的是”b”。也就是说我们如果要在button上加自定义属性,不要用”value”做属性名,否则在IE下没办法取到值。
getAttribute返回值类型不同
看一下下面的代码,你认为IE与Firefox分别会返回什么?
IE下,getAttribute(”onclick”)返回的是一个function,直接可以调用,Firefox下则返回一个string,直接调用会出错。
测试的代码:
如果设置一个自定义属性data-Maxvalue,那么除ie外的所有浏览器都会忽略大小写而统一解析为data-maxvalue,可以用各自的developer tool查看下,而且在读取的时候也会忽略大小写,都不会造成读值、设值的问题,但是在ie浏览器下,显得非常的复杂。
在使用getAttribute读值的时候,ie会把里边的值忽略大小写,而去匹配html里的属性值,然后返回,使用setAttribute去设置的时候,ie同样会忽略大小写而去正确的设置html里的属性值,但是这个值你读不到,当你再去使用getAttribute去获取的时候,读到的依然是最初默认的值。只有你正确的书写attribute的值,并设置的时候才能正确的读取。也就是说,当你使用setAttribute去设置的时候一定要和源码里的大小写保持一致,而当你在使用getAttribute去读取的时候可以忽略其大小写。
Demo测试地址:http://www.iefans.net/wp-demo/attribute-ie.html
测试浏览器:IE6、IE7、IE8、Opera 10.10(Build 1893)、Firefox 3.5.6、Chrome 3.0.195.38、Safari 4.0.3(531.9.1)。
总结:这个bug虽然看上很小,但却是个不大不小的陷阱,一旦你不小心掉了进去,在大量的代码中寻找这个bug着实会让你头痛。为了避免不必要的问题发生,在设置自定义属性的时候不要有大小写之分。对于html节点本身有的attribute,则应该依照ie浏览器的解析去书写,比如colSpan、rowSpan、frameBorder等等。