1. 程式人生 > >js常見使用者互動事件處理

js常見使用者互動事件處理

使用者互動是基於使用者事件的,這些事件通常是滑鼠事件、觸控事件以及鍵盤事件。

一. 監聽器與事件處理程式

新增事件監聽可以使用 addEventListener() :

element.addEventListener(type, handler [, userCapture])

移除事件監聽可以使用 removeEventListener() :

element.removeEventListener(type, handler [, userCapture])

addEventListener()相容IE9+瀏覽器和其他主流的現代瀏覽器,不相容IE8及其以下版本。在IE8及其以下版本瀏覽器應使用attachEvent()來進行事件繫結。具體可檢視: 

JavaScript事件處理相容性總結

1.1 event事件型別

1.2 event事件屬性和方法

屬性 描述 IE 非IE W3C
altKey 返回當事件被觸發時,”ALT” 是否被按下。 Yes Yes Yes
button 返回當事件被觸發時,哪個滑鼠按鈕被點選。 Yes Yes Yes
clientX 返回當事件被觸發時,滑鼠指標的水平座標。 Yes Yes Yes
clientY 返回當事件被觸發時,滑鼠指標的垂直座標。 Yes Yes Yes
ctrlKey 返回當事件被觸發時,”CTRL” 鍵是否被按下。 Yes Yes Yes
metaKey 返回當事件被觸發時,”meta” 鍵是否被按下。 No Yes Yes
relatedTarget 返回與事件的目標節點相關的節點。 No Yes Yes
screenX 返回當某個事件被觸發時,滑鼠指標的水平座標。 Yes Yes Yes
screenY 返回當某個事件被觸發時,滑鼠指標的垂直座標。 Yes Yes Yes
shiftKey 返回當事件被觸發時,”SHIFT” 鍵是否被按下。 Yes Yes Yes
bubbles 返回布林值,指示事件是否是起泡事件型別。 No Yes Yes
cancelable 返回布林值,指示事件是否可擁可取消的預設動作。 No Yes Yes
currentTarget 返回其事件監聽器觸發該事件的元素。 No Yes Yes
eventPhase 返回事件傳播的當前階段。 Yes
target 返回觸發此事件的元素(事件的目標節點)。 No Yes Yes
timeStamp 返回事件生成的日期和時間。 No Yes Yes
type 返回當前 Event 物件表示的事件的名稱。 Yes Yes Yes
which 鍵盤碼。 No Yes Yes
charCode 鍵盤碼。 No Yes Yes
方法 描述 IE 非IE W3C
initEvent() 初始化新建立的 Event 物件的屬性。 No Yes Yes
preventDefault() 通知瀏覽器不要執行與事件關聯的預設動作。 No Yes Yes
stopPropagation() 不再派發事件。 No Yes Yes

除了上面W3C規範所規定的屬性和方法外,IE瀏覽器還支援以下屬性。

event物件的屬性(IE特有):

屬性 描述
cancelBubble 如果事件控制代碼想阻止事件傳播到包容物件,必須把該屬性設為 true。
fromElement 對於 mouseover 和 mouseout 事件,fromElement 引用移出滑鼠的元素。
keyCode 對於 keypress 事件,該屬性聲明瞭被敲擊的鍵生成的 Unicode 字元碼。對於 keydown 和 keyup 事件,它指定了被敲擊的鍵的虛擬鍵盤碼。虛擬鍵盤碼可能和使用的鍵盤的佈局相關。
offsetX, offsetY 發生事件的地點在事件源元素的座標系統中的 x 座標和 y 座標。
returnValue 如果設定了該屬性,它的值比事件控制代碼的返回值優先順序高。把這個屬性設定為 fasle,可以取消發生事件的源元素的預設動作。
srcElement 對於生成事件的 Window 物件、Document 物件或 Element 物件的引用。
toElement 對於 mouseover 和 mouseout 事件,該屬性引用移入滑鼠的元素。
x, y 事件發生的位置的 x 座標和 y 座標,它們相對於用CSS動態定位的最內層包容元素。

二. 滑鼠事件

滑鼠事件常用的有:

  • mousedown
  • mouseup
  • click
  • dbclick
  • mousewheel
  • mousemove
  • mouseover
  • mouseout
  • mouseenter

三. 滑鼠位置

每個滑鼠事件都有兩個屬性用於確定滑鼠的當前位置:pageX與pageY。結合這兩個屬性及目標元素相對於document的偏移量,可以確定滑鼠在canvas元素上的相對座標。遺憾的是,並不是所有的瀏覽器都支援pageX和pageY屬性,可能要用到clientX和clientY。

獲取滑鼠位置的相容性寫法如下:

// 獲取滑鼠的當前位置
function getMouse(event) {
    var event = event || window.event;
    var mouse = {};
    var x, y;
    if(event.pageX || event.pageY) {
        x = event.pageX;
        y = event.pageY;
    } else if(event.clientX || event.clientY) {
        var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        x = event.clientX + scrollLeft;
        y = event.clientY + scrollTop;
    }
    mouse.x = x;
    mouse.y = y;
    return mouse;
}

使用方法如下:

<canvas id="canvas" width="300" height="300" style="background: #ccc;"></canvas>

var canvas = document.getElementById("canvas");
canvas.addEventListener("mousemove", function(e) {
    var x = getMouse(e).x,
        y = getMouse(e).y;
    console.log("x: " + x + "; y: " + y);
});

// 獲取滑鼠的當前位置
function getMouse(event) {
    var event = event || window.event;
    var mouse = {};
    var x, y;
    if(event.pageX || event.pageY) {
        x = event.pageX;
        y = event.pageY;
    } else if(event.clientX || event.clientY) {
        var scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        x = event.clientX + scrollLeft;
        y = event.clientY + scrollTop;
    }
    mouse.x = x;
    mouse.y = y;
    return mouse;
}

四. 觸控事件

觸控事件與滑鼠事件相似,一個觸控點可以被想象成一個滑鼠游標。不過滑鼠游標會一直停留在螢幕上,而受制卻會從裝置上按下、移動以及釋放同一時間可能發生多點觸控,某個觸控點會儲存在觸控事件的一個數組中,不過一般都建議使用第一個觸控點。

常用到的觸控事件有:

  • touchstart
  • touchend
  • touchmove

五. 觸控位置

其中, touchstart 和 touchmove 事件的第一個觸控點位置為:

event.touches[0]

touchend事件的第一個觸控點位置為:

event.changedTouches[0]
<canvas id="canvas" width="300" height="300" style="background: #ccc;"></canvas>

var canvas = document.getElementById("canvas");
canvas.addEventListener("touchstart", function(e) {
    var touches = e.touches ? e.touches[0] : e;
    touchstartPosition = {
        x : touches.pageX,
        y : touches.pageY
    };
});

canvas.addEventListener("touchmove", function(e) {
    var touches = e.touches ? e.touches[0] : e;
    touchmovePosition = {
        x : touches.pageX,
        y : touches.pageY
    };
    console.log(touchmovePosition);
});

canvas.addEventListener("touchend", function(e) {
    var changedTouches = e.changedTouches ? e.changedTouches[0] : e;
    touchsEndPosition = {
        x : changedTouches.pageX,
        y : changedTouches.pageY
    };
    console.log(touchsEndPosition);
});

六. 鍵盤事件

鍵盤事件僅有兩個:

  • keydown
  • keyup

七. 鍵盤碼

在一個鍵盤事件中,可以通過事件物件的keyCode屬性獲知哪個鍵按下。

八. 拖拽事件

  • dragstart
  • drag
  • dragenter
  • dragover
  • dragleave
  • drop
  • dragend