js Event對(duì)象的5種坐標(biāo)
更新時(shí)間:2011年09月12日 14:08:34 作者:
使用鼠標(biāo)事件經(jīng)常碰到這樣的需求,比如獲取鼠標(biāo)相對(duì)于事件源的位置,鼠標(biāo)相對(duì)于事件源對(duì)象父元素的位置
但是你懂的,瀏覽器實(shí)在太不和諧了,兼容性且不說(shuō),各種坐標(biāo)屬性看得人頭昏眼花,極容易混淆。好吧,我來(lái)總結(jié)一下:
測(cè)試瀏覽器:IE8, Chrome13, FF8, Safari5, Opera11
先上測(cè)試用例(用HTML5的doctype測(cè)試,也可看出未來(lái)的發(fā)展趨勢(shì),其他doctype可自行測(cè)試):
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<style type="text/css">
html {
background:red;
}
body {
background:green;
}
#null {
height:1000px;
}
#btn {
cursor:default;
background:blue;
width:50px;
height:30px;
line-height:30px;
text-align:center;
}
</style>
</head>
<body>
<div id='null'>空白區(qū)</div>
<div id="btn">點(diǎn)擊</div><!-- 按鈕用DIV是因?yàn)樵粹o有圓角,不確定邊界 -->
</body>
<script type="text/javascript">
window.onload = function(){
var btn = document.getElementById('btn');
btn.onclick = function(e){
e = e|| window.event;
var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;
p('x: '+ e.x+', y: '+e.y);
p('pageX: '+ e.pageX+', pageY: '+e.pageY);
p('offsetX: '+ e.offsetX+', offsetY: '+e.offsetY);
p('FF實(shí)現(xiàn) offsetX: '+offsetX+', offsetY: '+offsetY);
p('layerX: '+ e.layerX+', layerY: '+e.layerY);
p('clientX: '+ e.clientX+', clientY: '+e.clientY);
p('body.scrollLeft: '+ document.body.scrollLeft+', body.scrollTop: '+document.body.scrollTop);
p('body.clientLeft: ' + document.body.clientLeft + ', body.clientTop: '+document.body.clientTop);
p('documentElement.scrollLeft: '+ document.documentElement.scrollLeft+', documentElement.scrollTop: '+document.documentElement.scrollTop);
p('documentElement.clientLeft: ' + document.documentElement.clientLeft + ', documentElement.clientTop: '+document.documentElement.clientTop);
}
}
function p(s){
console.log(s);
}
</script>
</html>
問(wèn):怎樣獲取鼠標(biāo)相對(duì)于瀏覽器可視文檔區(qū)域左上角的位置?
答:x, y和clientX, clientY皆可,但是x, y在IE下表示鼠標(biāo)相對(duì)于文檔開頭的位置(即如果有滾到條的話,會(huì)計(jì)算在內(nèi)),還有FF也不支持x, y
推薦: clientX, clientY
問(wèn):怎樣獲取鼠標(biāo)相對(duì)于文檔開頭的位置?
答: IE:使用x, y(前提是事件源的父元素(一直到documentElement)沒(méi)有設(shè)置position:relative之類的,否則相對(duì)于最近元素,而非相對(duì)于文檔)
非IE:使用pageX, pageY
layerX, layerY其實(shí)也可以,但是IE和Opera不支持!
那么如何確保IE正常取值呢?答:event.clientX + document.documentElement.scrollLeft, event.clientY + document.documentElement.scrollTop
問(wèn):怎樣獲取鼠標(biāo)相對(duì)于事件源(event.target||event.srcElement)左上角的位置?
答:offsetX, offsetY。但是FF不支持,怎樣辦呢?
1. 先獲取鼠標(biāo)相對(duì)于瀏覽器可視文檔區(qū)域左上角的位置
2. 然后獲取事件源相對(duì)于瀏覽器可視文檔區(qū)域左上角的位置
3. 相減,收工
也許有人會(huì)問(wèn),這第2步怎么做???好吧,好人做到底!
HTMLElement.getBoundingClientRect()方法
返回值為:{top:xx, right:xx, bottom:xx, left:xx, width:xx, height:xx}
也就是說(shuō),一個(gè)元素的位置信息都給了,我們要做的就是:
var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;
經(jīng)測(cè)試,所有瀏覽器都和event.offsetX, event.offsetY保持一致(當(dāng)然FF除外)
我的例子中,最后還檢測(cè)了scrollLeft, scrollTop, clientLeft, clientTop,本來(lái)以為它們幾個(gè)會(huì)作怪,可測(cè)試結(jié)果表明:
除了scrollTop,其他都是0(當(dāng)然scrollLeft是因?yàn)闆](méi)出現(xiàn)橫向滾動(dòng)條所致)
scrollTop各瀏覽器表現(xiàn)不盡相同,如下:
body.scrollTop的情況
IE, FF, Opera:0
Chrome, Safari:向上滾動(dòng)的距離
documentElement.scrollTop的情況
IE, FF, Opera:向上滾動(dòng)的距離
Chrome, Safari:0
測(cè)試瀏覽器:IE8, Chrome13, FF8, Safari5, Opera11
先上測(cè)試用例(用HTML5的doctype測(cè)試,也可看出未來(lái)的發(fā)展趨勢(shì),其他doctype可自行測(cè)試):
復(fù)制代碼 代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<style type="text/css">
html {
background:red;
}
body {
background:green;
}
#null {
height:1000px;
}
#btn {
cursor:default;
background:blue;
width:50px;
height:30px;
line-height:30px;
text-align:center;
}
</style>
</head>
<body>
<div id='null'>空白區(qū)</div>
<div id="btn">點(diǎn)擊</div><!-- 按鈕用DIV是因?yàn)樵粹o有圓角,不確定邊界 -->
</body>
<script type="text/javascript">
window.onload = function(){
var btn = document.getElementById('btn');
btn.onclick = function(e){
e = e|| window.event;
var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;
p('x: '+ e.x+', y: '+e.y);
p('pageX: '+ e.pageX+', pageY: '+e.pageY);
p('offsetX: '+ e.offsetX+', offsetY: '+e.offsetY);
p('FF實(shí)現(xiàn) offsetX: '+offsetX+', offsetY: '+offsetY);
p('layerX: '+ e.layerX+', layerY: '+e.layerY);
p('clientX: '+ e.clientX+', clientY: '+e.clientY);
p('body.scrollLeft: '+ document.body.scrollLeft+', body.scrollTop: '+document.body.scrollTop);
p('body.clientLeft: ' + document.body.clientLeft + ', body.clientTop: '+document.body.clientTop);
p('documentElement.scrollLeft: '+ document.documentElement.scrollLeft+', documentElement.scrollTop: '+document.documentElement.scrollTop);
p('documentElement.clientLeft: ' + document.documentElement.clientLeft + ', documentElement.clientTop: '+document.documentElement.clientTop);
}
}
function p(s){
console.log(s);
}
</script>
</html>
問(wèn):怎樣獲取鼠標(biāo)相對(duì)于瀏覽器可視文檔區(qū)域左上角的位置?
答:x, y和clientX, clientY皆可,但是x, y在IE下表示鼠標(biāo)相對(duì)于文檔開頭的位置(即如果有滾到條的話,會(huì)計(jì)算在內(nèi)),還有FF也不支持x, y
推薦: clientX, clientY
問(wèn):怎樣獲取鼠標(biāo)相對(duì)于文檔開頭的位置?
答: IE:使用x, y(前提是事件源的父元素(一直到documentElement)沒(méi)有設(shè)置position:relative之類的,否則相對(duì)于最近元素,而非相對(duì)于文檔)
非IE:使用pageX, pageY
layerX, layerY其實(shí)也可以,但是IE和Opera不支持!
那么如何確保IE正常取值呢?答:event.clientX + document.documentElement.scrollLeft, event.clientY + document.documentElement.scrollTop
問(wèn):怎樣獲取鼠標(biāo)相對(duì)于事件源(event.target||event.srcElement)左上角的位置?
答:offsetX, offsetY。但是FF不支持,怎樣辦呢?
1. 先獲取鼠標(biāo)相對(duì)于瀏覽器可視文檔區(qū)域左上角的位置
2. 然后獲取事件源相對(duì)于瀏覽器可視文檔區(qū)域左上角的位置
3. 相減,收工
也許有人會(huì)問(wèn),這第2步怎么做???好吧,好人做到底!
HTMLElement.getBoundingClientRect()方法
返回值為:{top:xx, right:xx, bottom:xx, left:xx, width:xx, height:xx}
也就是說(shuō),一個(gè)元素的位置信息都給了,我們要做的就是:
復(fù)制代碼 代碼如下:
var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;
經(jīng)測(cè)試,所有瀏覽器都和event.offsetX, event.offsetY保持一致(當(dāng)然FF除外)
我的例子中,最后還檢測(cè)了scrollLeft, scrollTop, clientLeft, clientTop,本來(lái)以為它們幾個(gè)會(huì)作怪,可測(cè)試結(jié)果表明:
除了scrollTop,其他都是0(當(dāng)然scrollLeft是因?yàn)闆](méi)出現(xiàn)橫向滾動(dòng)條所致)
scrollTop各瀏覽器表現(xiàn)不盡相同,如下:
body.scrollTop的情況
IE, FF, Opera:0
Chrome, Safari:向上滾動(dòng)的距離
documentElement.scrollTop的情況
IE, FF, Opera:向上滾動(dòng)的距離
Chrome, Safari:0
相關(guān)文章
關(guān)于ligerui子頁(yè)面關(guān)閉后,父頁(yè)面刷新,重新加載的方法
今天小編就為大家分享一篇關(guān)于ligerui子頁(yè)面關(guān)閉后,父頁(yè)面刷新,重新加載的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
nullJavascript中創(chuàng)建對(duì)象的五種方法實(shí)例
今天上午,非常郁悶,有很多簡(jiǎn)單基礎(chǔ)的問(wèn)題搞得我有些迷茫,哎,代碼幾天不寫就忘。目前又不當(dāng)COO,還是得用心記代碼哦!2013-05-05
js判斷手機(jī)號(hào)是否正確并返回的實(shí)現(xiàn)代碼
這篇文章主要介紹了js判斷手機(jī)號(hào)是否正確并返回的實(shí)現(xiàn)代碼,以及使用正則表達(dá)式判斷手機(jī)號(hào)是否正確,需要的的朋友參考下2017-01-01
JavaScript輸入框字?jǐn)?shù)實(shí)時(shí)統(tǒng)計(jì)更新
這篇文章主要介紹了JavaScript輸入框字?jǐn)?shù)實(shí)時(shí)統(tǒng)計(jì)更新,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
"好玩的放大鏡效果" 的另一種實(shí)現(xiàn)方法
"好玩的放大鏡效果" 的另一種實(shí)現(xiàn)方法...2006-11-11
瀏覽器兼容console對(duì)象的簡(jiǎn)要解決方案分享
不同瀏覽器或者版本之間對(duì)于console對(duì)象的支持不盡相同,而console方法在開發(fā)調(diào)試過(guò)程中都是不錯(cuò)的工具。難道要在上線前把所有console.xxxx去掉以保證某些瀏覽器不報(bào)錯(cuò)么。其實(shí)可以變通解決2013-10-10
js 能實(shí)現(xiàn)監(jiān)聽F5頁(yè)面刷新子iframe 而父頁(yè)面不刷新的方法
下面小編就為大家?guī)?lái)一篇js 能實(shí)現(xiàn)監(jiān)聽F5頁(yè)面刷新子iframe 而父頁(yè)面不刷新的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
js實(shí)現(xiàn)1,2,3,5數(shù)字按照概率生成
這篇文章主要介紹了js實(shí)現(xiàn)1,2,3,5數(shù)字按照概率生成,需要的朋友可以參考下2017-09-09

