1、pageX和clientX
在jQuery中用pageX表示鼠標坐標,而在原生中用clientX。區別:clientX是相對于可視區域,而pageX則相對于文檔,client加上滾動條就是page。
<script>
$(document).on('mousemove',function(e){
console.log('e.pageY',e.pageY)
console.log('e.clientY',e.clientY)
})
</script>
當body高度設為2000px的時候,下拉出現滾動條的時候,pageY和clientY會有明顯的,pageY是相對文檔頂站的高度,而clientY則是相對于可視區域頂部的高度。
2、e.which和e.keyCode
e.which是jQuery里的,而e.keyCode是原生JS中的。e.which不僅可以返回對應鍵盤的數字,還可以返回對應鼠標的數字。
<script>
$('input').on({
keydown: function(e){
console.log(e.keyCode)
},
keyup :function(e){
console.log(e.which)
}
})
</script>
3、e.preventDefault()和e.stopPropagation()
前者是阻止默認事件,而后者則是阻止冒泡。
<script>
$('span').on('click',function(e){
console.log('span被點擊了')
e.stopPropagation() //寫成return false也行
})
$('p').on('click',function(){
console.log('p被點擊了')
})
$('div').on('click',function(){
console.log('div被點擊了')
})
</script>
這一段代碼的html代碼格式是:span在p里,p在div里。通過e.stopPropagation()方法,當點擊span時,冒泡事件被阻止,后面的兩個事件就不會被觸發。
return false就是既阻止默認事件,也阻止冒泡。
4、on()和one()
one其實就是將事件只執行一次,之后就不再執行了。
$('div').one('click',function(){
console.log('div被點擊了')
})
它在某種程度上和下面這段代碼是一樣的:
$('div').on('click',function(){
console.log('div被點擊了')
$('div').off()
})
5、offset()和offsetLeft/Top
和前面的一樣,offset()是jQuery的方法,而后者則是原生的API。兩者的區別在于,offset()返回距離文檔左側和頂部的距離。而對于offsetLeft/Top來說,如果它的offsetParent沒有定位的話,就是相對于文檔的距離,如果有定位的話就是相對于offsetParent的距離。
console.log($('#child').offset().top)
console.log($('#child').offset().left)
console.log(child.offsetLeft)
console.log(child.offsetTop)
后兩個的值會視offsetParent的定位情況有所變化。提一下,child.offsetHeight/Width是獲取元素本身的寬高。
child.offsetWidth
child.offsetHeight
6、position()方法
這個方法稍微有點繞,它是把當前元素轉換成定位元素以獲取它的偏移量。當然,和上面JS的原生的offsetTop/Left一樣,它是相對于祖先級的,祖先級中有定位,那么就相對于有定位的祖先級,如果沒有就一直往上找直到找到body。
特別注意,position()獲取的是偏移量,是不包括margin和padding的
<style>
*{
padding:0;
margin:0;
}
body{
border:1px solid green;
}
div#parent{
width:100px;
height:100px;
margin:30px;
background:red;
position:absolute;
}
div#child{
width:50px;
height:50px;
margin:20px;
background:green;
position:absolute;
left:20px;
}
</style>
<script>
console.log($('#child').position().left)
</script>
得到的結果是20。
注意,以上的代碼如果兩parent和child都沒有定位的話,它獲取的主是到左側的body的偏移量,也就是parent的左側margin。如果parent給了定位而child沒有定位,那么這個值就是0(因為沒有相對有定位的父級沒有偏移嘛)