最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript 事件對象 坐標(biāo)事件說明

 更新時間:2010年05月31日 23:21:18   作者:  
javascript 事件對象 坐標(biāo)事件說明,學(xué)習(xí)js坐標(biāo)事件的朋友可以參考下。
測試瀏覽器的版本:

IETester 6 ,7
IE 8.0
Firefox 3.5.5
Chrome 4.1.249.1064 (45376)
Opera 9.64
Safari 4.0


先來看看各個主流瀏覽器都有哪些坐標(biāo)屬性以及它們的意義

在IE中

event.offsetX
event.offsetY
相對于e.srcElement坐標(biāo)
設(shè)置或獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的 x 坐標(biāo)。
設(shè)置或獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的 y 坐標(biāo)。


event.clientX
event.clientY
總是相對于視口
設(shè)置或獲取鼠標(biāo)指針位置相對于窗口客戶區(qū)域的 x 坐標(biāo),其中客戶區(qū)域不包括窗口自身的控件和滾動條。
設(shè)置或獲取鼠標(biāo)指針位置相對于窗口客戶區(qū)域的 y 坐標(biāo),其中客戶區(qū)域不包括窗口自身的控件和滾動條。


event.x
event.y
雖然手冊上說是相對于文檔,但是ie6/7 中,他們倆的值跟clientX,clientY一致
但是這并不是嚴(yán)重的問題,因為視口相對坐標(biāo)加上滾動條已卷去高度,依然可以得到真實的x(y),這個問題在ie8的標(biāo)準(zhǔn)模式下被解決

設(shè)置或獲取鼠標(biāo)指針位置相對于父文檔的 x 像素坐標(biāo)。
設(shè)置或獲取鼠標(biāo)指針位置相對于父文檔的 y 像素坐標(biāo)。

event.screenX
event.screenY
設(shè)置或獲取獲取鼠標(biāo)指針位置相對于用戶屏幕的 x 坐標(biāo)。
設(shè)置或獲取獲取鼠標(biāo)指針位置相對于用戶屏幕的 y 坐標(biāo)。

在FireFox中

event.layerX
event.layerY
相對于e.srcElement坐標(biāo)
設(shè)置或獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的 x 坐標(biāo)。
設(shè)置或獲取鼠標(biāo)指針位置相對于觸發(fā)事件的對象的 y 坐標(biāo)。

event.clientX
event.clientY
總是相對于視口
設(shè)置或獲取鼠標(biāo)指針位置相對于窗口客戶區(qū)域的 x 坐標(biāo),其中客戶區(qū)域不包括窗口自身的控件和滾動條。
設(shè)置或獲取鼠標(biāo)指針位置相對于窗口客戶區(qū)域的 y 坐標(biāo),其中客戶區(qū)域不包括窗口自身的控件和滾動條。


event.pageX
event.pageY
設(shè)置或獲取鼠標(biāo)指針位置相對于父文檔的 x 像素坐標(biāo)。
設(shè)置或獲取鼠標(biāo)指針位置相對于父文檔的 y 像素坐標(biāo)。


event.screenX
event.screenY
設(shè)置或獲取獲取鼠標(biāo)指針位置相對于用戶屏幕的 x 坐標(biāo)。
設(shè)置或獲取獲取鼠標(biāo)指針位置相對于用戶屏幕的 y 坐標(biāo)。


實際上IE和Firefox已經(jīng)囊括了所有的屬性,其他的瀏覽器將這些屬性進行了組合,但是意義完全一致

Chrome 和 Safari
Chrome和Safari這哥倆辦事兒則灰常周全,它們收錄了所有的坐標(biāo)屬性,包括

event.offsetX
event.offsetY
event.layerX
event.layerY

event.clientX
event.clientY

event.x
event.y
event.pageX
event.pageY

注意:Chrome和Safari的event.x event.y 跟IE6 7 的表現(xiàn)一致,它們和event.clientX,event.clientY相等


Opera堅定的走了ie6 7的道路,它擁有

event.offsetX
event.offsetY

event.clientX
event.clientY

event.x
event.y
差點就和ie一模一樣,幸好它有pageX,pageY
event.pageX
event.pageY

注意:Chrome和Safari,以及 Opera 的event.x event.y 都跟IE6 7 的表現(xiàn)一致,它們和event.clientX,event.clientY相等,
而在ie8中,event.x,event.y 則等同于 其他瀏覽器的event.pageX,event.pageY


為啥米layerX和offsetX, x,和pageX會在某些瀏覽器里重復(fù)出現(xiàn)捏?
因為W3C并沒有標(biāo)準(zhǔn)化這些屬性,DOM3草案里MouseEvent部分沿用了DOM2的定義,只有兩對屬性

clientX of type long, readonly
The horizontal coordinate at which the event occurred relative to the viewport associated with the event.
clientY of type long, readonly
The vertical coordinate at which the event occurred relative to the viewport associated with the event

