`

jQuery代码优化:基本事件篇

阅读更多
jQuery代码优化:基本事件篇

jQuery对事件系统的抽象与优化也是它的一大特色。本文仅从事件系统入手,简要分析一下jQuery为什么提供mouseenter和mouseleave事件,它们与标准的mouseover、mouseout事件有什么区别。

事件模型

说到事件,就要追溯到网景与微软的“浏览器大战”了。当时,事件模型还没有标准,两家公司的实现就是事实标准。网景在Navigator中实现了“事件捕获”的事件系统,而微软则在IE中实现了一个基本上相反的事件系统,叫做“事件冒泡”。这两种系统的区别在于当事件发生时,相关元素处理(响应)事件的优先权不同。

下面举例说明这两种事件机制的区别。假设文档中有如下结构:

<div>
    <span>
        <a>...</a>
    </span>
</div>
因为这三个元素是嵌套的,所以单击了a,实际上也就单击了span和div。换句话说,这三个元素都应该有处理单击事件的机会。在事件捕获机制下,处理这个单击事件的优先次序是:div > span > a;而在事件冒泡机制下,处理这个单击事件的优先次序则是:a > span > div。

后来,W3C的规范要求浏览器同时支持捕获和冒泡机制,并允许开发人员选择把事件注册到哪个阶段。于是就有了下面这个注册事件的标准方法:

target.addEventListener(type, listener, useCapture Optional );
其中:

type:字符串,表示监听的事件类型
listener:监听器对象(JavaScript函数),在指定事件发生时可以收到通知
useCapture:布尔值,是否注册到捕获阶段
在实际应用开发中,为了确保与IE(因为它不支持捕获)兼容,useCapture一般都指定为false(默认值也是false)。换句话说,只把事件注册到冒泡阶段;对于上面那个简单的例子来说,响应顺序就是:a > span > div。

冒泡的副作用

如前所述,IE的冒泡事件模型基本上成为了事实标准。但冒泡有一个副作用。

仍以前面的文档结构为例,假设它是界面中的一个菜单项,我们希望用户鼠标离开div时隐藏菜单。于是,我们给div注册了一个mouseout事件。如果用户鼠标是从div离开的,那么一切正确。而如果用户鼠标是从a或span离开的,问题就来了。因为由于事件冒泡,从这两个元素开始分派的mouseout事件都会传播到div,从而导致鼠标并没有离开div,菜单就提前隐藏了。

当然,冒泡的副作用不难避免。比如,给div内部的每个元素都注册mouseout事件,并使用.stopPropagation()方法阻止事件进一步传播。对于IE,就得将事件对象的cancelBubble属性设置为false,取消事件冒泡。不过,这仍然回到自己处理浏览器不兼容性问题的老路上了。

优化方案

为了避免冒泡的副作用,jQuery提供了mouseenter和mouseleave事件,就使用它们来代替mouseover和mouseout吧。

下面这个摘自jQuery的内部函数withinElement,就是为mouseenter和mouseleave提供支持的。翻译了一下注释,仅供大家参考。

// 下面这个函数用于检测事件是否发生在另一个元素的内部
// 在 jQuery.event.special.mouseenter 和 mouseleave 处理程序中使用
var withinElement = function( event ) {
    // 检测 mouse(over|out) 是否还在相同的父元素内
    var parent = event.relatedTarget;

    // 设置正确的事件类型
    event.type = event.data;

    // Firefox 有时候会把 relatedTarget 指定一个 XUL 元素
    // 对于这种元素,无法访问其 parentNode 属性
    try {

        // Chrome 也类似,虽然可以访问 parentNode 属性
        // 但结果却是 null
        if ( parent && parent !== document && !parent.parentNode ) {
            return;
        }

        // 沿 DOM 树向上
        while ( parent && parent !== this ) {
            parent = parent.parentNode;
        }

        if ( parent !== this ) {
            // 如果实际正好位于一个非子元素上面,那好,就处理事件
            jQuery.event.handle.apply( this, arguments );
        }

    // 假定已经离开了元素,因为很可能鼠标放在了一个XUL元素上
    } catch(e) { }
},
结论

在jQuery里,可以使用mouseenter和mouseleave事件来避免事件冒泡的副作用。
分享到:
评论

相关推荐

    JQuery应用四:滑片效果

    接下来,我们需要编写jQuery代码来控制滑片的显示和隐藏。这里,我们可以使用定时器(`setInterval`)实现自动轮播,同时添加按钮或导航点来手动切换。 ```javascript $(document).ready(function() { var ...

    jQuery入门实例:使用jQuery编写简单的类tooltip的小插件

    4. **编写jQuery代码**:这是核心部分。我们需要监听鼠标悬停事件,当事件触发时,创建并显示tooltip。jQuery的`.hover()`方法可以方便地处理这一过程。同时,可能还需要处理鼠标离开时隐藏tooltip的逻辑。 5. **...

    jQuery第1天:JQ基本介绍、使用步骤、jQuery对象与DOM对象(重点)、jQuery选择器

    2. 包裹函数:为了避免与其他库冲突,jQuery代码通常包裹在`$(document).ready(function() { ... })`中,确保在页面加载完成后再执行。 3. 使用jQuery方法:利用jQuery提供的方法,如`$(selector).action()`,来操作...

    JQuery应用三:菜单效果

    本篇文章将深入探讨如何利用jQuery实现菜单效果,这在网页设计和开发中是至关重要的,因为良好的菜单设计能提升用户体验,使网站更加易用。 首先,我们需要了解jQuery的基本语法。jQuery的核心概念是选择器,它用于...

    jQuery代码优化 事件委托篇

    【jQuery代码优化 - 事件委托篇】 随着网页开发中DOM结构变得越来越复杂,以及Ajax等动态脚本技术的广泛运用,事件委托成为了一个重要的优化手段。事件委托是JavaScript和jQuery中用于提高性能和减少内存消耗的技术...

    jquery监听DIV的事件

    上述代码中的`.on()`方法接收三个参数:事件类型(如"click")、事件处理函数和(可选的)事件作用域。在这个例子中,我们只关注事件类型和处理函数,当用户点击DIV时,处理函数会被调用。 除了基本的点击事件,...

    jquery在线客服代码

    本篇文章将深入探讨jQuery在线客服代码的核心原理、实现方式以及如何根据需求调整皮肤风格。 **一、jQuery简介** jQuery是由John Resig于2006年创建的一个JavaScript库,它简化了HTML文档遍历、事件处理、动画和...

    jquery特效网页代码

    本篇文章将深入探讨jQuery特效在网页代码中的应用,以及如何利用jQuery创建炫彩的颜色选择器。 一、jQuery基础与优势 jQuery的核心理念是"Write Less, Do More",它通过简洁的语法提供了丰富的功能,如DOM操作、...

    jQuery水平横向时间轴历程代码.zip

    本篇文章将详细解析“jQuery水平横向时间轴历程代码”,帮助读者理解并掌握这一实用技巧。 首先,我们要明确这个代码的核心功能:创建一个带有左右箭头控制的时间轴,用户可以通过点击箭头来滚动查看入职经历或其他...

    jQuery学习文档

    不过,根据标题和描述,我们可以推测这篇文档可能是关于jQuery的学习资料。以下是一些关于jQuery的知识点,供您参考: jQuery是一个快速、小巧且功能丰富的JavaScript库,它通过减少JavaScript编程的复杂性,极大地...

    不用插件简单代码实现JQuery特效的jquery-tutorials

    这篇教程的目的是引导初学者或有一定基础的开发者通过实际的代码示例,掌握jQuery的基本用法和常见特效,提升网页动态效果的实现能力。通过学习这些知识点,开发者能够更加熟练地运用jQuery,提升网页开发效率和用户...

    最新jQuery实现浮动气泡步骤引导提示代码

    3. **编写jQuery代码**: - **定位元素**:使用`$(selector)`选择器来找到需要添加气泡提示的元素。 - **创建气泡提示**:使用`append()`或`html()`方法在选定元素附近创建提示气泡的HTML结构。 - **设置样式**:...

    jQuery导航图片全屏滚动代码.zip

    本篇文章将深入探讨如何利用jQuery和fullPage插件来创建一个响应式的导航下拉菜单以及全屏的banner图片轮播效果。 首先,让我们了解jQuery的基本概念。jQuery是由John Resig在2006年创建的一个JavaScript库,它的...

    jquery html5网页播放器代码.zip

    3. JavaScript/jQuery代码:通过jQuery操作`&lt;video&gt;`元素,响应用户交互,控制视频的播放、暂停、音量、进度等。同时,也可以实现一些高级功能,如视频预加载、自动适应屏幕尺寸等。 具体到压缩包内的1983文件,这...

    jQuery绘制中国省份地图样式代码

    本篇文章将深入探讨如何使用jQuery来绘制中国省份地图的样式代码,帮助开发者实现交互式的地理信息展示。 首先,让我们从基本结构开始。在`index.html`文件中,你需要引入jQuery库以及自定义的JavaScript文件。通常...

    jQuery投票征名代码.zip

    本篇文章将详细解析一个名为“jQuery投票征名代码”的项目,该项目利用jQuery 1.4.2版本实现了一个鼠标悬停时动态展示征名释义的效果。这一功能在互动性强的投票系统或在线活动中,能够提供用户友好的体验,增强用户...

    jQuery圆形音乐播放器代码

    本篇将详细解析一款基于jQuery的圆形音乐播放器代码,它拥有精美的CD碟片式外观,提供丰富的播放控制功能。 ### 一、jQuery简介 jQuery是一款高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理、动画设计...

    jQuery轻量级树状菜单插件代码

    3. **jQuery代码**:接下来,我们用jQuery编写插件的核心逻辑。主要任务是监听点击事件,处理展开和折叠操作。以下是一个基本示例: ```javascript $.fn.treeMenu = function() { return this.each(function() { ...

    jQuery滑动拖动设置时间日期范围选择器代码

    本篇文章将深入探讨如何利用jQuery实现滑动拖动设置时间日期范围选择器的功能,这对于构建用户友好的Web应用尤其有用。 首先,我们需要理解jQuery的基本语法和API。jQuery对象通常用"$"表示,它可以用来选择DOM元素...

    android jqueryMobile 类库和实例源代码

    本篇文章将深入探讨jQuery Mobile在Android环境中的应用,以及如何利用提供的类库和实例源代码进行开发。 一、jQuery Mobile简介 jQuery Mobile是一个轻量级的、触屏优化的JavaScript框架,专为构建跨平台、跨设备...

Global site tag (gtag.js) - Google Analytics