Javascript用户交互的常见事件处理

用户交互是基于用户事件的,这些事件通常是鼠标事件、触摸事件以及键盘事件。

一. 监听器与事件处理程序

添加事件监听可以使用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

1.1 步骤1:创建一个可拖拽对象:

1.1.1如果想要拖动某个元素,需要设置元素的 draggable 属性为 true。

<img id="dragImg" draggable="true" />
1.1.2给 dragstart 设置一个事件监听器存储拖拽数据。

document.getElementById("dragImg").addEventListener("dragstart", function(event) {
    // 存储拖拽数据和拖拽效果...
    event.dataTransfer.setData("Text",ev.target.id);
}, false);

1.2 步骤2:放置对象:

假设放置对象的DOM为:

<div id="dragTarget"></div>

1.2.1 dragenter事件,用来确定放置目标是否接受放置。

如果放置被接受,那么这个事件必须取消。

document.getElementById("dragTarget").addEventListener("dragenter", function(event) {
    // 阻止浏览器默认事件
    event.preventDefault();
}, false);

1.2.2 dragover事件,用来确定给用户显示怎样的反馈信息。

如果这个事件被取消,反馈信息(通常就是光标)就会基于 dropEffect 属性的值更新。

document.getElementById("dragTarget").addEventListener("dragover", function(event) {
    // 阻止浏览器默认事件
    event.preventDefault();
}, false);

1.2.3 最后是drop事件,允许放置对象。

document.getElementById("dragTarget").addEventListener("drop", function(event) {
    event.preventDefault();
    var data=event.dataTransfer.getData("Text");
    event.target.appendChild(document.getElementById(data));
}, false);
1.3例子:

<!DOCTYPE HTML>
<html>
<head>
    <style type="text/css">
        #dragTarget {width:488px;height:70px;padding:10px;border:1px solid #aaaaaa;}
    </style>
    <script type="text/javascript">
        function allowDrop(ev){
            ev.preventDefault();
        }
        function drag(ev){
            ev.dataTransfer.setData("Text",ev.target.id);
        }
        function drop(ev){
            ev.preventDefault();
            var data=ev.dataTransfer.getData("Text");
            ev.target.appendChild(document.getElementById(data));
        }
    </script>
</head>
<body>
    <p>请把 W3School 的图片拖放到矩形中:</p>
    <div id="dragTarget" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
    <br />
    <img id="dragImg" src="/i/w3school_banner.gif" draggable="true" ondragstart="drag(event)" />
</body>
</html>

时间: 2024-12-22 21:05:00

Javascript用户交互的常见事件处理的相关文章

《HTML5+JavaScript动画基础》——2.5 用户交互

2.5 用户交互 用户交互可能是你选择本书的一个重要原因.毕竟,如果没有交互或者无法对动画产生一些动态的影响,你可能就去看电影了.用户交互是基于用户事件的,这些事件通常是鼠标事件.触摸事件以及键盘事件.让我们快速地浏览各种用户事件类型以及如何处理这些事件. 2.5.1 事件与事件处理程序 为了理解事件,你必须理解一些额外的概念:监听器与事件处理程序.监听器决定一个元素是否应该响应某个事件,而事件处理程序则是当事件发生时将要调用的函数. 我们绘制到canvas元素上的形状自身并不具备监测事件的功能

用户交互设计:软件安装一般页面流程

文章描述:用户交互设计:软件安装一般页面流程. 混乱的安装界面和不畅的安装流程把前来拜访的用户拒之门外,也使软件的功能得不到充分的定制和发挥.由于对互联网产品的爱好,我经常安装软件,在这之中发现许多不好的地方,在这将共通的内容提出来分析一下.   现有软件安装一般页面流程: what's new页>>许可条款页>>选择组件>>软件大小信息,选择安装路径和快捷方式显示位置>>安装进度页>>附带推广软件页,和立即运行.开机启动.设为首页.显示新特性等

用户交互设计:手机产品交互设计样式

