- 浏览: 323951 次
- 性别:
- 来自: 南昌
文章分类
最新评论
-
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 事件的处理
prk/彭仁夔 08-08-26 Jquery提供了一些来进行regist,remove,fire事件的方法。 6.2.1 Register 对于注册事件,jquery提供了bind、one、toggle、hover四种注册事件的方法, bind是最基本的方法。One是注册只运行一次的方法,toggle注册交替运行的方法。Hover是注册鼠标浮过的方法。 bind : function(type, data, fn) { return type == "unload" ? this.one(type, data, fn) : this .each(function() {// fn || data, fn && data实现了data参数可有可无 jQuery.event.add(this, type, fn || data, fn && data); }); }, Bind中对于unload的事件,只能运行一次,其它的就采用默认的注册方式。 // 为每一个匹配元素的特定事件(像click)绑定一个一次性的事件处理函数。 // 在每个对象上,这个事件处理函数只会被执行一次。其他规则与bind()函数相同。 // 这个事件处理函数会接收到一个事件对象,可以通过它来阻止(浏览器)默认的行为。 // 如果既想取消默认的行为,又想阻止事件起泡,这个事件处理函数必须返回false。 one : function(type, data, fn) { var one = jQuery.event.proxy(fn || data, function(event) { jQuery(this).unbind(event, one); return (fn || data).apply(this, arguments);/this->当前的元素 }); return this.each(function() { jQuery.event.add(this, type, one, fn && data); }); }, One与bind基本上差不多,不同的在调用jQuery.event.add时,把注册的事件处理的函数做了一个小小的调整。One调用了jQuery.event.proxy进行了代理传入的事件处理函数。在事件触发调用这个代理的函数时,先把事件从cache中删除,再执行注册的事件函数。这里就是闭包的应用,通过闭包得到fn注册的事件函数的引用。 //一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法。 //这是一个自定义的方法,它为频繁使用的任务提供了一种“保持在其中”的状态。 //当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时, /会触发指定的第二个函数。而且,会伴随着对鼠标是否仍然处在特定元素中的检测(例如,处在div中的图像), //如果是,则会继续保持“悬停”状态,而不触发移出事件(修正了使用mouseout事件的一个常见错误)。 hover : function(fnOver, fnOut) { return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut); }, Hover则是建立在bind的基础之上。 //每次点击后依次调用函数。 toggle : function(fn) { var args = arguments, i = 1; while (i < args.length)//每个函数分配GUID jQuery.event.proxy(fn, args[i++]);//修改后的还在args中 return this.click(jQuery.event.proxy(fn, function(event) {//分配GUID this.lastToggle = (this.lastToggle || 0) % i;//上一个函数 event.preventDefault();//阻止缺省动作 //执行参数中的第几个函数,apply可以采用array-like的参数 return args[this.lastToggle++].apply(this,arguments)||false; })); }, Toggle中参数可以是多个fn。先把它们代码生成UUID。之后调用click的方法来注册再次进行代理的callback。这个函数在事件触发时运行,它先计算上一次是执行了参数中的那个函数。之后阻止缺省动作。之后找到下一个函数运行。 //为jquery对象增加常用的事件方法 jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + "submit,keydown,keypress,keyup,error").split(","), function(i, name) {jQuery.fn[name] = function(fn) { return fn ? this.bind(name, fn) : this.trigger(name); };}); Jquery增加了一个常用的事件处理方法,包含上面调用的click。这里可以看出这里还是调用bind进行注册。当然这里还可以通过程序实现去触发事件。 上面的众多方法都是注册事件,其最终都落在jQuery.event.add();来完成注册的功能。如果我们采用Dom0或DOM1的事件方法,我们会采用elem.onclick=function(){}来为元素的某一种事件来注册处理函数。这个最大的缺点就是每个一个事件只是一个处理函数。在dom1的方式中有改进,我们可以采用elem.addEventListener(type, handle, false)为元素的事件注册多个处理函数。 这样的处理方式还不是很完美,如果我们只这个事件运行一次就有点麻烦了。我们要在事件的处理函数中最后进行elem.removeEventListener来取消事件的监听。这样做可能会有事务上的问题。如果第一个事件处理函数在没有取消事件监听之前,就再次触发了怎么办? 还有采用浏览器的方式,它不支持自定义事件的注册和处理,还不能为多个事件注册同一个处理函数。 jQuery.event = {// add 事件到一个元素上。 add : function(elem, types, handler, data) { if (elem.nodeType == 3 || elem.nodeType == 8) return;// 空白节点或注释 // IE不能传入window,先复制一下。 if (jQuery.browser.msie && elem.setInterval) elem = window; // 为handler分配一个全局唯一的Id if (!handler.guid) handler.guid = this.guid++; // 把data附到handler.data中 if (data != undefined) { ① var fn = handler; handler =this.proxy(fn,function(){return fn.apply(this,arguments);}); handler.data = data; } // 初始化元素的events。如果没有取到events中值,就初始化data: {} ② var events =jQuery.data(elem,"events")||jQuery.data(elem,"events",{}), // 如果没有取到handle中值,就初始化data: function() {....} ③ handle = jQuery.data(elem, "handle")|| jQuery.data(elem, "handle", function() {//处理一个触发器的第二个事件和当page已经unload之后调用一个事件。 if (typeof jQuery != "undefined"&& !jQuery.event.triggered) return jQuery.event.handle.apply(//callee.elem=handle.elem arguments.callee.elem, arguments); }); // 增加elem做为handle属性,防止IE由于没有本地Event而内存泄露。 handle.elem = elem; // 处理采用空格分隔多个事件名,如jQuery(...).bind("mouseover mouseout", fn); jQuery.each(types.split(/\s+/), function(index, type) { ④ // 命名空间的事件,一般不会用到。 var parts = type.split(".");type = parts[0];handler.type = parts[1]; // 捆绑到本元素type事件的所有处理函数 var handlers = events[type]; ⑤ if (!handlers) {// 没有找到处理函数列表就初始化事件队列 handlers = events[type] = {}; // 如果type不是ready,或ready的setup执行返回false ⑥ if (!jQuery.event.special[type]|| jQuery.event.special[type].setup .call(elem, data) === false) {// 调用系统的事件函数来注册事件 if(elem.addEventListener)elem.addEventListener(type,handle,false); else if (elem.attachEvent)elem.attachEvent("on" + type, handle); } } // 把处理器的id和handler形式属性对的形式保存在handlers列表中, // 也存在events[type][handler.guid]中。 handlers[handler.guid] = handler; ⑦ // 全局缓存这个事件的使用标识 jQuery.event.global[type] = true; }); elem = null; // 防止IE内存泄露。 }, guid : 1, global : {}, jQuery.event.add通过jQuery.data把事件相关的事件名和处理函数有机有序地组合起存放在jQuery.cache中与该元素对应的空间里。我们就一个例子分析一下add的过程中:假如我们招待下面jQuery(e1).bind("mouseover mouseout", fn0);jQuery(e1).bind("mouseover mouseout", fn1)的语句。 在jQuery(e1).bind("mouseover mouseout", fn0);时,②③都不可能从cache取到数,先初始化。此时的cache:{e1_uuid:{events:{},handle:fn}}。接着在⑤会为mouseover mouseout名初始化。此时的cache: {e1_uuid:{events:{ mouseover:{}, mouseout:{}},handle:fn}}。在⑥处向浏览器的事件中注册处理函数。接着⑦会把处理函数到事件名中。此时的cache: {e1_uuid:{events:{mouseover:{fn0_uuid:fn0},mouseout:{ fn0_uuid:fn0}},handle:fn}}。这里可以看出为采用proxy为函数生成uuid的作用了。 在jQuery(e1).bind("mouseover mouseout", fn1)时,②③都从cache取到数据{e1_uuid:{events:{mouseover:{fn0_uuid:fn0},mouseout:{ fn0_uuid:fn0}},接着在⑤取到mouseover:{fn0_uuid:fn0},mouseout:{ fn0_uuid:fn0}的引用。接着⑦会把处理函数注册到事件名中。此时的cache: {e1_uuid:{events:{mouseover:{fn0_uuid:fn0, fn1_uuid:fn1,},mouseout:{ fn0_uuid:fn0, fn1_uuid:fn1}},handle:fn}}。 jQuery.event.add很重要的任务就是把注册的事件函数有序地存放起来。以便remove和fire事件的函数能找到。 //{elem_uuid_1:{events:{mouseover:{fn_uuid:fn1,fn_uuid1:fn2}, //mouseout:{fn_uuid:fn1,fn_uuid1:fn2}},handle:fn}}
发表评论
-
[转载]jquery.validate.js的基本用法入门
2011-03-10 22:35 2888[转载]jquery.validate.js的基本用法入门 j ... -
使用javascript动态创建SVG对象的问题
2011-01-11 17:18 4753无沙备忘录系列 -平时的一些研究,有时也会颇费功夫,然 ... -
evaluate mxGraph
2010-06-10 16:09 1729To evaluate mxGraph: - Navigate ... -
js中的prototype与constructor
2010-06-09 10:53 2943并且每个函数都有一个默认的prototype属性。 如果这个函 ... -
Jquery1.2.6 源码分析
2008-08-29 00:13 14182jQuery是一个非常优秀的J ... -
jquery fx分析
2008-08-28 19:37 63338 FX分析 prk/彭仁夔 ... -
jqueyr fx源码(修改)
2008-08-28 19:33 2697/* * author:prk date:2008-08-0 ... -
jquery.ajax
2008-08-27 16:50 81257.2 jquery.ajax ... -
jquery event domready
2008-08-26 17:39 41456.3 domReady的处理 ... -
jquery event trigger 分析
2008-08-26 17:37 113916.2.2 trigger ... -
jquery event 封装的源源分析
2008-08-26 17:35 46066.Event分析 ... -
jquery position
2008-08-25 16:34 87965.2.3 position ... -
jquery wrap
2008-08-25 08:12 44845.3.5 wrap ... -
jquery element content
2008-08-25 08:11 43685.4dom元素的内容 ... -
jquery class
2008-08-22 23:18 53765.1.2 Class prk/彭仁夔 2008- ... -
jquery attr
2008-08-22 23:16 76195 DOM元素 prk/彭仁夔 ... -
jquery Selector (修改)
2008-08-21 17:10 3102/** * author:prk * date:2008- ... -
CSS selector (jquery的源码分析,修改)
2008-08-21 17:09 44303.3、采用CSS方式查找Dom节点 ... -
如何找到Dom元素
2008-08-20 22:10 28403、如何找到Dom元素 ... -
Jquery源码分析(修改)
2008-08-20 22:07 5801Jquery源码分析 ...
相关推荐
对于事件的操作无非是addEvent,fireEvent,removeEvent这三个事 件方法。一般lib都会对浏览器的提供的函数做一些扩展,解决兼容性内存泄漏等问题。第三个问题就是如何得到domReady的状态。 6.1 event的包裹 浏览器的...
在分析jQuery-1.9.1事件系统之事件体系结构的源码之前,先了解该事件体系的背景和基本设计是非常有帮助的。jQuery的事件系统,特别是1.9.1版本,它在很大程度上受到了DeanEdwards的跨浏览器AddEvent()设计的影响。...
4. **Event处理**:`addEvent`, `removeEvent`等方法简化事件绑定和解绑。 5. **Ajax组件**:`Request`类提供了异步请求的解决方案。 **Prototype**: Prototype是最早的JavaScript框架之一,对DOM操作有着深入的...
### jQuery1.6.1版本的瑕疵分析 #### 1. bind方法的冗余参数 在jQuery1.6.1版本中,`bind`方法被发现有一个冗余的参数`fn`。在处理对象字面量时,`fn`参数并未被实际使用,因此可以认为它是多余的。在`bind`方法...
在JavaScript编程中,确保代码在不同的浏览器环境下都能正常工作是一项重要的任务。...在实际开发中,还可以使用像jQuery这样的库,它们已经处理了许多跨浏览器的兼容性问题,让开发者更加专注于业务逻辑。
$('#calendar').calendar('addEvent', eventName, eventDate); // 清空表单 this.reset(); }); }); ``` 上述代码展示了如何设置页面结构,加载资源,并使用jQuery监听表单提交事件,调用插件API添加新事件...
JavaScript Event Utility - tuts+ 的 Jeremy McPeak 的道具 一个非常简单的跨浏览器 JavaScript 事件实用程序; 对于那些不希望包含 JavaScript 库(例如 jQuery 等)的人。 具有以下方法的对象: addEvent:用于...
$('#timeline').timeline('addEvent', event); ``` 对于样式,可以编写自定义CSS覆盖默认样式,例如: ```css .timeline-event { background-color: #f0f0f0; color: #333; } .timeline-event:hover { ...
- Prototype: `Event.observe(document, 'dom:loaded', yourFunction);` - Mootools: `window.addEvent('domready', yourFunction);` - Pure JavaScript: `document.addEventListener('DOMContentLoaded', your...
function addEvent(element, eventType, handler) { if (element.addEventListener) { element.addEventListener(eventType, handler, false); } else { element.attachEvent('on' + eventType, function() { /...
解决这些问题通常需要编写跨浏览器的代码,使用像jQuery这样的库可以帮助简化这个过程,因为它们已经处理了很多兼容性问题。同时,持续关注新的浏览器更新和JavaScript规范的发展也很重要,以保持代码的现代性和兼容...
function addEvent(element, event, handler) { if (element.addEventListener) { element.addEventListener(event, handler, false); } else { element.attachEvent('on' + event, function() { handler.call...
Mootools中的事件绑定非常直观且高效,其`addEvent`方法与jQuery中的`bind`或`on`类似,用于将事件监听器附加到DOM元素上。例如,以下代码演示了如何使用`addEvent`方法为`<a>`元素绑定点击事件: ```javascript $...
function addEvent(element, eventType, handler) { if (element.addEventListener) { // Modern browsers element.addEventListener(eventType, handler, false); } else if (element.attachEvent) { // IE6 and...
在开发Web应用时,浏览器兼容性是一个常见的挑战,特别是JavaScript脚本在不同的浏览器上可能...在实际开发过程中,还应考虑使用像jQuery这样的库,它们已经处理了许多浏览器兼容性问题,让开发者能更专注于业务逻辑。
1.2 Core包含了基础模块,如Element、Event、Class等。 - **DOM操作**:MooTools提供了简洁的API来操作DOM元素,例如 `$` 和 `$$` 函数,分别用于选取单个和多个元素,类似于jQuery中的选择器。 - **事件处理**:...
addEvent(document, mousewheel, function(event) { var e = event || window.event; var delta = 0; if (e.wheelDelta) { // IE/Opera/Chrome/Safari delta = e.wheelDelta / 120; // 四个像素单位 if ...
基于Diego Alto的jQuery Star Rating插件。 如何使用 JS示例: #JS // Basic usage, give only form name or ID var basicRating = new MooStarRating({ form: 'basic' }); // Event callback basicRating....
function addEvent(element, event, handler) { if (element.addEventListener) { element.addEventListener(event, handler, false); } else { element.attachEvent('on' + event, function() { // 设置this为...
MooTools的核心模块包括Element、Event、Class等,它们是实现评分功能的基础。 2. **DOM操作**:在MooTools中,你可以方便地通过Element API来操作DOM元素。例如,`$$('selector')`可以选取一组匹配的元素,`...