- 浏览: 323154 次
- 性别:
- 来自: 南昌
文章分类
最新评论
-
j_bird:
你好,想探讨下滑动窗口是怎么计算的,一条群发短信发出去,滑动窗 ...
协议研发 中移动CMPP2.0协议API -
andyliulin:
楼主,现在的magicode 生成器工具的 官网,http: ...
Mgicode 生成器正式发布 -
huazai_wow:
楼主 你只是分析了 在jquery 中 有使用到 jQu ...
jquery event trigger 分析 -
dengkanghua:
CMPP2.0中出现流量控制错误是什么引起的。有什么解决办法吗 ...
协议研发 中移动CMPP2.0协议API -
JohnHust:
[flash=200,200][/flash][url][/u ...
Jquery源码分析(一)
6.2.2 trigger
prk/彭仁夔 08-08-26 注册了事件,如onclick。那么当用户点击这个元素时,就会自动触发这个事件的已经注册的事件处理函数。但是我们有的时候要采用程序来模拟事件的触发就得采用强迫触发某个事件。在IE中我们可以采用.fireEvent()来实现。如:<form onsubmit="a()" >中,如果button的form.submit()的方式提交表单,是不会主动触发onsumbit事件的,如果必须的话,就要在submit前$(“:form”)[0].fireEvent("onsubmit”,),这样就会触发该事件。 在mozilla中有三个步骤: var evt = document.createEvent('HTMLEvents'); evt.initEvent('change',true,true); t.dispatchEvent( evt ); 在prototype是采用这样的方式来实现的。那么jquery中呢,它的实现方式有一点不一样。 trigger : function(type, data, fn) { return this.each(function() { jQuery.event.trigger(type, data, this, true, fn); }); }, Trigger有三个参数,data参数是为了注册的事件函数提供了实传。如果data[0]中preventDefault存在,data[0]就可以做为用户自定义的包裹事件的空间。Fn是可以为事件提供一个即时即用的事件处理方法。也就是在没有注册事件的情况下也可以通过传入处理函数来处理事件。如果已经注册了,那就是在原来的事件处理函数之后执行。 //这个方法将会触发指定的事件类型上所有绑定的处理函数。但不会执行浏览器默认动作. triggerHandler : function(type, data, fn) { return this[0]&& jQuery.event.trigger(type,data,this[0],false,fn); }, triggerHandle通过把jQuery.event.trigger的donative参数设为false,来阻止执行浏览器默处理方法。它与trigger不现的一点,还在于它只是处理jquery对象的第一个元素。 上面两个方法都调用了jQuery.event.trigger来完成任务: trigger : function(type, data, elem, donative, extra) { data = jQuery.makeArray(data);//data可以为{xx:yy} //支持getData!这样的形式,exclusive = true表现会对add的注册的 //事件的所有函数进行命名空间的分种类的来执行。 if (type.indexOf("!") >= 0) { ① type = type.slice(0, -1);var exclusive = true; } if (!elem) {// 处理全局的fire事件 ② if (this.global[type]) jQuery.each(jQuery.cache, function() { // 从cache中找到所有注册该事件的元素,触发改事件的处理函数 if (this.events && this.events[type]) jQuery.event.trigger(type, data, this.handle.elem); }); } else {// 处理单个元素事件的fire事件 ③ if (elem.nodeType == 3 || elem.nodeType == 8) return undefined; var val, ret, fn = jQuery.isFunction(elem[type] || null), // 如果data参数传进入的不是浏览器的event对象的话,event变量为true. //如果data参数本身是娄组,那么第一个元素不是浏览器的event对象时为true. //对于event为true。即没有event传进入,先构建一个伪造的event对象存在data[0]。 event = !data[0] || !data[0].preventDefault; // 在没有传入event对象的情况下,构建伪造event对象。 if (event) {//存到数组中的第一个 ④ data.unshift( { type : type,target : elem, preventDefault : function() {},stopPropagation : function() {}, timeStamp : now() }); data[0][expando] = true; // 不需要修正伪造的event对象 } data[0].type = type; //防止事件名出错 //表现会进行事件注册函数的分类(命名空间)执行。不是所有的。 if (exclusive) data[0].exclusive = true; //与prototype等传统的处理方式不一样,没有采用fireEvent来 //来fire通过注册到浏览器事件中的事件处理方法。 //这里分了三步,先fire通过jQuery.event.add来注册的事件,这个事件 //有可能是自定义的事件(没有注册到浏览器事件中)。 //第二步是fire通过elem.onclick方式注册的事件的本地处理函数 //第三步是fire默认的事件处理方式(在本地的onclick的方式注册 //不存在的情况下)。 // 这里是触发通过jQuery.event.add来注册的事件, var handle = jQuery.data(elem, "handle"); ⑤ if (handle)val = handle.apply(elem, data); //这里data分成多个参数 //处理触发通过elem.onfoo=function()这样的注册本地处理方法, //但是是对于links 's .click()不触发,这个不会执行通过addEvent //方式注册的事件处理方式。 if ((!fn || (jQuery.nodeName(elem, 'a') && type == "click")) ⑥ && elem["on"+ type]&& elem["on"+type].apply(elem,data) === false) val = false; //额外的函数参数的开始几个是通过data给定的。这里会把伪造加上的event给去掉。 //它的最后一个参数是一系列的事件处理函数返回的结果,一般为bool值 //这个函数可以根据这个结果来处理一个扫尾的工作。 if (event) data.shift(); // 处理触发extra给定的函数处理。 if (extra && jQuery.isFunction(extra)) { ⑦ ret = extra.apply(elem, val == null ? data : data.concat(val)); //如果这个函数有返回值,那么trigger的返回值就是它的返回值 //没有的话就是串连的事件处理函数的最后一个返回值。一般为bool if (ret !== undefined) val = ret; } // 触发默认本地事件方法,它是在没有如.onclick注册事件 //加上前面的执行事件处理函数返回值都不为false的情况下,才会执行。 //它还可以通donative来控制是否执行。 //如form中可以采用this.submit()来提交form. if (fn && donative !== false && val !== false ⑧ && !(jQuery.nodeName(elem, 'a') && type == "click")) { this.triggered = true; try {elem[type](); //对于一些hidden的元素,IE会报错 } catch (e) {} } this.triggered = false; } return val; }, Jquery的fire事件的方法与prototype中实现是完全不一样的。Ext、YUI没有提供强迫触发事件的方法。对于一般的思维,程序来触发浏览器的事件就应该采用fireEvent或dispatchEvent方法来运行。 但是jquery采用一种不同的方法。对于通过jquery.event.add来注册的事件(不管是自定义的还是注册到浏览器事件),它保存在一个与元素及事件名相对应的cache中。在浏览器的触发中,这个是没有什么作用。但是它是为了通过等程序来强迫触发时,从cache中取到对应的事件处理函数。这个时候就抛开了浏览器的事件。在这里还可以执行一些自定义的事件函数。如⑤处。 对于通过html的标签中如click或elem.onclick=function(){}形式注册的事件函数。在⑥处它采用执行元素的如onclick形式的回调函数就可以。通过这种dom0的方式只能注册一个函数。 有的时候,如果没有onclick这样的事件处理函数,浏览器会执行默认的处理函数。如form.submit()。⑧处可以看出对于这样的默认的事件处理,还可以通过参数donative来控制。 程序手动强迫触发事件,有一点问题就是event是怎么生成,就是没有浏览器生成event传入到函数中。Prototype采用了是新生成的dataavailable的事件。这样的事件也没有什么作用。Jquery也采用fake的方式伪造一个一个事件,如④,它比prototype的事件好处在于它能通过trigger的函数的参数来传入需要的event。Prototype则不能。 通过上面的分析,隐隐可以看出Jquery是通过模拟浏览器的触发事件的执行过程来构建这个trigger的函数的。先执行dom1方式(addEvent)注册的事件,再执行dom0方式注册的事件,最后看看要不要执行默认的事件处理。 在⑦处,我们可以看出trigger还可能通过传入回调函数和参数来完成对执行的事件处理函数的结果进行判断处理,形成新结果通过trigger的函数返回。这在有的时候是很有用的。 除了这些,它还能对于事件的处理函数进行分类(namespace),可以在合适的时候调用事件的不同分类的的处理函数(通过jquery.event.add来注册)。这个分类的处理在handle实现。 handle : function(event) { // 返回 undefined or false var val, ret, namespace, all, handlers; //修改了传入的参数,这里是引用。 event = arguments[0] = jQuery.event.fix(event || window.event); // 命名空间处理 namespace = event.type.split("."); event.type = namespace[0]; namespace = namespace[1]; // all = true 表明任何 handler,namespace不存在,同时 //event.exclusive不存在或为假时,all=true. all = !namespace && !event.exclusive; // 找到元素的events中缓存的事件名的处理函数列表 handlers = (jQuery.data(this, "events") || {})[event.type]; for (var j in handlers) {// 每个处理函数执行 var handler = handlers[j]; // Filter the functions by class if (all || handler.type == namespace) { // 传入引用,为了之后删除它们 event.handler = handler; event.data = handler.data;//add的时候加上的 ret = handler.apply(this, arguments);// 执行事件处理函数 if (val !== false) val = ret;// 只要有一个处理函数返回false,本函数就返回false. if (ret === false) {// 不执行浏览器默认的动作 event.preventDefault(); event.stopPropagation(); } } } return val; }, handle的主要功能是就是分类且有序地执行事件的所有的注册的处理函数。
评论
2 楼
huazai_wow
2013-09-03
楼主 你只是分析了 在jquery 中 有使用到 jQuery.event.trigger 方法的区别和
和分析这些情况啊。
楼主 能不能问你一个问题啊.在使用 ajaxfileupload.js 中 使用 jQuery.event.trigger
这个方法会在什么时候执行例如: jQuery.event.trigger("ajaxSend", [xml, s]); 这样的方法会在什么时候执行 。楼主方便的话 写个例子 给我啊 谢谢!
QQ 邮箱: 2598059791@qq.com
和分析这些情况啊。
楼主 能不能问你一个问题啊.在使用 ajaxfileupload.js 中 使用 jQuery.event.trigger
这个方法会在什么时候执行例如: jQuery.event.trigger("ajaxSend", [xml, s]); 这样的方法会在什么时候执行 。楼主方便的话 写个例子 给我啊 谢谢!
QQ 邮箱: 2598059791@qq.com
1 楼
zlssy
2009-03-09
不错,呵呵 学习!
发表评论
-
[转载]jquery.validate.js的基本用法入门
2011-03-10 22:35 2883[转载]jquery.validate.js的基本用法入门 j ... -
使用javascript动态创建SVG对象的问题
2011-01-11 17:18 4744无沙备忘录系列 -平时的一些研究,有时也会颇费功夫,然 ... -
evaluate mxGraph
2010-06-10 16:09 1724To evaluate mxGraph: - Navigate ... -
js中的prototype与constructor
2010-06-09 10:53 2921并且每个函数都有一个默认的prototype属性。 如果这个函 ... -
Jquery1.2.6 源码分析
2008-08-29 00:13 14150jQuery是一个非常优秀的J ... -
jquery fx分析
2008-08-28 19:37 63168 FX分析 prk/彭仁夔 ... -
jqueyr fx源码(修改)
2008-08-28 19:33 2672/* * author:prk date:2008-08-0 ... -
jquery.ajax
2008-08-27 16:50 81137.2 jquery.ajax ... -
jquery event domready
2008-08-26 17:39 41386.3 domReady的处理 ... -
jquery event addEvent 分析
2008-08-26 17:36 111966.2 事件的处理 ... -
jquery event 封装的源源分析
2008-08-26 17:35 46026.Event分析 ... -
jquery position
2008-08-25 16:34 87805.2.3 position ... -
jquery wrap
2008-08-25 08:12 44785.3.5 wrap ... -
jquery element content
2008-08-25 08:11 43475.4dom元素的内容 ... -
jquery class
2008-08-22 23:18 53695.1.2 Class prk/彭仁夔 2008- ... -
jquery attr
2008-08-22 23:16 76145 DOM元素 prk/彭仁夔 ... -
jquery Selector (修改)
2008-08-21 17:10 3096/** * author:prk * date:2008- ... -
CSS selector (jquery的源码分析,修改)
2008-08-21 17:09 44183.3、采用CSS方式查找Dom节点 ... -
如何找到Dom元素
2008-08-20 22:10 28313、如何找到Dom元素 ... -
Jquery源码分析(修改)
2008-08-20 22:07 5784Jquery源码分析 ...
相关推荐
对于事件的操作无非是addEvent,fireEvent,removeEvent这三个事 件方法。... Jquery提供了一个 event的包裹,这个相对于其它的lib提供的有点简单,但是足够使用。 代码如下: //对事件进行包裹。 fix : function(e
本文主要介绍了jQuery中一个用于触发事件的函数——jQuery.event.trigger()。通过本文,我们可以了解到,这个函数主要用于触发页面中的各种事件,包括JavaScript自带的事件如click、change、keyup等,也可以用于触发...
注释会讲解`$.event.add()`、`$.event.trigger()`等关键函数,以及如何使用`.on()`、`.off()`方法来管理事件。 此外,jQuery还封装了大量的DOM操作方法,如`$(selector).html()`, `$(selector).append()`, `$...
- `trigger(event)`:触发事件。 - `off(events, selector, handler)`:解除绑定事件处理器。 3. **示例**:绑定点击事件。 ```javascript $('#button').on('click', function() { console.log('Clicked!'); ...
`jQuery.event.trigger`是jQuery触发事件的底层API,它支持触发各种类型的事件,包括普通浏览器事件和自定义事件。触发事件的过程主要包括以下步骤: 1. **初始化事件**:如果传入的`event`是一个事件类型字符串,...
在jQuery库中,`trigger()`和`bind()`是两个非常重要的事件处理函数,它们分别用于触发和绑定事件。本文将详细解析这两个函数的用法及其应用场景。 ### `bind()` 函数 `bind()` 是jQuery中用于绑定事件处理函数到...
jQuery的trigger()方法用法介绍: 此方法可以触发匹配元素上指定类型的事件。 它具有两种语法格式,下面就分别做一下介绍。 语法结构一: 代码如下: $(selector).trigger(event,[param1,param2,…]) 参数解析: 1....
今天做一个项目,遇到了一个问题,是以前没有遇到过的,就此记上一笔。 1、trigger方法解释 ...其中eventType包含javascript内置的事件、jQuery增加的事件和自定义事件。例如: $('#foo').bind('click', f
jQuery是目前流行的JavaScript库,其中trigger()方法是jQuery的核心功能之一,主要用于触发匹配元素上的事件。触发事件是指当满足某些条件时,自动执行与事件相关的函数,而无需用户实际进行相应的交互操作。在Web...
var event = new jQuery.Event("demo-trigger"); event.extra = { name:'Andrew', age:'23', job:'FrontEndDev' }; $('#demo').trigger(event); }); ``` 以上两种方法都是有效的方式,用于在jQuery事件处理...
本文主要探讨了jQuery中trigger函数执行两次的问题及其解决方法。在实际的Web开发过程中,开发者可能会遇到使用jQuery的trigger函数触发事件时,在某些浏览器中事件被触发了两次的情况,比如本文中提到的Internet ...
3. **事件处理(Events)**:通过`$(selector).on('event', function(){...})`绑定事件,`$(selector).off('event')`移除事件,以及`$(selector).trigger('event')`触发事件。 4. **动画效果(Effects)**:如`...
`$(element).on('event', callback)`允许开发者在一个元素上绑定事件处理器,而`.trigger('event')`可以触发事件。 3. **动画效果**:jQuery的`.animate()`方法允许开发者创建复杂的动画效果,如淡入淡出、滑动等。...
3. **事件处理(Events)**:jQuery的事件处理方式简单直观,`$(selector).on('event', handler)`允许绑定事件,`$(selector).off('event')`用于解绑,而`.trigger('event')`可以触发事件。 4. **链式调用...
`.trigger("event")`可以触发已绑定的事件。 四、动画效果(Effects) jQuery的动画功能强大,`fadeIn()`, `fadeOut()`, `slideToggle()`等方法可实现淡入淡出、滑动等效果。`animate()`函数可以自定义复杂的动画...
事件处理(Event Handling)在jQuery中同样简洁。$.fn.on()和$.fn.off()用于绑定和解绑事件,而$.fn.trigger()用于触发事件。jQuery通过事件委托和事件冒泡机制提高了性能,尤其在处理大量元素时。深入理解这些事件...
例如,`$(selector).on('event', handler)`可以绑定事件,`$(selector).off('event')`用于解绑,而`$(selector).trigger('event')`则可以手动触发事件。此外,还可以使用`.one()`只执行一次的事件绑定,方便实现一次...