欢迎各位兄弟 发布技术文章
这里的技术是共享的
今天同事们因为jQuery.attr('class')与jQuery.attr('className')这二个操作起了谁对谁错问题,事实上这个的操作最后的结果都是一样的,他的作用是,取得或更新Html Element的Class,如下的范例:
1 | < div id = "div1" class = 'ABC D' ></ div > |
你一次想把div1的所有class换成E、F、G、H,用jQuery.addClass与jQuery.removeClass,太累了,一次处理不是很好吗,所以可以下:
1 | $( '#div1' ).attr( 'class' , 'EFG H' ); |
2 | // 二者是一样的结果 //二者的结果是一样的 |
3 | $( '#div1' ).attr( 'className' , 'EFG H' ); |
你会好奇为什么二个同样的操作,要写二种方式,这是有渊源的。
在HTML Dom中没有一个叫class的属性,反而叫className(我不知道为什么)
图1 来源W3C School
所以上面的范例改成DOM来写
1 | document.getElementById( 'div1' ).className= 'EFG H' //正常 |
2 | document.getElementById( 'div1' ).class= 'EFG H' //失败 |
为什么换成jQuery又会对呢?
因为jQuery有作转换。
在如jquery-1.4.1.js中的第967行开始,会设定在jQuery用的关键字,对应的实际关键字是什么?
967 | jQuery.props = { |
968 | "for" : "htmlFor" , |
969 | "class" : "className" , |
970 | readonly: "readOnly" , |
971 | maxlength: "maxLength" , |
972 | cellspacing: "cellSpacing" , |
973 | rowspan: "rowSpan" , |
974 | colspan: "colSpan" , |
975 | tabindex: "tabIndex" , |
976 | usemap: "useMap" , |
977 | frameborder: "frameBorder" |
978 | }; |
而jQuery在呼叫时attr时,name会寻找对应。
1463 | name = notxml && jQuery.props[ name ] || name; |
所以输入class,事实上会返回className。
二者
不过硬要说二者谁对谁错,好像没有意义,因为二者都对,各有优缺,只要专案成员用一致的写法,我想就可以了吧。
来自 http://www.dotblogs.com.tw/wadehuang36/archive/2010/08/25/jqueryattrclassname.aspx
<script type="text/javascript" src="js/jquery-1.3.2.js"></script>
<style>
.t1{background:red}
</style>
<script>
var cur;
window.onload=function(){
$("li").click(function(){
if(cur == $(this)[0]) return false;
if(cur!=null) cur.className = "";
$(this)[0].className = "t1";
cur = $(this)[0];
})
}
</script>
<ul>
<li>aaaaa </li>
<li>bbb </li>
<li>ccc </li>
</ul>
$(document).ready(function(){ $('span').mouseover(function(){ alert($(this).attr('class')); }); });
<script type=
"text/javascript"
>
$(document).ready(
function
(){
$(
"li"
).click(
function
(){
$(
"li"
).removeClass();
$(
this
).addClass(
"t1"
);
});
})
</script>