文章描述:用户交互设计:手机产品交互设计样式. 很多人都说,手机产品交互限制因素很多,过小的屏幕分辨率,过低的系统性能,过慢的网速,过弱的电池续航能力等等.但是在限制中还能做出优秀的设计,才显得弥足珍贵,就像风靡Symbian平台的gravity一样. 其实,我认为手机产品交互设计还是有很多想象空间的,它不仅仅是界面交互,而是跟空间.跟时间.跟触觉.跟视觉.跟听觉.跟嗅觉的交互,而且随着技术的推移,相信界面的可扩展性也会越来越好,不管是电子纸(ePaper),还是投影技术应用到手机上,都会让手机

使用jBpm支持高级用户交互模式

许多通用业务流程都包含人类参与者.人类活动,从简单场景(如人工批准) 到复杂场景(涉及复杂的数据输入),在流程实现中引入了新的方面,如人类交 互模式.人类交互模式的一个典型集合包括: 四眼原则(The 4-eyes principle),通常又被称为"职责分离",它是决策 由多人彼此独立作出时的一个常见场景.在很多情况下,很容易就能得到另一个 观点/签名. 任命(Nomination)是指上级根据团队成员的任务安排.工作负荷或经验人工 地将任务分配给他的情形. 任务通常被建模来表达一种

《交互式程序设计 第2版》一3.5 捕获简单用户交互行为

3.5 捕获简单用户交互行为 从头开始说起吧.最基本的用户交互模式有两种:鼠标和键盘.下面介绍Processing是如何处理这两种交互的.要捕获这两种交互,你需要知道鼠标何时移动,鼠标按键何时按下,鼠标何时拖动(即按住按键不放并移动鼠标),是否有键盘按键被按下,如果有的话,被按下的是哪个键.与这些相关的方法和变量是现成的,就存在于Processing应用程序中.你只需要使用它们,也就是说,你只需要告诉Processing系统,当某个方法被调用时你想做什么事情,或者当方法被调用或在draw()方法

浅析Windows Phone 7之用户交互设计

在今年2月15日巴塞罗那的Mobile World Congress 2010大会上,微软终于正式宣告了其下一代的智能手机平台Windows Phone 7 Series(目前已经更名为Windows Phone 7).这半年来,随着各大媒体对于Windows Phone 7的关注度的日益提高,大家对Windows Phone 7的了解也越来越多.同时,为了能够在广大开发者在Windows Phone 7正式上市前顺利的开发出Windows Phone 7上的相关应用,微软也已经在这两个月陆续的

JavaScript版几种常见排序算法分享

说明 ·  每个浏览器测试得出的数据会不一样.比如我用chrome 测试 一般快速排序都会最快,IE 则根据数组长度有可能希尔最快. ·  不要用太大数据去测试冒泡排序(浏览器崩溃了我不管) 个人理解 ·  冒泡排序:最简单,也最慢,貌似长度小于7最优 ·  插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势 ·  快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合 ·  希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快 ·  系统

Javascript iframe交互并兼容各种浏览器的解决方法_javascript技巧

在Web前端开发中,我们经常会用到iframe这个控件. 但是这个控在内.外交互时,往往各个浏览器所用的关键字不同,很是麻烦,为了能够得到子iframe中的window对象,各家浏览器有着各家的指定,有的是window,有的是contentWindow等等也许还有我们不知道的. 但是从子页面访问父层页面,其本上大家都是window.parent就可以了. 那么通过这个特征,我们可以在子页面中,把自身的window对象传递给父页面就可以了,这样父页面就很轻松的访问子页面,再也不用靠虑如何从ifra

标签之美十——用户交互元素

标签之美--用户交互元素 任何一个网页都会提供用户交互的功能,包括账号密码的提交,留言板等用户信息的的获取. 一.用户交互表单的属性 表单使用<form></form>来创建. 1.跳转链接属性 表单的跳转是在提交数据后跳转到指定的URL,使用action属性,如下: ? 1 2 <form action="http://"> </form> 2.传递数据的方式 表单跳转传递数据时可以设置一个传递方式,使用method可以设置方式为get