IE6/7中setAttribute不支持class/for/rowspan/colspan等属性

 

如设置class属性

el.setAttribute('class', 'abc');

在IE6/7中样式“abc”将没有起作用,虽然使用el.getAttribute('class')能取到值“abc”。

 

又如for属性

<label>姓名:</label><input type="checkbox" id="name"/>
<script>
	var lab = document.getElementsByTagName('label')[0];
	lab.setAttribute('for', 'name');
</script>

我们知道当lab设置了for属性,点击label将自动将对应的checkbox选中。但以上设置在IE6/7点击将不会选中checkbox。

 

类似的情况还发生在 cellspacing/cellpadding 上。汇总如下:

  1. class
  2. for
  3. cellspacing
  4. cellpadding
  5. tabindex
  6. readonly
  7. maxlength
  8. rowspan
  9. colspan
  10. usemap
  11. frameborder
  12. contenteditable

 

因此,当写一个通用的跨浏览器的设置元素属性的接口方法时需要考虑注意以上属性在IE6/7中的特殊性。如下

dom = (function() {
	var fixAttr = {
		tabindex: 'tabIndex',
		readonly: 'readOnly',
		'for': 'htmlFor',
		'class': 'className',
		maxlength: 'maxLength',
		cellspacing: 'cellSpacing',
		cellpadding: 'cellPadding',
		rowspan: 'rowSpan',
		colspan: 'colSpan',
		usemap: 'useMap',
		frameborder: 'frameBorder',
		contenteditable: 'contentEditable'
	},
	
	div = document.createElement( 'div' );
	
	div.setAttribute('class', 't');
	
	var supportSetAttr = div.className === 't';
	
	return {
		setAttr : function(el, name, val) {
			el.setAttribute(supportSetAttr ? name : (fixAttr[name] || name), val);
		},
		getAttr : function(el, name) {
			return el.getAttribute(supportSetAttr ? name : (fixAttr[name] || name));
		}
	}
})();

  

首先,标准浏览器直接使用原始属性名;其次,IE6/7非以上列举的属性仍然用原始属性名;最后这些特殊属性(与JS关键字同名如for,class)使用fixAttr。

 

好了,现在不用考虑className/htmlFor了,都使用class/for即可。

dom.setAttr(el, 'class', 'red');
dom.getAttr(el, 'class');
dom.setAttr(el, 'for', 'userName');
dom.getAttr(el, 'for');

 

相关:

IE6/7中使用setAttribute设置table的cellpadding和cellspacing的Bug

设置元素class的三种方式

posted on 2011-08-27 10:26  snandy  阅读(5298)  评论(3编辑  收藏  举报