教你javascript如何獲取指針的位置
javascript獲取指針的位置的方法:使用事件對(duì)象的pageX和pageY,或者clientX和clientY屬性,并且配合scrollLeft和scrollTop屬性,這樣就可以計(jì)算出指針的位置了。

本文操作環(huán)境:windows10系統(tǒng)、javascript 1.8.5、thinkpad t480電腦。
要想獲取指針在頁(yè)面中的位置,可以使用事件對(duì)象的pageX和pageY,或者是 clientX 和 clientY(兼容 IE)屬性,同時(shí)還需要配合 scrollLeft 和 scrollTop 屬性,這樣就可以計(jì)算出鼠標(biāo)指針在頁(yè)面中的位置了。
//獲取鼠標(biāo)指針的頁(yè)面位置
//參數(shù):e表示當(dāng)前事件對(duì)象
//返回值:返回鼠標(biāo)相對(duì)頁(yè)面的坐標(biāo),對(duì)象格式(x,y)
function getMP (e) {
var e = e || window.event;
return {
x : e.pageX || e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft),
y : e.pageY || e.clientY + (document.documentElement.scrollTop || document.body.scrollTop)
}
}
pageX 和 pageY 事件屬性不被 IE 瀏覽器支持,而 clientX 和 clientY 事件屬性又不被 Safari 瀏覽器支持,因此可以混合使用它們以兼容不同瀏覽器。對(duì)于怪異模式來(lái)說(shuō),body 元素代表頁(yè)面區(qū)域,而 html 元素被隱藏,但是標(biāo)準(zhǔn)模式以 html 元素代表頁(yè)面區(qū)域,而 body 元素僅是一個(gè)獨(dú)立的頁(yè)面元素,所以需要兼容這兩種解析方式。
下面示例演示了如何調(diào)用上面擴(kuò)展函數(shù) getMP() 捕獲當(dāng)前鼠標(biāo)指針在文檔中的位置。
<body style="width:2000px;height:2000px;">
<textarea id="t" cols="15" rows="4" style="position:fixed;left:50px;top:50px;"></textarea>
</body>
<script>
var t = document.getElementById("t");
document.onmousemove = function(e){
var m = getMP(e);
t.value ="mouseX = " + m.x + "\n" + "mouseY = " + m.y
}
</script>
演示效果如下:

