javascript事件之:jQuery事件接口概述

  事件的操作,在JavaScript是非常频繁的。然而原生javaScript的事件API让新手感觉非常不友好,再加上事件依赖于DOM,而原生javaScript对DOM的选择又是三板斧的功力。由此催生出以jQuery为领头羊的对原生js事件操作的兼容性处理,API优化以及一些功能的拓展。

  现在,以jQuery2.0.3为例,我们来看看jQuery的事件接口。

  首先来看拓展到jQuery.prototype下的实例方法:

//5049 - 51501 jQuery.fn.extend({
2     on: function( types, selector, data, fn, /*INTERNAL*/ one ) { ... },
3     one: function( types, selector, data, fn ) { ... },
4     off: function( types, selector, fn ) { ... }),
5     trigger: function( type, data ) { ... },
6     triggerHandler: function( type, data ) { ... }
7 })
//6742-6773//提供的一些便捷方法 1 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
 2     "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
 3     "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
 4
 5     // Handle event binding
 6     jQuery.fn[ name ] = function( data, fn ) {
 7         return arguments.length > 0 ?
 8             this.on( name, null, data, fn ) :
 9             this.trigger( name );
10     };
11 });
12 jQuery.fn.extend({
13     hover: function( fnOver, fnOut ) { ... },
14     bind: function( types, data, fn ) { ... },
15     unbind: function( types, fn ) { ... },
16     delegate: function( selector, types, data, fn ) { ... },
17     undelegate: function( selector, types, fn ) { ... }
18 })

jQuer写法的多样性在这里可窥见一二。

这里的方法除了triggerHandler每一个在实际开发中都比较常用。

triggerHandler的用法如下:

js代码:

$("#inputTxt").on("focus", function(){
    console.log("获得焦点")
})
$("#triggerHandler").on("click", function(){
    $("#inputTxt").triggerHandler("focus")
})
$("#trigger").on("click", function(){
    $("#inputTxt").trigger("focus")
})

html代码:

<input id="inputTxt" type="text" name="" id="" />
<input id="trigger" type="button" value="trigger触发"/>
<input id="triggerHandler" type="button" value="triggerHandler触发"/>

当点击”trigger触发“按钮,触发text输入框的自定义focus事件和默认的focus事件

而点击“triggerHandler触发”按钮,仅仅触发自定义focus事件,默认事件被阻止了。

事实上,triggerHandler不仅能够阻止默认事件,还能阻止冒泡事件。

以上的接口就是jQuery对外的实例接口。可是我们知道,jQuery的实例方法基本上都是一层表皮,其真正的实现更多是靠jQuery拓展方法。

拓展方法

 1 jQuery.event = {
 2     global: {},
 3     add: function( elem, types, handler, data, selector ) {},
 4     remove: function( elem, types, handler, selector, mappedTypes ) {},
 5     trigger: function( event, data, elem, onlyHandlers ) {},
 6     dispatch: function( event ) {},
 7     handlers: function( event, handlers ) {},
 8     props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
 9     fixHooks: {},
10     keyHooks: {
11         props: "char charCode key keyCode".split(" "),
12         filter: function( event, original ) {}
13     },
14     mouseHooks: {
15         props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
16         filter: function( event, original ) {}
17     },
18     fix: function( event ) {},
19     special: {},
20     simulate: function( type, elem, event, bubble ) {}
21 }
22 jQuery.Event = function( src, props ) {}
23 jQuery.Event.prototype = {
24     isDefaultPrevented: returnFalse,
25     isPropagationStopped: returnFalse,
26     isImmediatePropagationStopped: returnFalse,
27     preventDefault: function() {},
28     stopPropagation: function() {},
29     stopImmediatePropagation: function() {}
30 }

最后是一些兼容性处理

 1 jQuery.each({
 2     mouseenter: "mouseover",
 3     mouseleave: "mouseout"
 4 }, function( orig, fix ) {
 5     jQuery.event.special[ orig ] = {
 6         delegateType: fix,
 7         bindType: fix,
 8         handle: function( event ) {
 9             ...
10         }
11     };
12 });
13
14 if ( !jQuery.support.focusinBubbles ) {
15     jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
16             handler = function( event ) {
17                 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
18             };
19         jQuery.event.special[ fix ] = {
20             setup: function() {
21                 ...
22             },
23             teardown: function() {
24                 ...
25             }
26         };
27     });
28 }

