JavaScript Event學習第七章 事件屬性
更新時間:2010年02月07日 10:44:38 作者:
為了理解Event屬性,我將在這里給出一些示例代碼。在這個范疇內(nèi)有非常嚴重的瀏覽器兼容性問題。
當我們想去讀一讀關于Event的一些資料時,常常會湮沒在大量的屬性里面,這些屬性其中的大多數(shù)不能良好的運行在大多數(shù)的瀏覽器。這里有event的兼容性列表。
我不打算給這些屬性列個表,因為那些情況實在是太讓人暈頭了,而且對你的學習也不會有一點點的幫助。在寫5段代碼前我先要問關于瀏覽器的5個問題。
1、event的類型(type)是什么?
2、哪一個HTML元素是event的目標呢?
3、哪些鍵在event發(fā)生時被按下了?
4、哪個鼠標鍵在Event發(fā)生時被按下了?
5、在Event發(fā)生時鼠標的位置在哪?
最后一個問題我在這里做了非常詳盡的解答。
請注意這些代碼我做了非常嚴謹?shù)膶ο髾z查。我首先創(chuàng)建跨瀏覽器的的對事件的訪問,然后在使用每一個屬性前都做了瀏覽器支持性的檢查。
1、event的類型(type)是什么?
這是一個跨瀏覽器的有標準答案的問題:使用type屬性就可以查看其屬性:
function doSomething(e) {
if (!e) var e = window.event;
alert(e.type);
}
2、哪一個HTML元素是event的目標呢?
W3C/Netscape說:target。不對,微軟說,是srcElement。這兩個屬性都返回event發(fā)生時的HTML元素。
function doSomething(e) {
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
}
最后兩行的代碼專門針對Safari的。如果event發(fā)生在一個包含文本(text)的元素上,這個文本節(jié)點(text node)而不是元素本身就成為了event的目標。因此我們要檢查如果目標的nodetype是3(文本節(jié)點)。如果是我們就把它移動到父節(jié)點上,HTML元素。
即使event被捕獲或者冒泡了(bubbles up),target/srcElement屬性也依然是最早發(fā)生event的元素。
其他的target
還有很多targeting的屬性。我在Event Order這篇文章里討論了currentTarget,在Mouse event這篇文章里討論了relatedTarget,fromElement和toElement。
3、哪些鍵在event發(fā)生時被按下了?
這個問題相對簡單一些。首先從keyCode屬性得到該鍵的代碼(a=65)。當你得到了鍵值以后,你可以通過String.fromCharCode()方法知道實際的鍵值,如果必要的話。
function doSomething(e) {
var code;
if (!e) var e = window.event;
if (e.keyCode) code = e.keyCode;
else if (e.which) code = e.which;
var character = String.fromCharCode(code);
alert('Character was ' + character);
}
這里有一些地方可能會造成鍵盤事件比較難用。比如,kepress事件觸發(fā)的時間和使用者按下鍵的時間一樣長。然而,大多數(shù)瀏覽器里面keydown的觸發(fā)時間也和按下的時間一樣長。我不確定這是不是一個好的想法,但是就是那樣的。
4、哪個鼠標鍵在Event發(fā)生時被按下了?
這里有兩個屬性可以知道哪個鼠標鍵被按下了:which和button。請注意這些屬性通常不一定在click上起作用。為了保險的探測哪個鼠標鍵被按下,你最好使用mousedown和mouseup事件。
which是一個古老的Netscape屬性。鼠標左鍵的值是1,中鍵(滾輪)的值是2,右鍵的值是3。除了支持上比較薄弱以外沒有什么問題,事實上也經(jīng)常用來檢測鼠標按鍵。
現(xiàn)在button屬性能被很好的識別。W3C的標準值如下:
左鍵 0
中鍵 1
右鍵 2
微軟的標準值如下:
左鍵 1
中鍵 4
右鍵 2
毫無疑問的微軟的標準比W3C的好。0可以表示沒有鍵按下,其他都是不合理的。
另外,只有在微軟的模型中按鍵的值是可以合并使用的,比如5就代表“左鍵和中鍵”一起按下。不僅IE6不支持合并,w3c的的模型在理論上也是不能完成的:你永遠也不知道左鍵是不是被按下了。
所以在我看來w3c在定義button上有嚴重的失誤。
右擊
幸運的是,通常你想知道右鍵是否被點擊。因為W3C和微軟恰好在這個問題上給button的定義值是2,所以你依然可以檢測右擊。
function doSomething(e) {
var rightclick;
if (!e) var e = window.event;
if (e.which) rightclick = (e.which == 3);
else if (e.button) rightclick = (e.button == 2);
alert('Rightclick: ' + rightclick); // true or false
}
需要注意的是,Macs通常只有一個鍵,Mozilla給Ctrl-Click的button的值定義為2,所以Ctrl-Click也會打開菜單。ICab 還不支持鼠標button屬性,所以你在Opera里面還不能檢測右擊。
5、在Event發(fā)生時鼠標的位置在哪?
鼠標位置這個問題相當?shù)膰谰?。雖然有不少于6對鼠標坐標的屬性,但是仍然沒有一個可靠的跨瀏覽器的方法能找到鼠標的坐標。
下面是這6組坐標:
1、clientX,clientY
2、layerX,layerY
3、offsetX,offsetY
4、pageX,pageY
5、screenX,screenY
6、x,y
我曾經(jīng)在這里解釋過pageX/Y和clientX/Y的問題。
screenX和screenY是唯一一對跨瀏覽器兼容的屬性。他們給出鼠標在整個電腦屏幕上的坐標。不幸的是,僅僅這個信息是遠遠不夠的:你永遠也不需要知道鼠標在屏幕的位置--好吧,或者你想在當前的鼠標位置放置一個新的窗口。
其他的三對屬性也不重要,看這里的描述。
正確的代碼
下面的代碼能夠正確的檢測鼠標的坐標
function doSomething(e) {
var posx = 0;
var posy = 0;
if (!e) var e = window.event;
if (e.pageX || e.pageY) {
posx = e.pageX;
posy = e.pageY;
}
else if (e.clientX || e.clientY) {
posx = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft;
posy = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop;
}
// posx and posy contain the mouse position relative to the document
// Do something with this information
}
原文在這里:http://www.quirksmode.org/js/events_properties.html
大家多指教 我的twitter:@rehawk
我不打算給這些屬性列個表,因為那些情況實在是太讓人暈頭了,而且對你的學習也不會有一點點的幫助。在寫5段代碼前我先要問關于瀏覽器的5個問題。
1、event的類型(type)是什么?
2、哪一個HTML元素是event的目標呢?
3、哪些鍵在event發(fā)生時被按下了?
4、哪個鼠標鍵在Event發(fā)生時被按下了?
5、在Event發(fā)生時鼠標的位置在哪?
最后一個問題我在這里做了非常詳盡的解答。
請注意這些代碼我做了非常嚴謹?shù)膶ο髾z查。我首先創(chuàng)建跨瀏覽器的的對事件的訪問,然后在使用每一個屬性前都做了瀏覽器支持性的檢查。
1、event的類型(type)是什么?
這是一個跨瀏覽器的有標準答案的問題:使用type屬性就可以查看其屬性:
復制代碼 代碼如下:
function doSomething(e) {
if (!e) var e = window.event;
alert(e.type);
}
2、哪一個HTML元素是event的目標呢?
W3C/Netscape說:target。不對,微軟說,是srcElement。這兩個屬性都返回event發(fā)生時的HTML元素。
復制代碼 代碼如下:
function doSomething(e) {
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
}
最后兩行的代碼專門針對Safari的。如果event發(fā)生在一個包含文本(text)的元素上,這個文本節(jié)點(text node)而不是元素本身就成為了event的目標。因此我們要檢查如果目標的nodetype是3(文本節(jié)點)。如果是我們就把它移動到父節(jié)點上,HTML元素。
即使event被捕獲或者冒泡了(bubbles up),target/srcElement屬性也依然是最早發(fā)生event的元素。
其他的target
還有很多targeting的屬性。我在Event Order這篇文章里討論了currentTarget,在Mouse event這篇文章里討論了relatedTarget,fromElement和toElement。
3、哪些鍵在event發(fā)生時被按下了?
這個問題相對簡單一些。首先從keyCode屬性得到該鍵的代碼(a=65)。當你得到了鍵值以后,你可以通過String.fromCharCode()方法知道實際的鍵值,如果必要的話。
復制代碼 代碼如下:
function doSomething(e) {
var code;
if (!e) var e = window.event;
if (e.keyCode) code = e.keyCode;
else if (e.which) code = e.which;
var character = String.fromCharCode(code);
alert('Character was ' + character);
}
這里有一些地方可能會造成鍵盤事件比較難用。比如,kepress事件觸發(fā)的時間和使用者按下鍵的時間一樣長。然而,大多數(shù)瀏覽器里面keydown的觸發(fā)時間也和按下的時間一樣長。我不確定這是不是一個好的想法,但是就是那樣的。
4、哪個鼠標鍵在Event發(fā)生時被按下了?
這里有兩個屬性可以知道哪個鼠標鍵被按下了:which和button。請注意這些屬性通常不一定在click上起作用。為了保險的探測哪個鼠標鍵被按下,你最好使用mousedown和mouseup事件。
which是一個古老的Netscape屬性。鼠標左鍵的值是1,中鍵(滾輪)的值是2,右鍵的值是3。除了支持上比較薄弱以外沒有什么問題,事實上也經(jīng)常用來檢測鼠標按鍵。
現(xiàn)在button屬性能被很好的識別。W3C的標準值如下:
左鍵 0
中鍵 1
右鍵 2
微軟的標準值如下:
左鍵 1
中鍵 4
右鍵 2
毫無疑問的微軟的標準比W3C的好。0可以表示沒有鍵按下,其他都是不合理的。
另外,只有在微軟的模型中按鍵的值是可以合并使用的,比如5就代表“左鍵和中鍵”一起按下。不僅IE6不支持合并,w3c的的模型在理論上也是不能完成的:你永遠也不知道左鍵是不是被按下了。
所以在我看來w3c在定義button上有嚴重的失誤。
右擊
幸運的是,通常你想知道右鍵是否被點擊。因為W3C和微軟恰好在這個問題上給button的定義值是2,所以你依然可以檢測右擊。
復制代碼 代碼如下:
function doSomething(e) {
var rightclick;
if (!e) var e = window.event;
if (e.which) rightclick = (e.which == 3);
else if (e.button) rightclick = (e.button == 2);
alert('Rightclick: ' + rightclick); // true or false
}
需要注意的是,Macs通常只有一個鍵,Mozilla給Ctrl-Click的button的值定義為2,所以Ctrl-Click也會打開菜單。ICab 還不支持鼠標button屬性,所以你在Opera里面還不能檢測右擊。
5、在Event發(fā)生時鼠標的位置在哪?
鼠標位置這個問題相當?shù)膰谰?。雖然有不少于6對鼠標坐標的屬性,但是仍然沒有一個可靠的跨瀏覽器的方法能找到鼠標的坐標。
下面是這6組坐標:
1、clientX,clientY
2、layerX,layerY
3、offsetX,offsetY
4、pageX,pageY
5、screenX,screenY
6、x,y
我曾經(jīng)在這里解釋過pageX/Y和clientX/Y的問題。
screenX和screenY是唯一一對跨瀏覽器兼容的屬性。他們給出鼠標在整個電腦屏幕上的坐標。不幸的是,僅僅這個信息是遠遠不夠的:你永遠也不需要知道鼠標在屏幕的位置--好吧,或者你想在當前的鼠標位置放置一個新的窗口。
其他的三對屬性也不重要,看這里的描述。
正確的代碼
下面的代碼能夠正確的檢測鼠標的坐標
復制代碼 代碼如下:
function doSomething(e) {
var posx = 0;
var posy = 0;
if (!e) var e = window.event;
if (e.pageX || e.pageY) {
posx = e.pageX;
posy = e.pageY;
}
else if (e.clientX || e.clientY) {
posx = e.clientX + document.body.scrollLeft
+ document.documentElement.scrollLeft;
posy = e.clientY + document.body.scrollTop
+ document.documentElement.scrollTop;
}
// posx and posy contain the mouse position relative to the document
// Do something with this information
}
原文在這里:http://www.quirksmode.org/js/events_properties.html
大家多指教 我的twitter:@rehawk
您可能感興趣的文章:
- javascript attachEvent綁定多個事件執(zhí)行順序問題
- Javascript中的window.event.keyCode使用介紹
- myEvent.js javascript跨瀏覽器事件框架
- javascript開發(fā)隨筆一 preventDefault的必要
- javascript中window.event事件用法詳解
- JavaScript事件處理器中的event參數(shù)使用介紹
- Javascript中Event屬性搜集整理
- javascript Event對象詳解及使用示例
- Event altKey,ctrlKey,shiftKey屬性解析
- 21個JavaScript事件(Events)屬性匯總
- javascript中的altKey 和 Event屬性大全
相關文章
JavaScript中類型的強制轉(zhuǎn)換與隱式轉(zhuǎn)換詳解
類型強制Coercion是將值從一種類型轉(zhuǎn)換為另一種類型的過程(例如字符串轉(zhuǎn)換為數(shù)字,對象轉(zhuǎn)換為布爾值等),下面這篇文章主要給大家給大家介紹了JavaScript中類型的強制轉(zhuǎn)換與隱式轉(zhuǎn)換的相關資料,需要的朋友可以參考下2021-08-08JavaScript trim 實現(xiàn)去除字符串首尾指定字符的簡單方法
下面小編就為大家?guī)硪黄狫avaScript trim 實現(xiàn)去除字符串首尾指定字符的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12