`

JavaScript Event学习:鼠标事件

 
阅读更多

 

先看看都有哪些鼠标事件:mousedown,mouseup_and_click,dblclick,mousemove和mouseover mouseout。然后还会解释一下relatedTarget,fromElement和toElement这些事件属性。最后是微软的 mouseenter和mouseleave事件。

  浏览器的兼容性问题,可以在浏览器兼容性列表查看。

  例子

  这里有一个例子。可以帮助理解下面的内容。

  mousedown,mouseup,click和dblclick在这个链接上注册。可以再下面的文本框里面查看。或者在对话框里面。(请在原文里尝试:http://www.quirksmode.org/js/events_mouse.htm)

  Mousedown,mouseup,click

  如果用户在一个元素上点击,那么最少三个事件会被触发,顺序是这样的:

  1、mousedown,当用户在这个元素上按下鼠标键的时候

  2、mouseup,当用户在这个元素上松开鼠标键的时候

  3、click,当一个mousedown和一个mouseup都在这个元素上被检测到的时候发生

  通常mousedown和mouseup比click有用。有些浏览器不允许你读取onclick的事件信息。而且有时候用户用鼠标做出某些动作click事件没有跟上。

  假设用户在一个链接上按下了鼠标键,然后把鼠标挪开了并且挪开后松开了鼠标键。那么这时候这个链接就仅仅发生了mousedown事件。类似的,用户在点击鼠标之后挪到了链接上,那么链接就仅有mouseup发生。这两种情况都没有click事件发生。

  这是不是一个问题取决于用户的行为。但是你应该注册onmousedown/up事件,除非你就是完全想click发生。

  如果你用了弹出警示框的话,浏览器可能会丢失事件发生的轨迹和发生了多少次,会引起混乱。所以最好别用那个。

  Dblclick

  dblclick事件很少用。如果你要用的话一定不要把onclick和dblclick的事件处理程序注册在一个HTML元素上。如果两个都注册了的话你要知道用户到底干什么是一件基本上不可能的事情。

  总之,当用户在一个元素上双击的时候click事件总是发生在dblclick之前。另外,在Netscape中,第二个click总是会在dblclick之前被分开处理。不管怎样,警示框在这是很危险的。

  所以保证你的click和dblclick很好的分离能避免很多复杂的事情。

  Mousemove

  mousemove事件运行的很好,但是需要注意的是那可能需要很多的系统资源来处理所有的mousemove事件。当用户把鼠标移动一个像素,mousemove就触发一次。就算什么都没发生,长而复杂的函数也要耗费很长的时间会影响网站的效率:所有的事情都会变慢,尤其在那些老古董上。

  所以最好的办法就是当你需要的时候注册onmousemove事件,在不用的时候尽快移除:

 

 

element.onmousemove = doSomething;
// later
element.onmousemove = null;

 Mouseover和mouseout

 

  再看看这个例子,换成mouserover然后试试。这个例子只是在ev3上添加了onmouseover的事件处理程序。然而你会注意到不仅仅在ev3上会触发事件在ev4或者span上都会触发。在Mozilla 1.3之前,当鼠标进入一个文本区域的时候都会触发。

  原因当然就是事件冒泡。用户在ev4上触发了mouseover事件。在这个元素上没有onmouseover事件处理程序,但是在ev3上有。所以当事件冒泡到ev3上的时候,程序就执行了。

  现在这样的设置虽然都完全正确,但是还有一个问题。首要问题就是目标。假设鼠标进入了ev4:

 

 

-----------------------------------------
| This is div id="ev3"                  |
|   -----------------------------       |
|   | This is div id="ev4"      |       |
|   | --------              <--------   |
|   | | span |                  |       |
|   | |      |                  |       |
|   | --------                  |       |
|   -----------------------------       |
-----------------------------------------

<--------: mouse movement

 

现在这个事件的target/srcElement就是ev4:就是事件发生的元素,因为鼠标移动到了他上面。但是当下面的发生时候:

 

-----------------------------------------
| This is div id="ev3"                  |
|   -----------------------------       |
|   | This is div id="ev4"      |       |
|   | --------                  |       |
|   | | span |                  |       |
|   | |    -------->            |       |
|   | --------                  |       |
|   -----------------------------       |
-----------------------------------------

-------->: mouse movement

 

 

这个事件的target/srcElement是一样的。在这一样还是鼠标进入ev4。然而你可能会当鼠标从ev3来或者从SPAN来的时候做不同的事。所以我们需要知道鼠标到底从哪来的。

  relatedTarget,fromElement,toElement

  W3C把relatedTarget属性加进了mouseover和mouseout事件中。在mouseover事件下就是包括鼠标从哪来,在mouseout下就是包括鼠标到哪去。

  微软也有包含以下信息的两个属性:

  1、fromElement指的是鼠标来之前的元素。在mouseover的状况下比较有用

  2、toElement表示鼠标将要去的那个元素。在mouseout的情况下比较有用。

  在我们的第一个例子里面,relatedTarget/fromElement包含一个ev3的引用,在我们的第二个例子是SPAN。现在你就知道鼠标的来源了。

  跨浏览器的代码

  所以如果你想在mouseover的情况下想知道鼠标从哪来,那么:

 

 

function doSomething(e) {
	if (!e) var e = window.event;
	var relTarg = e.relatedTarget || e.fromElement;
}
 

 

 

如果在mouseout的情况下想知道鼠标的去向那么:

 

function doSomething(e) {
	if (!e) var e = window.event;
	var relTarg = e.relatedTarget || e.toElement;
}

 

鼠标离开一个层

  在一个基于层的导航菜单里面你可能需要知道鼠标什么时候离开层这样你才能把那个层关闭。所以你给这个层的onmouseout注册了一个事件处理程序。然后事件冒泡会导致当鼠标离开任意一个层的时候都会触发这个onmouseout。

--------------
| Layer      |.onmouseout = doSomething;
| --------   |
| | Link | ----> We want to know about this mouseout
| |      |   |
| --------   |
| --------   |
| | Link |   |
| |    ----> | but not about this one
| --------   |
--------------
---->: mouse movement

另外的一个停止的方法是当你把鼠标移入这个层,然后到了一个链接上,浏览器就在这个层上注册一个mouseout事件。这个让我很不明白(鼠标依然在层里),但是所有的浏览器都没问题。

  那么我们如何在鼠标真正离开的层的时候让mouseout发生呢?

 

function doSomething(e) {
	if (!e) var e = window.event;
	var tg = (window.event) ? e.srcElement : e.target;
	if (tg.nodeName != 'DIV') return;
	var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
	while (reltg != tg && reltg.nodeName != 'BODY')
		reltg= reltg.parentNode
	if (reltg== tg) return;
	// Mouseout took place when mouse actually left layer
	// Handle event
}
 首先得到事件的target,也就是鼠标离开的元素。如果target不是DIV(层),理解结束函数,因为鼠标没有真正离开层。

  如果target是层,我们不能确定鼠标时离开层了还是进入了层里面的一个链接。所以要再检查事件的relatedTarget/toElement,也就是鼠标移向的那个元素。

  我们读取这个元素,然后我们通过DOM树向上遍历,直到事件的target(也就是DIV),或者BODY元素。

  如果我们遇到的target是层的子元素,那么鼠标就没有离开层。就停止函数的运行。

  当函数通过所有的验证我们就能确定鼠标确实离开了层,我们就能开始应该的动作了(通常是隐藏这个层)。

  Mouseenter和mouseleave

  微软还有个解决办法。他添加了两个新的事件mouseenter和mouseleave。除了对事件冒泡不反应以外基本上和mouseover和mouseout是一样的。他们把注册了事件的元素看成一个整块,对于发生在块内的

  mouseover和mouseout不做反应。

  所以这两个事件也解决了我们的问题:他们只对绑定的元素做出mouseover/out反应。

  现在这两个事件只被版本在5.5以上的IE支持。或许其他浏览器哪天回借鉴下。

  结尾

  现在已经到了Event的介绍的尾声了。好运!

 

[转自:http://tech.ddvip.com/2010-03/1269927968148964.html]

分享到:
评论

相关推荐

    JavaScript鼠标常用事件列表

    在JavaScript中,鼠标事件主要分为两类:鼠标动作事件和鼠标按钮事件。动作事件通常与鼠标移动有关,而按钮事件则与鼠标的点击操作相关。以下是一些基本的鼠标事件: 1. `mousemove`:当鼠标在元素上移动时触发。...

    JavaScript 事件处理 常用事件(鼠标事件、键盘事件、表单事件)示例代码

    JavaScript 事件处理 常用事件(鼠标事件、键盘事件、表单事件)示例代码JavaScript 事件处理 常用事件(鼠标事件、键盘事件、表单事件)示例代码JavaScript 事件处理 常用事件(鼠标事件、键盘事件、表单事件)示例...

    《javascript》——event对象与事件

    Event 对象的使用可以分为两个方面:事件处理和事件绑定。事件处理是指在事件发生时执行的函数或代码,而事件绑定是指将事件处理函数绑定到某个元素上,使得该元素能够响应用户的交互行为。 常见的事件类型包括: ...

    javascript触发模拟鼠标点击事件

    `initEvent`方法用于初始化事件对象,它接受三个参数:事件类型、一个布尔值表示事件是否冒泡、一个布尔值表示是否要阻止事件的默认行为。 除此之外,文章提到了jQuery库中的`event.trigger`方法,这是一个封装过的...

    头歌教学实践平台 Web前端开发基础 JavaScript学习手册十五:事件处理

    在JavaScript中,事件处理通常有两种方式:事件监听器(Event Listeners)和传统事件处理程序。传统事件处理程序是通过在HTML元素上直接设置`onclick`、`onmouseover`等属性来实现的,而事件监听器则是通过...

    Javascript中的事件--Event对象

    - **`timeStamp`**:事件发生的时间戳。 - **`bubbles`**:布尔值,表示该事件是否可以冒泡。 - **`cancelable`**:布尔值,表示该事件是否可以通过`preventDefault()`方法取消默认行为。 ### 2. 控制事件流程的...

    Javascript之event大全

    JavaScript中的Event是处理用户交互或浏览器事件的核心机制。Event对象包含了与事件相关的所有信息,如触发事件的元素、事件类型、按键状态等。在JavaScript中,事件可以是用户的行为,如点击按钮、滚动页面,或者是...

    JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例

    JavaScript是Web开发中不可或缺的一部分,它提供了丰富的交互性,使得网页不仅仅是静态的HTML。在JavaScript中,事件(Events)是用户或浏览器与页面...不断学习和实践JavaScript事件,将使你成为更优秀的前端开发者。

    javascript的鼠标事件.doc

    JavaScript中的鼠标事件是Web开发中不可或缺的一部分,它们允许开发者响应用户的鼠标操作,从而实现丰富的交互功能。这些事件主要分为两类:按钮事件和运动事件。在本篇中,我们将深入探讨JavaScript的鼠标事件,...

    javascriptEvent对象详解定义.pdf

    在 JavaScript 中,Event 对象是事件状态的代表,它包含了事件发生的元素、键盘状态、鼠标位置和鼠标按钮状态等信息。一旦事件发生,浏览器的内存中就会生成相应的 Event 对象,如单击一个按钮。Event 对象只在事件...

    javascript_鼠标事件总结

    ### JavaScript 鼠标事件详解 #### 一、概述 JavaScript 的鼠标事件是网页交互设计中的重要组成部分,通过这些事件可以实现丰富的用户交互效果。在本文档中,我们将重点介绍几种常用的鼠标事件,并通过示例代码展示...

    javascript中event详解

    `event`对象包含了关于事件的所有相关信息,例如触发事件的对象、鼠标的位置、按下的键以及更多细节。 值得注意的是,`event`对象只有在事件发生的过程中才是有效的。一旦事件处理完毕,该对象就会被销毁。因此,...

    javascript中window.event事件用法详解

    window.event对象是JavaScript中一个特殊的对象,它代表当前发生的事件的状态,包括触发事件的元素、鼠标位置和按键状态等信息。window.event对象仅在事件处理函数运行期间有效,因此它是事件处理函数的局部变量。每...

    JavaScript程序设计——事件处理实验报告.docx

    - **Event对象**:事件处理函数中通常会传递一个Event对象,包含了关于事件的信息,如事件类型、位置等。 - **键盘事件**:如`onkeydown`(键按下)、`onkeyup`(键释放)和`onkeypress`(字符键按下)。 - **...

    jquery鼠标事件

    ### jQuery鼠标事件详解 在网页开发中,合理利用jQuery库能极大地提高JavaScript代码的编写效率。jQuery通过封装一系列复杂的DOM操作,使得开发者能够更轻松地处理网页中的元素和事件。本文将详细介绍jQuery中与...

    JavaScript事件学习小结(五)js中事件类型之鼠标事件

    javaScript事件学习小结(四)event的公共成员(属性和方法) //www.jb51.net/article/86262.htm JavaScript事件学习小结(二)js事件处理程序 //www.jb51.net/article/86264.htm JavaScript事件学习小结(三)js...

    JavaScript实现简单的鼠标滑过下拉菜单源码

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它主要负责处理客户端的交互和动态效果。在网页设计中,下拉菜单是一个常见...学习和理解这些资源,将有助于你深入理解JavaScript在创建交互式网页中的作用。

    javascript事件列表解说

    JavaScript事件是Web开发中不可或缺的一部分,它允许我们与用户进行交互,响应用户的操作,并控制页面的行为。本篇文章将深入解析JavaScript事件列表...在实践中,不断学习和探索,才能充分利用JavaScript事件的潜力。

    JavaScript Event学习第九章 鼠标事件

    JavaScript中的鼠标事件包括了多个不同类型的事件,如mousedown、mouseup、click、dblclick、mousemove、mouseover和mouseout等,这些事件的熟悉和应用对于开发交互性网站界面至关重要。 在第九章中,作者首先介绍...

Global site tag (gtag.js) - Google Analytics