獲取指針的相對(duì)位置
使用 offsetX 和 offsetY 或者 layerX 和 layerY 可以獲取鼠標(biāo)指針相對(duì)定位包含框的偏移位置。如果使用 offsetLeft 和 offsetTop 屬性獲取元素在定位包含框中的偏移坐標(biāo),然后使用 layerx 屬性值減去 offsetLeft 屬性值,使用 layery 屬性值減去 offsetTop 屬性值,即可得到鼠標(biāo)指針在元素內(nèi)部的位置。
//獲取鼠標(biāo)指針在元素內(nèi)的位置
//參數(shù):e表示當(dāng)前事件對(duì)象,o表示當(dāng)前元素
//返回值:返回相對(duì)坐標(biāo)對(duì)象
function getME (e, o) {
var e = e || window.event;
return {
x : e.offsetX || (e.layerX - o.offsetLeft),
y : e.offsetY || (e.layerY - o.offsetTop)
}
}
在實(shí)踐中上面函數(shù)存在以下兩個(gè)問(wèn)題:
- Mozilla 類型和 Safari 瀏覽器以元素邊框外壁的左上角為參照點(diǎn)。
- 其他瀏覽器則是以元素邊框內(nèi)壁的左上角為坐標(biāo)原點(diǎn)。
考慮到邊框?qū)κ髽?biāo)位置的影響,當(dāng)元素邊框很寬時(shí),必須考慮如何消除邊框?qū)τ谑髽?biāo)位置的影響。但是,由于邊框樣式不同,它存在 3 像素的默認(rèn)寬度,為獲取元素的邊框?qū)嶋H寬度帶來(lái)了麻煩。需要設(shè)置更多的條件,來(lái)判斷當(dāng)前元素的邊框?qū)挾取?/p>
示例
完善后的獲取鼠標(biāo)指針在元素內(nèi)的位置擴(kuò)展函數(shù)如下:
//完善獲取鼠標(biāo)指針在元素內(nèi)的位置
//參數(shù):e表示當(dāng)前事件對(duì)象,o表示當(dāng)前元素
//返回值:返回鼠標(biāo)相對(duì)元素的坐標(biāo)位置,其中x表示x軸偏移距離,y表示y軸偏移距離
function getME(e, o){
var e = e || window.event;
//獲取元素左側(cè)邊框的寬度
//調(diào)用getStyle()擴(kuò)展函數(shù)獲取邊框樣式值,并嘗試轉(zhuǎn)換為數(shù)值,如果轉(zhuǎn)換成功,則賦值。
//否則判斷是否定義了邊框樣式,如果定義邊框樣式,且值不為none,則說(shuō)明邊框?qū)挾葹槟J(rèn)值,即為3像素。
//如果沒(méi)有定義邊框樣式,且寬度值為auto,則說(shuō)明邊框?qū)挾葹?
var bl = parseInt(getStyle(o, "borderLeftWidth")) || ((o.style.borderLeftStyle && o.style.borderLeftStyle != "none" )? 3 : 0);
//獲取元素頂部邊框的寬度,設(shè)計(jì)思路與獲取左側(cè)邊框方法相同
var bt = parseInt(getStyle(o, "borderTopWidth")) || ((o.style.borderTopStyle && o.style.borderTopStyle !="none" ) ? 3 : 0);
var x = e.offsetX || (e.layerX - o.offsetLeft - bl); // 一般瀏覽器下鼠標(biāo)偏移值
//兼容Mozilla類型瀏覽器,減去邊框?qū)挾?
var y = e.offsetY || (e.layerY - o.offsetTop - bt); // 一般瀏覽器下鼠標(biāo)偏移值
//兼容Mozilla類型瀏覽器,減去邊框?qū)挾?
var u = navigator.userAgent; // 獲取瀏覽器的用戶數(shù)據(jù)
if( (u.indexOf("KHTML") > - 1) ||(u.indexOf("Konqueror") > - 1) || (u.indexOf("AppleWebKit") > - 1)
){ // 如果是Safari瀏覽器,則減去邊框的影響
x -= bl; y -= bt;
} return { // 返回兼容不同瀏覽器的鼠標(biāo)位置對(duì)象,以元素邊框內(nèi)壁左上角為定位原點(diǎn)
x : x, y : y
}
}
演示效果如下:

推薦學(xué)習(xí):javascript視頻教程
到此這篇關(guān)于javascript獲取指針的位置的文章就介紹到這了,更多相關(guān)js指針的位置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
bootstrap table合并行數(shù)據(jù)并居中對(duì)齊效果
這篇文章主要為大家詳細(xì)介紹了bootstrap table合并行數(shù)據(jù)并居中對(duì)齊效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
innerhtml用法 innertext用法 以及innerHTML與innertext的區(qū)別
innerhtml用法 innertext用法 以及innerHTML與innertext的區(qū)別,看完這個(gè)大家以后在實(shí)際應(yīng)用中,就可以選擇合適的方法。盡可能的考慮到兼容性。2009-10-10
JavaScript如何使用dhtmlXTreeObject的loadJSONObject繪制目錄樹(shù)
這篇文章主要介紹了JavaScript如何使用dhtmlXTreeObject的loadJSONObject繪制目錄樹(shù),需要引入dhtmlXTreeObject的css和js文件,這里還需要注意js的引用順序,本文給大家介紹的非常詳細(xì),需要的的朋友參考下吧2023-11-11
JS關(guān)閉窗口或JS關(guān)閉頁(yè)面的幾種代碼分享
這篇文章介紹了JS關(guān)閉窗口或JS關(guān)閉頁(yè)面的幾種代碼,有需要的朋友可以參考一下2013-10-10
javascript實(shí)現(xiàn)判斷鼠標(biāo)的狀態(tài)
這篇文章主要介紹了javascript實(shí)現(xiàn)判斷鼠標(biāo)的狀態(tài)的相關(guān)代碼,十分簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-07-07
js圖片閃動(dòng)特效可以控制間隔時(shí)間如幾分鐘閃動(dòng)一下
這篇文章主要介紹一個(gè)圖片閃動(dòng)特效,可以控制間隔時(shí)間如幾分鐘閃動(dòng)一下,需要的朋友不要錯(cuò)過(guò)2014-08-08

