`
adrift
  • 浏览: 19136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

jQuery的"特别事件"扩展

 
阅读更多

特别事件

翻译自http://brandonaaron.net/blog/2009/03/26/special-events

原作者:Brandon Aaron

jQuery自1.2.2版开始引入称为"特别事件"的扩展API。These events are special because they have the ability to do some extra work for specific events and even the option to bypass some of the internal jQuery event system. 有了这些特别事件你可以创建需要一些setup work的自定义事件,甚至你可以完全重载标准jQuery事件的行为。

We use special events in jQuery to create the “mouseenter” and “mouseleave” events. In addition to those two events we used it to make the “ready” event and I use it to normalize the “mousewheel” event in the mouse wheel plugin.

一个例子: “tripleclick”三次点击

我们打算建立一个新事件,该事件当用户对某个元素点击三次以后触发。传统上我们应该建立类似jQuery.fn.tripleclick这样的jQuery插件. 但在这里我们不这么做, 我们想要利用标准jQuery事件系统的bind语法及其它好处比如event normalization, data, and namespaces.

首先我们要建立这个特殊事件。每个特殊事件需要定义setupteardown方法。方法setup在事件被bind时调用而方法teardown则在解除bind时调用。注意:这两个方法对每个元素只会被调用一次,因为jQuery事件系统会管理多次bind的事件处理器等所有繁琐的事情。

In jQuery 1.3 there is a new special event type called “Special All” that operates for all handlers but has a slightly different behavior. However, that is for another article.(这个特性已经被取消,不应该再使用Special All了,可以改用add/remove钩子,参见最后的延伸阅读部分)

我们的“tripleclick”插件大概骨架如下:

jQuery.event.special.tripleclick = {
    setup: function(data, namespaces) {
        var elem = this;
    },

    teardown: function(namespaces) {
        var elem = this;
    }
};

Notice that the setup event gets passed the data and namespaces that were used when binding the event. Also that theteardown event gets passed the namespaces that were used when unbinding the event. Although, they are only marginally useful here since this is the data and namespaces associated with the very first event handler bound to a particular element. But you could use the data to configure the event for all the handlers of that type for an element. The scope, or the value ofthis, for these two methods is the element the event is being bound to.

Behind the scenes we are actually going to utilize the native “click” event to keep track of the number of clicks on an element. We’ll also need a handler that actually does the heavy work of keeping track. I’m going to add a third method called handlerto the tripleclick special event. To make the code a little more simple I’m going to track the number of clicks on an element by using the jQuery data API.

The updated tripleclick special event looks like this.

jQuery.event.special.tripleclick = {
    setup: function(data, namespaces) {
        var elem = this, $elem = jQuery(elem);
        $elem.bind('click', jQuery.event.special.tripleclick.handler);
    },

    teardown: function(namespaces) {
        var elem = this, $elem = jQuery(elem);
        $elem.unbind('click', jQuery.event.special.tripleclick.handler);
    },

    handler: function(event) {
        var elem = this, $elem = jQuery(elem), clicks = $elem.data('clicks') || 0;
        clicks += 1;
        if ( clicks === 3 ) {
            clicks = 0;
            // set event type to "tripleclick"
            event.type = "tripleclick";
            // let jQuery handle the triggering of "tripleclick" event handlers
            jQuery.event.handle.apply(this, arguments)
        }
        $elem.data('clicks', clicks);
    }
};

To quickly break down the handler code. First we get the number of clicks via the data API and increment the number by 1. Then we check to see if it has been clicked 3 times. If so, we then need to reset the number of clicks and trigger the other event handlers as the comment indicates. Finally, we store the new value for the number clicks on the element via the data API.

The handler has to set the event type to “tripleclick” because behind the scenes we actually use a click event. jQuery uses the event type to know which handlers it should call and we want it to call the event handlers for our “tripleclick” event.

The Example

We can now use our special event just like we’d use any other event via the bind method. For example to bind a “tripleclick” event to all divs we’d write the following code.

jQuery('div').bind('tripleclick', function(event) {
    alert('triple clicked');
});

You can see an example of this new special event in action here.

You could enhance this event by requiring all three clicks to be within a certain timeframe. You could achieve this by also storing the event.timeStamp property of the previous click and comparing the distance between it and the latest click.

返回值

前面我说过特别事件能够bypass到内部的jQuery事件系统。The functionality that can be skipped is the actual binding of the event to the element using the addEventListener or attachEvent methods. This functionality is skipped based on the return value. 返回任何非false的值会阻止jQuery将该事件通过DOM实际bind到元素上。换句话说,如果从方法setupteardown中return false的话,jQuery将调用DOM API将事件bind到元素上。在我们的tripleclick插件中,我们不希望在元素上bind这个"tripleclick"事件(并不存在这样的DOM事件),所以我们没有返回任何值(就是说,返回了undefined)

 

延伸阅读

jQuery 1.4为特别事件新增的add和remove钩子: http://brandonaaron.net/blog/2009/06/4/jquery-edge-new-special-event-hooks

Automating with Special Events: http://brandonaaron.net/blog/2009/06/17/automating-with-special-events

Special Events: The changes in jQuery 1.4.2: http://brandonaaron.net/blog/2010/02/25/special-events-the-changes-in-1-4-2

 

分享到:
评论

相关推荐

    jquery语法提示扩展

    为了解决这个问题,一款名为“jQuery语法提示扩展”的插件应运而生,特别适用于Adobe Dreamweaver这款流行的Web开发环境。 这款jQuery语法提示扩展,主要的功能是为Dreamweaver提供实时的jQuery代码提示。当开发者...

    为jQuery添加自定义事件机制

    除此之外,jQuery还支持`one`方法,用于只执行一次的事件绑定,这对于一次性操作特别有用。例如: ```javascript $(selector).one('customEvent', function() { console.log('This will only be logged once.'); }...

    jquery easyui pagination 分页插件扩展

    在本案例中,我们关注的是"jquery easyui pagination 分页插件扩展",这是一个用于增强默认分页功能的自定义插件。 分页在数据展示中扮演着重要的角色,特别是在处理大量数据时,它能让用户按需加载和浏览数据,...

    JQuery事件Demo

    jQuery允许我们自定义并触发事件,增强了代码的可扩展性和模块化。使用`.trigger()`方法可以触发自定义事件: ```javascript $(document).on('myCustomEvent', function() { console.log('Custom event triggered!...

    12个很棒的jQuery选择器扩展

    这篇博客文章“12个很棒的jQuery选择器扩展”深入探讨了一些超越了标准CSS选择器的高级jQuery选择器,这些扩展极大地提升了开发效率和代码的可读性。通过阅读和理解这些选择器的用法,开发者可以更加熟练地操纵页面...

    jQuery键盘按钮响应事件代码.zip

    在JavaScript的世界里,jQuery库为开发者提供了极大的便利,特别是在处理DOM操作、事件处理以及动画效果等方面。本资源“jQuery键盘按钮响应事件代码.zip”显然关注的是如何利用jQuery来实现键盘按键与页面上按钮的...

    JQuery基础教程(第4版)

    的方式讲解了jQuery 的核心组件 包括jQuery 的选择符 事件 动画 DOM 操作 Ajax 支持等 第7 章 , 、 、 、 、 。 和第8 章介绍了jQuery UI jQuery Mobile 及利用jQuery 强大的扩展能力开发自定义插件 随后的几章...

    jQuery Combobox 扩展

    jQuery Combobox的工作原理主要是通过jQuery事件监听和DOM操作实现的。它首先将Select元素隐藏,然后创建一个包含输入框和下拉按钮的结构,输入框用于显示当前选中项和进行搜索,下拉按钮则展开/隐藏下拉列表。当...

    jquery实现文本域自动扩展宽度

    "jQuery实现文本域自动扩展宽度"就是一种优化用户体验的技术,它使得文本域的宽度能够随着用户输入的内容自动增加,保持文本的视觉连续性。 jQuery是一个轻量级的JavaScript库,它简化了HTML元素的选择、事件处理、...

    jquery事件

    首先,jQuery事件是JavaScript事件处理的一个扩展,它提供了一种更加简洁和优雅的方式来绑定和触发事件。jQuery中的事件处理主要有两种方式:事件绑定(Event Binding)和事件触发(Event Triggering)。 1. 事件...

    JQuery1.4.1与JQuery1.8.3

    1. **性能提升**:在 1.4.1 版本中,jQuery 团队专注于提高库的性能,特别是针对 DOM 操作和事件处理进行了优化。 2. **新的选择器引擎Sizzle**:这个版本引入了 Sizzle,一个独立的选择器引擎,增强了 jQuery 的 ...

    jQuery基础教程

    的方式讲解了jQuery 的核心组件,包括jQuery 的选择符、事件、动画、DOM 操作、Ajax 支持等。第7 章 和第8 章介绍了jQuery UI、jQuery Mobile 及利用jQuery 强大的扩展能力开发自定义插件。随后的几章更 加深入地...

    jQuery基础教程(第四版)

    第7章和第8章介绍了jQuery UI、jQuery Mobile及利用jQuery强大的扩展能力开发自定义插件。随后的几章更加深入地探讨了jQuery的各种特性及一些高级技术。附录A特别讲解了JavaScript中闭包的概念,以及如何在jQuery中...

    jQuery颜色选择器ColorPicker

    `jquery.colorpicker.js`是`jQuery ColorPicker`的主脚本文件,它扩展了`jQuery`对象,添加了颜色选择器的功能。通过调用这个插件,开发者可以在网页上轻松添加一个颜色选择控件,无需额外编写复杂的JavaScript代码...

    jQuery实现给input绑定回车事件的方法

    特别是对表单元素的操作,比如给`<input>`输入框绑定回车键事件,这在用户界面设计中非常常见。jQuery库因其简洁的语法和强大的功能被广泛用于简化JavaScript代码。接下来,我们详细讲解如何利用jQuery给input元素...

    jquery jquery控件 时间控件 时分秒控件

    在本文中,我们将深入探讨jQuery时间控件,特别是那些能够显示和选择时、分、秒的控件。jQuery是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及Ajax交互。时间控件在Web应用中非常常见,...

    jQuery动画扩展(个人专属版)

    jQuery动画扩展是jQuery库的一个重要组成部分,它极大地丰富了网页动态效果的实现方式,使得开发者可以轻松地创建出各种复杂的视觉交互。这个个人专属版集合了作者在网上精心搜集的jQuery动画资源,旨在为开发者提供...

    jQuery扩展将复杂form表单转成json对象

    在JavaScript开发中,jQuery库是广泛使用的工具,它简化了DOM操作、事件处理以及Ajax交互。在处理HTML表单(form)数据时,jQuery提供了一种便捷的方式将表单数据序列化为JSON对象,这对于前后端数据交换尤其有用。...

    jquery 1.12.4版本.zip

    7. **兼容性**:jQuery 1.12.4特别强调与旧浏览器的兼容,包括Internet Explorer的较早版本,这在当时是许多项目必须考虑的问题。 8. **插件系统**:jQuery有一个庞大的插件生态系统,允许开发者扩展其功能,如表单...

Global site tag (gtag.js) - Google Analytics