WEB开发网
开发学院网页设计JavaScript Jquery源码分析---Event分析 阅读

Jquery源码分析---Event分析

 2010-09-14 13:36:25 来源:WEB开发网   
核心提示: triggerHandle通过把jQuery.event.trigger的donative参数设为false,来阻止执行浏览器默处理方法,Jquery源码分析---Event分析(8),它与trigger不现的一点,还在于它只是处理jquery对象的第一个元素,才会执行,//它还可以通do

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;
},

上一页  3 4 5 6 7 8 9 10  下一页

Tags:Jquery 源码 分析

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接