screenX of type long, readonly
The horizontal coordinate at which the event occurred relative to the origin of the screen coordinate system.
screenY of type long, readonly
The vertical coordinate at which the event occurred relative to the origin of the screen coordinate system.

這下杯具了,所以支持標(biāo)準(zhǔn)的瀏覽器們都木有了方向,但是吧,瀏覽器廠商轉(zhuǎn)念一想,W3C反正也弄不出幺蛾子來,肯定從offsetXY 和 layerXY,
pageXY 和 xy中間挑一個,于是為了迎合標(biāo)準(zhǔn),就把這兩對屬性就都放進了瀏覽器中。

不管怎么樣,出了問題總是要解決掉??吹缴厦娴募嫒輬蟾妫a雛形也就做好了

我們開始動手寫!

getEventCoord
復(fù)制代碼 代碼如下:

1 var getEventCoord = function( e )
2 {
3 var evt = e||event;
4 var html = document.documentElement; //滾動條在<HTML>上
5 return {
6
7 //如果pageX屬性為真 就使用pageX,否則就使用 clientX + html.scrollLeft
8 pageX : evt.pageX || evt.clientX + html.scrollLeft,
9
10 //如果pageY屬性為真 就使用pageY,否則就使用 clientY + html.scrollTop
11 pageY : evt.pageY || evt.clientY + html.scrollTop,
12
13 //clientX Y 大家都一致,木有懸念
14 clientX : evt.clientX,
15 clientY : evt.clientY,
16
17 //如果layerX屬性為真 就使用layerX,否則就使用 offsetX
18 layerX : evt.layerX || evt.offsetX,
19
20 //如果layerY屬性為真 就使用layerY,否則就使用 offsetY
21 layerY : evt.layerY || evt.offsetY
22 }
23 }


用法如下
復(fù)制代碼 代碼如下:

document.onmousemove = function( e )
{
var coord = getEventCoord(e);
document.title = [coord.pageX,coord.pageY];
}


看起來已經(jīng)灰常的OK,似乎已經(jīng)能滿足日常工作需要了,但還是存在幾個問題

1.不嚴(yán)謹(jǐn)

使用 evt.pageX || evt.clientX + html.scrollLeft 這種判斷,
只要evt.pageX 等于 undefined,null,NaN,'',0,false 這些值,左邊的表達(dá)式結(jié)果就為false,從而計算右邊的表達(dá)式并返回表達(dá)式的值,
而evt.pageX本身就是有機會返回0的。所以這條判斷應(yīng)該改為
typeof evt.pageX == 'number' ? evt.pageX : evt.clientX + html.scrollLeft
pageX是個數(shù)字的時候我們才使用它

2.無法工作在怪異模式中

什么是怪異模式?

IE為了兼容IE56之前版本,在ie6中引入了兩種渲染模式: 怪異模式(Quicks Mode) 和 標(biāo)準(zhǔn)模式 (Standards Mode)
兩種模式差異主要集中在css的盒模型解釋方面,而BOM中。則是滾動條的依賴對象發(fā)生了變化
在怪異模式中,滾動條是body的,如果想取得頁面的滾動卷去的高度和寬度,需要使用document.body.scrollTop
而標(biāo)準(zhǔn)模式中需要使用document.documentElement.scrollTop

而兩種模式的切換方式主要是由doctype來確定,參見:http://dancewithnet.com/2009/06/14/activating-browser-modes-with-doctype/

從ie6開始,ie使用一個屬性 document.compatMode 來檢測文檔是否切換到了怪異模式還是處在標(biāo)準(zhǔn)模式
如果document.compatMode的值
為BackCompat:就是在怪癖模式下
為CSS1Compat:就是在標(biāo)準(zhǔn)模式下


所以這里為了在兩個模式中都工作正常,
我們需要判斷document.compatMode是哪個模式
而判斷的方式也很簡單,只需要判斷compatMode的值的第一個字母是否為b,就可以選擇scrollTop的依賴對象
判斷方式可以這么寫
document.compatMode.indexOf('b')==0
也可以用正則寫
/^b/i.test( document.compatMode )
第二種顯得更牛x一點。。嗯,就用第二種(實際上第一種性能好一點)

現(xiàn)在再來寫第二版吧

代碼
復(fù)制代碼 代碼如下:

var getEventCoord = function( e )
{
var evt = e||event, d = document,
scrollEl = /^b/i.test( d.compatMode ) ? d.body : d.documentElement,
supportPage = typeof evt.pageX == 'number',
supportLayer = typeof evt.layerX == 'number'
return {
pageX : supportPage ? evt.pageX : evt.clientX + scrollEl.scrollLeft,
pageY : supportPage ? evt.pageY : evt.clientY + scrollEl.scrollTop,
clientX : evt.clientX,
clientY : evt.clientY,
layerX : supportLayer ? evt.layerX : evt.offsetX,
layerY : supportLayer ? evt.layerY : evt.offsetY
}
}