好了,下一回我们实例方法下的这些接口如何与jQuery.event,jQuery.Event协同工作。

时间: 2024-10-06 06:19:07

javascript事件之:jQuery事件接口概述的相关文章

JavaScript之jQuery-4 jQuery事件(页面加载后执行、事件处理、事件冒泡、事件对象、模拟操作)

一.jQuery 页面加载后执行 代码执行的时机选择 - $(document).ready()方法和 window.onload事件具有相似的功能,但是在执行时机方面是有区别的 - window.onload 事件是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行 - $(document).ready()方法注册的事件处理程序,在DOM完全加载后就可以调用 - 一般来讲, $(document).ready()的执行要优于window.onload事件 - 需要注意的是,

DOM事件与jQuery事件的是非纠葛

在javascript和JQuery之中,都有事件的处理方式,在我们编写程序实现某些功能的时候,我们会发现使用原生的DOM事件与JQuery中封装的事件都能实现同样的效果,那么也许我们会认为他们之间的区别不是很大,甚至说基本没有区别.这种观点是错误的,其实在事件函数的底层设计时,他们赋予元素的事件属性是通过不同的事件绑定机制来实现的. 我们先从表面理解:我们都知道,JQuery是javascript的一个函数库,他是基于javascript原生设计的.就是说JQuery中的事件,都是通过java

JQuery的事件委托;jQuery注册事件;jQuery事件解绑

一.事件 ①事件委托:就是给子元素的父元素或者祖先元素注册一个事件,但是事件的执行者是子元素,委托事件的好处是能够给动态创建出来时元素也加上事件. ②简单事件:就是给自己注册事件自己执行动态创建出来的事件不会有事件. ③使用方法:$("span").on("click",function(){alert("这是一个简单事件");}): $("div").on("click", "span"

彻底弄懂jQuery事件原理二

上一篇说到,我们在最外层API的on,off,tiggler,triggerHandler调用的是event方法的add,remove和tirgger方法,本篇就来介绍event辅助类 \ 先放个图,这其实就是整个事件流程的过程: 1. add方法: add: function(elem, types, handler, data, selector) { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, hand

html事件-子元素事件不触发父元素事件

<div class="list-row" onclick="showChatDialog('dy','100000001',true);"> <img class="icon" src="/icon/default.ico" onclick="personData(event,100000001);"> <a class="nickname">dy&

事件冒泡和事件默认行为

1.原生态事件 取得原生态的事件对象: <button onclick="get(event)" type="button">tijiao</button> 阻止事件冒泡: 1 //如果提供了事件对象,则这是一个非IE浏览器 2 if ( e && e.stopPropagation ) 3 //因此它支持W3C的stopPropagation()方法 4 e.stopPropagation(); 5 else 6 //否则,

javascript事件之:jQuery事件中实例对象和拓展对象之间的通信

我们总结过jQery事件中的实例原型对象对外接口和拓展对象,现在我们看看他们是如何进行通信联系的. 先来看便捷方法: 1 //调用的还是实例对象下的on()和trigger() 2 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + 3 "mousedown mouseup mousemove mouseover mouseout mouseenter

JavaScript和JQuery中的事件\委托链\事件冒泡\事件捕获,兼容所有浏览器

有做过北大青鸟培训讲师经验的我,如今在一家公司做技术部经理的职位,发现有很多程序员的基本功相当糟糕,在组织企业内部培训时讲解了一些案例,总结了一些经典代码,希望对自己和有需要的人提供一些帮助吧: JavaScript版本: DOM0事件不支持委托链 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="C

Javascript - Jquery - 事件

事件(Event) 页面载入事件 ready(x) x是事件侦听器,由window或document调用.加载完毕会调用x. $(document).ready(function(){ }) //可以简写为:$(function(){ }) //或 $(document).ready(aa=function(){ }) //或 $(document).ready(aa) function aa(){ } 键盘鼠标事件 keyup(x) x是事件侦听器,键盘按下时或使用鼠标粘贴时会调用x. $(d