噔噔噔噔,這就搞定了,這個函數(shù)能干啥哩,首先想到的就是拖拽,讓我們寫一個小小的拖拽函數(shù)驗證一下下

代碼
復(fù)制代碼 代碼如下:

function dragMe( o )
{
var supportCapt = !!o.setCapture;
o.onmousedown = function(e)
{
var coord = getEventCoord(e), x = coord.layerX, y = coord.layerY;
if( supportCapt ) o.setCapture();
document.onmousemove = function(e)
{
var coord = getEventCoord(e);
o.style.left = coord.pageX - x + 'px';
o.style.top = coord.pageY - y + 'px';
}
document.onmouseup = function()
{
this.onmousemove = this.onmouseup = null;
if( supportCapt ) o.releaseCapture();
}
}
}
dragMe( document.getElementById('block') );

例子

[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

相關(guān)文章

  • 基于javascript實現(xiàn)單選及多選的向右和向左移動實例

    基于javascript實現(xiàn)單選及多選的向右和向左移動實例

    這篇文章主要介紹了基于javascript實現(xiàn)單選及多選的向右和向左移動,涉及javascript針對頁面元素的動態(tài)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • webpack自動刷新瀏覽器源碼解析

    webpack自動刷新瀏覽器源碼解析

    Webpack自動刷新瀏覽器是一項非常實用的功能,它可以讓開發(fā)者在編輯代碼時,自動更新瀏覽器,從而節(jié)省大量的時間。那么它是如何實現(xiàn)的呢?
    2023-02-02
  • 詳解如何消除axios攔截中的if

    詳解如何消除axios攔截中的if

    在使用vue的開發(fā)中,我們會使用axios來做前后端通信,那這時候我們就需要對請求前后做攔截,下面這篇文章主要給大家介紹了關(guān)于如何消除axios攔截中if的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • JavaScript era庫的使用詳解

    JavaScript era庫的使用詳解

    這篇本文主要給大家介紹了JavaScript era庫的使用,使用 ora 這個 JavaScript 庫可以在命令行應(yīng)用程序中提供漂亮的加載狀態(tài)提示,本文詳細(xì)介紹如何使用該庫,并結(jié)合多個例子演示其功能,需要的朋友可以參考下
    2024-02-02
  • JavaScript中函數(shù)(Function)的apply與call理解

    JavaScript中函數(shù)(Function)的apply與call理解

    這篇文章主要介紹了JavaScript中函數(shù)(Function)的apply與call理解,本文講解了JavaScript函數(shù)調(diào)用分為4中模式以及通過apply和call實現(xiàn)擴展和繼承兩方面,需要的朋友可以參考下
    2015-07-07
  • JavaScript快速排序(quickSort)算法的實現(xiàn)方法總結(jié)

    JavaScript快速排序(quickSort)算法的實現(xiàn)方法總結(jié)

    快速排序的思想式 分治法,選一個基準(zhǔn)點,然后根據(jù)大小進行分配,分配然完畢之后,對已經(jīng)分配的進行遞歸操作,最終形成快速排序,所以遞歸也是快速排序思想的一個重要組成部分,本文主要給大家介紹了JavaScript實現(xiàn)快速排序的寫法,需要的朋友可以參考下
    2023-11-11
  • javascript+mapbar實現(xiàn)地圖定位

    javascript+mapbar實現(xiàn)地圖定位

    地圖定位 圖吧地圖定位 附j(luò)avascript源碼每行都有注釋
    2010-04-04
  • 使用iframe實現(xiàn)pdf文件預(yù)覽功能

    使用iframe實現(xiàn)pdf文件預(yù)覽功能

    這篇文章主要為大家詳細(xì)介紹了如何使用iframe實現(xiàn)pdf文件預(yù)覽功能,以及iframe預(yù)覽報錯問題和iframe未能加載PDF文檔,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • JS日期格式化之javascript Date format

    JS日期格式化之javascript Date format

    這篇文章主要介紹了JS日期格式化之javascript Date format的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • 微信小程序之video組件視頻播放

    微信小程序之video組件視頻播放

    video控件是微信小程序提供的系統(tǒng)組件之一,用于實現(xiàn)播放視頻的功能,這篇文章主要給大家介紹了關(guān)于微信小程序之video組件視頻播放的相關(guān)資料,需要的朋友可以參考下
    2022-04-04

最新評論

丰顺县| 揭东县| 焉耆| 进贤县| 股票| 定陶县| 阳泉市| 涿州市| 克山县| 舒城县| 枞阳县| 柳州市| 夏河县| 玛多县| 博客| 临泽县| 米脂县| 漾濞| 龙陵县| 岑巩县| 工布江达县| 延安市| 托克逊县| 深水埗区| 永仁县| 铅山县| 库伦旗| 台南市| 仙游县| 华安县| 天镇县| 无棣县| 平邑县| 周至县| 吉安市| 满洲里市| 万州区| 慈溪市| 噶尔县| 漳州市| 咸丰县|