日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Event 系列: jquery event 源码

發布時間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Event 系列: jquery event 源码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • /* ?
  • ?*?author:prk ?
  • ?*?date:2008-08-17 ?
  • ?*?comment:analyse?of?jquery?event ?
  • ?*? ?
  • ?*/??
  • 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()?{//?唯一Id,wrap原始handler?Fn ??
  • ????????????????????????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(//?arguments.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)//?FF ??
  • ????????????????????????????elem.addEventListener(type,?handle,?false); ??
  • ????????????????????????else?if?(elem.attachEvent)//?IE ??
  • ????????????????????????????elem.attachEvent("on"?+?type,?handle); ??
  • ????????????????????} ??
  • ????????????????} ??
  • ??
  • ????????????????//?把處理器的id和handler形式屬性對的形式保存在handlers列表中, ??
  • ????????????????//?也存在events[type][handler.guid]中。 ??
  • ????????????????handlers[handler.guid]?=?handler; ??
  • ??
  • ????????????????//?全局緩存這個事件的使用標識 ??
  • ????????????????jQuery.event.global[type]?=?true; ??
  • ????????????}); ??
  • ??
  • ????????//?防止IE內存泄露。 ??
  • ????????elem?=?null; ??
  • ????}, ??
  • ??
  • ????guid?:?1, ??
  • ????global?:?{}, ??
  • ??
  • ????//?從元素中remove一個事件 ??
  • ????remove?:?function(elem,?types,?handler)?{ ??
  • ????????if?(elem.nodeType?==?3?||?elem.nodeType?==?8) ??
  • ????????????return; ??
  • ????????//?取出元素的events中Fn列表 ??
  • ????????var?events?=?jQuery.data(elem,?"events"),?ret,?index; ??
  • ??
  • ????????if?(events)?{ ??
  • ????????????//?remove所有的該元素的事件?.是命名空間的處理 ??
  • ????????????if?(types?==?undefined ??
  • ????????????????????||?(typeof?types?==?"string"?&&?types.charAt(0)?==?".")) ??
  • ????????????????for?(var?type?in?events) ??
  • ????????????????????this.remove(elem,?type?+?(types?||?"")); ??
  • ????????????else?{ ??
  • ????????????????//?types,?handler參數采用{type:xxx,handler:yyy}形式 ??
  • ????????????????if?(types.type)?{ ??
  • ????????????????????handler?=?types.handler; ??
  • ????????????????????types?=?types.type; ??
  • ????????????????} ??
  • ??
  • ????????????????//?處理采用空格分隔多個事件名?jQuery(...).unbind("mouseover?mouseout",?fn); ??
  • ????????????????jQuery ??
  • ????????????????????????.each(types.split(/\s+/),?function(index,?type)?{ ??
  • ????????????????????????????//?命名空間的事件,一般不會用到。 ??
  • ????????????????????????????????var?parts?=?type.split("."); ??
  • ????????????????????????????????type?=?parts[0]; ??
  • ??
  • ????????????????????????????????if?(events[type])?{//?事件名找到 ??
  • ????????????????????????????????????if?(handler)//?handler傳入,就remove事件名的這個處理函數 ??
  • ????????????????????????????????????????delete?events[type][handler.guid];//guid的作用 ??
  • ????????????????????????????????????else????//?remove這個事件的所有處理函數,帶有命名空間的處理 ??
  • ????????????????????????????????????????for?(handler?in?events[type]) ??
  • ????????????????????????????????????????????if?(!parts[1] ??
  • ????????????????????????????????????????????????????||?events[type][handler].type?==?parts[1]) ??
  • ????????????????????????????????????????????????delete?events[type][handler]; ??
  • ??
  • ????????????????????????????????????//?如果沒有該事件的處理函數存在,就remove事件名 ??
  • ????????????????????????????????????for?(ret?in?events[type])//?看看有沒有? ??
  • ????????????????????????????????????????break; ??
  • ????????????????????????????????????if?(!ret)?{//?沒有 ??
  • ????????????????????????????????????????if?(!jQuery.event.special[type]//不是ready ??
  • ????????????????????????????????????????????????||?jQuery.event.special[type].teardown ??
  • ????????????????????????????????????????????????????????.call(elem)?===?false)?{//?type不等于ready ??
  • ????????????????????????????????????????????if?(elem.removeEventListener)//?在瀏覽器中remove事件名 ??
  • ????????????????????????????????????????????????elem.removeEventListener(type, ??
  • ????????????????????????????????????????????????????????jQuery.data(elem, ??
  • ????????????????????????????????????????????????????????????????"handle"), ??
  • ????????????????????????????????????????????????????????false); ??
  • ????????????????????????????????????????????else?if?(elem.detachEvent) ??
  • ????????????????????????????????????????????????elem.detachEvent("on"?+?type, ??
  • ????????????????????????????????????????????????????????jQuery.data(elem, ??
  • ????????????????????????????????????????????????????????????????"handle")); ??
  • ????????????????????????????????????????} ??
  • ????????????????????????????????????????ret?=?null; ??
  • ????????????????????????????????????????delete?events[type];//?在緩存中除去。 ??
  • ????????????????????????????????????} ??
  • ????????????????????????????????} ??
  • ????????????????????????????}); ??
  • ????????????} ??
  • ??
  • ????????????//?不再使用,除去expando ??
  • ????????????for?(ret?in?events) ??
  • ????????????????break; ??
  • ????????????if?(!ret)?{ ??
  • ????????????????var?handle?=?jQuery.data(elem,?"handle"); ??
  • ????????????????if?(handle) ??
  • ????????????????????handle.elem?=?null; ??
  • ????????????????jQuery.removeData(elem,?"events"); ??
  • ????????????????jQuery.removeData(elem,?"handle"); ??
  • ????????????} ??
  • ????????} ??
  • ????}, ??
  • ??
  • ????trigger?:?function(type,?data,?elem,?donative,?extra)?{ ??
  • ????????data?=?jQuery.makeArray(data); ??
  • ??
  • ????????if?(type.indexOf("!")?>=?0)?{//?支持!的not的操作如!click,除click之后的所有 ??
  • ????????????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), ??
  • ????????????//?我們是否要提交一個偽造的事件? ??
  • ????????????event?=?!data[0]?||?!data[0].preventDefault; ??
  • ??
  • ????????????//?構建偽造的事件。 ??
  • ????????????if?(event)?{ ??
  • ????????????????data.unshift(?{//存到數組中的第一個 ??
  • ????????????????????type?:?type, ??
  • ????????????????????target?:?elem, ??
  • ????????????????????preventDefault?:?function()?{ ??
  • ????????????????????}, ??
  • ????????????????????stopPropagation?:?function()?{ ??
  • ????????????????????}, ??
  • ????????????????????timeStamp?:?now() ??
  • ????????????????}); ??
  • ????????????????data[0][expando]?=?true;?//?不需要修正偽造事件 ??
  • ????????????} ??
  • ??
  • ????????????//防止事件名出錯 ??
  • ????????????data[0].type?=?type; ??
  • ????????????if?(exclusive) ??
  • ????????????????data[0].exclusive?=?true; ??
  • ??
  • ????????????//?觸發事件 ??
  • ????????????var?handle?=?jQuery.data(elem,?"handle"); ??
  • ????????????if?(handle) ??
  • ????????????????val?=?handle.apply(elem,?data); ??
  • ??
  • ????????????//?Handle?triggering?native?.onfoo?handlers?(and?on?links?since?we ??
  • ????????????//?don't?call?.click()?for?links) ??
  • ????????????//處理觸發.onfoo這樣的本地處理方法,但是是對于links?'s?.click()不觸發 ??
  • ????????????if?((!fn?||?(jQuery.nodeName(elem,?'a')?&&?type?==?"click")) ??
  • ????????????????????&&?elem["on"?+?type]&&?elem["on"?+?type].apply(elem,?data)?===?false) ??
  • ????????????????val?=?false; ??
  • ??
  • ????????????//?Extra?functions?don't?get?the?custom?event?object ??
  • ????????????if?(event) ??
  • ????????????????data.shift(); ??
  • ??
  • ????????????//?處理觸發extra事件 ??
  • ????????????if?(extra?&&?jQuery.isFunction(extra))?{ ??
  • ????????????????//執行extra,同時把結果存到data中。 ??
  • ????????????????ret?=?extra.apply(elem,?val?==?null???data?:?data.concat(val)); ??
  • ????????????????//?if?anything?is?returned,?give?it?precedence?and?have?it ??
  • ????????????????//?overwrite?the?previous?value ??
  • ????????????????if?(ret?!==?undefined) ??
  • ????????????????????val?=?ret; ??
  • ????????????} ??
  • ??
  • ????????????//?觸發本地事件 ??
  • ????????????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; ??
  • ????}, ??
  • ??
  • ????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 ??
  • ????????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; ??
  • ??
  • ????????????????ret?=?handler.apply(this,?arguments);//?執行事件處理函數 ??
  • ??
  • ????????????????if?(val?!==?false) ??
  • ????????????????????val?=?ret;//?只要有一個處理函數返回false,本函數就返回false. ??
  • ??
  • ????????????????if?(ret?===?false)?{//?不執行瀏覽器默認的動作 ??
  • ????????????????????event.preventDefault(); ??
  • ????????????????????event.stopPropagation(); ??
  • ????????????????} ??
  • ????????????} ??
  • ????????} ??
  • ??
  • ????????return?val; ??
  • ????}, ??
  • ??
  • ????props?:?"altKey?attrChange?attrName?bubbles?button?cancelable?charCode?clientX?"??
  • ????????????+?"clientY?ctrlKey?currentTarget?data?detail?eventPhase?fromElement?handler?keyCode?"??
  • ????????????+?"metaKey?newValue?originalTarget?pageX?pageY?prevValue?relatedNode?relatedTarget?screenX?"??
  • ????????????+?"screenY?shiftKey?srcElement?target?timeStamp?toElement?type?view?wheelDelta?which"??
  • ????????????????????.split("?"), ??
  • ??
  • ????//對事件進行包裹。 ??
  • ????fix?:?function(event)?{ ??
  • ????????if?(event[expando]?==?true)//表明事件已經包裹過 ??
  • ????????????return?event; ??
  • ??
  • ????????//保存原始event,同時clone一個。 ??
  • ????????var?originalEvent?=?event; ??
  • ????????event?=?{ ??
  • ????????????originalEvent?:?originalEvent ??
  • ????????}; ??
  • ??
  • ????????for?(var?i?=?this.props.length,?prop;i;)?{ ??
  • ????????????prop?=?this.props[--i]; ??
  • ????????????event[prop]?=?originalEvent[prop]; ??
  • ????????} ??
  • ???????? ??
  • ????????event[expando]?=?true; ??
  • ???????? ??
  • ????????//加上preventDefault?and?stopPropagation,在clone不會運行 ??
  • ????????event.preventDefault?=?function()?{ ??
  • ????????????//?在原始事件上運行 ??
  • ????????????if?(originalEvent.preventDefault) ??
  • ????????????????originalEvent.preventDefault(); ??
  • ???????????? ??
  • ????????????originalEvent.returnValue?=?false; ??
  • ????????}; ??
  • ????????event.stopPropagation?=?function()?{ ??
  • ????????????//?在原始事件上運行 ??
  • ????????????if?(originalEvent.stopPropagation) ??
  • ????????????????originalEvent.stopPropagation(); ??
  • ???????????? ??
  • ????????????originalEvent.cancelBubble?=?true; ??
  • ????????}; ??
  • ??
  • ????????//?修正?timeStamp ??
  • ????????event.timeStamp?=?event.timeStamp?||?now(); ??
  • ??
  • ????????//?修正target ??
  • ????????if?(!event.target) ??
  • ????????????event.target?=?event.srcElement?||?document;???????????? ??
  • ????????if?(event.target.nodeType?==?3)//文本節點是父節點。 ??
  • ????????????event.target?=?event.target.parentNode; ??
  • ??
  • ????????//?relatedTarget ??
  • ????????if?(!event.relatedTarget?&&?event.fromElement) ??
  • ????????????event.relatedTarget?=?event.fromElement?==?event.target ??
  • ??????????????????????event.toElement ??
  • ????????????????????:?event.fromElement; ??
  • ??
  • ????????//?Calculate?pageX/Y?if?missing?and?clientX/Y?available ??
  • ????????if?(event.pageX?==?null?&&?event.clientX?!=?null)?{ ??
  • ????????????var?doc?=?document.documentElement,?body?=?document.body; ??
  • ????????????event.pageX?=?event.clientX ??
  • ????????????????????+?(doc?&&?doc.scrollLeft?||?body?&&?body.scrollLeft?||?0) ??
  • ????????????????????-?(doc.clientLeft?||?0); ??
  • ????????????event.pageY?=?event.clientY ??
  • ????????????????????+?(doc?&&?doc.scrollTop?||?body?&&?body.scrollTop?||?0) ??
  • ????????????????????-?(doc.clientTop?||?0); ??
  • ????????} ??
  • ??
  • ????????//?Add?which?for?key?events ??
  • ????????if?(!event.which ??
  • ????????????????&&?((event.charCode?||?event.charCode?===?0) ??
  • ??????????????????????????event.charCode ??
  • ????????????????????????:?event.keyCode)) ??
  • ????????????event.which?=?event.charCode?||?event.keyCode; ??
  • ??
  • ????????//?Add?metaKey?to?non-Mac?browsers?(use?ctrl?for?PC's?and?Meta?for?Macs) ??
  • ????????if?(!event.metaKey?&&?event.ctrlKey) ??
  • ????????????event.metaKey?=?event.ctrlKey; ??
  • ??
  • ????????//?Add?which?for?click:?1?==?left;?2?==?middle;?3?==?right ??
  • ????????//?Note:?button?is?not?normalized,?so?don't?use?it ??
  • ????????if?(!event.which?&&?event.button) ??
  • ????????????event.which?=?(event.button?&?1???1?:?(event.button?&?2??
  • ??????????????????????3??
  • ????????????????????:?(event.button?&?4???2?:?0))); ??
  • ??
  • ????????return?event; ??
  • ????}, ??
  • ??
  • ????proxy?:?function(fn,?proxy)?{ ??
  • ????????//?作用就是分配全局guid. ??
  • ????????proxy.guid?=?fn.guid?=?fn.guid?||?proxy.guid?||?this.guid++; ??
  • ????????return?proxy; ??
  • ????}, ??
  • ??
  • ????special?:?{ ??
  • ????????ready?:?{ ??
  • ????????????//?Make?sure?the?ready?event?is?setup ??
  • ????????????setup?:?bindReady, ??
  • ????????????teardown?:?function()?{ ??
  • ????????????} ??
  • ????????} ??
  • ????} ??
  • }; ??
  • ??
  • if?(!jQuery.browser.msie)?{ ??
  • ????//?Checks?if?an?event?happened?on?an?element?within?another?element ??
  • ????//?Used?in?jQuery.event.special.mouseenter?and?mouseleave?handlers ??
  • ????var?withinElement?=?function(event)?{ ??
  • ????????//?Check?if?mouse(over|out)?are?still?within?the?same?parent?element ??
  • ????????var?parent?=?event.relatedTarget; ??
  • ????????//?Traverse?up?the?tree ??
  • ????????while?(parent?&&?parent?!=?this) ??
  • ????????????try?{ ??
  • ????????????????parent?=?parent.parentNode; ??
  • ????????????}?catch?(e)?{ ??
  • ????????????????parent?=?this; ??
  • ????????????} ??
  • ??
  • ????????if?(parent?!=?this)?{ ??
  • ????????????//?set?the?correct?event?type ??
  • ????????????event.type?=?event.data; ??
  • ????????????//?handle?event?if?we?actually?just?moused?on?to?a?non?sub-element ??
  • ????????????jQuery.event.handle.apply(this,?arguments); ??
  • ????????} ??
  • ????}; ??
  • ??
  • ????jQuery.each(?{ ??
  • ????????mouseover?:?'mouseenter', ??
  • ????????mouseout?:?'mouseleave'??
  • ????},?function(orig,?fix)?{ ??
  • ????????jQuery.event.special[fix]?=?{ ??
  • ????????????setup?:?function()?{ ??
  • ????????????????jQuery.event.add(this,?orig,?withinElement,?fix); ??
  • ????????????}, ??
  • ????????????teardown?:?function()?{ ??
  • ????????????????jQuery.event.remove(this,?orig,?withinElement); ??
  • ????????????} ??
  • ????????}; ??
  • ????}); ??
  • } ??
  • ??
  • jQuery.fn.extend(?{ ??
  • ????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); ??
  • ????????????????}); ??
  • ????}, ??
  • ??
  • ????????//?為每一個匹配元素的特定事件(像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); ??
  • ????????????}); ??
  • ????????}, ??
  • ??
  • ????????//?bind()的反向操作,從每一個匹配的元素中刪除綁定的事件。 ??
  • ????????//?如果沒有參數,則刪除所有綁定的事件。 ??
  • ????????//?你可以將你用bind()注冊的自定義事件取消綁定。 ??
  • ????????//?I如果提供了事件類型作為參數,則只刪除該類型的綁定事件。 ??
  • ????????//?如果把在綁定時傳遞的處理函數作為第二個參數,則只有這個特定的事件處理函數會被刪除。 ??
  • ????????unbind?:?function(type,?fn)?{ ??
  • ????????????return?this.each(function()?{ ??
  • ????????????????jQuery.event.remove(this,?type,?fn); ??
  • ????????????}); ??
  • ????????}, ??
  • ??
  • ???? ??
  • ????????trigger?:?function(type,?data,?fn)?{ ??
  • ????????????return?this.each(function()?{ ??
  • ????????????????jQuery.event.trigger(type,?data,?this,?true,?fn); ??
  • ????????????}); ??
  • ????????}, ??
  • ????????//這個特別的方法將會觸發指定的事件類型上所有綁定的處理函數。但不會執行瀏覽器默認動作. ??
  • ????????triggerHandler?:?function(type,?data,?fn)?{ ??
  • ????????????return?this[0] ??
  • ????????????????????&&?jQuery.event.trigger(type,?data,?this[0],?false,?fn); ??
  • ????????}, ??
  • ???????? ??
  • ????????//每次點擊后依次調用函數。 ??
  • ????????toggle?:?function(fn)?{????? ??
  • ????????????var?args?=?arguments,?i?=?1; ??
  • ???????????? ??
  • ????????????while?(i?<?args.length)//每個函數分配GUID ??
  • ????????????????jQuery.event.proxy(fn,?args[i++]); ??
  • ??
  • ????????????return?this.click(jQuery.event ??
  • ????????????????????.proxy(fn,?function(event)?{//分配GUID???????????????????? ??
  • ????????????????????????????this.lastToggle?=?(this.lastToggle?||?0)?%?i;//上一個函數???????????????????????????? ??
  • ????????????????????????????event.preventDefault();//阻止缺省動作 ??
  • ????????????????????????????//執行參數中的第幾個函數,apply可以采用array-like的參數 ??
  • ????????????????????????????//With?apply,?you?can?use?an?array?literal,? ??
  • ????????????????????????????//for?example,?fun.apply(this,?[name,?value]), ??
  • ????????????????????????????//or?an?Array?object,?for?example,?fun.apply(this,?new?Array(name,?value)).? ??
  • ????????????????????????????return?args[this.lastToggle++].apply(this, ??
  • ????????????????????????????????????arguments)?||?false; ??
  • ????????????????????????})); ??
  • ????????}, ??
  • ???????? ??
  • ????????//一個模仿懸停事件(鼠標移動到一個對象上面及移出這個對象)的方法。 ??
  • ????????//這是一個自定義的方法,它為頻繁使用的任務提供了一種“保持在其中”的狀態。 ??
  • ????????//當鼠標移動到一個匹配的元素上面時,會觸發指定的第一個函數。當鼠標移出這個元素時, ??
  • ????????//會觸發指定的第二個函數。而且,會伴隨著對鼠標是否仍然處在特定元素中的檢測(例如,處在div中的圖像), ??
  • ????????//如果是,則會繼續保持“懸停”狀態,而不觸發移出事件(修正了使用mouseout事件的一個常見錯誤)。 ??
  • ????????hover?:?function(fnOver,?fnOut)?{ ??
  • ????????????return?this.bind('mouseenter',?fnOver).bind('mouseleave',?fnOut); ??
  • ????????}, ??
  • ???????? ??
  • ????????//dom?ready時執行?fn ??
  • ????????ready?:?function(fn)?{?????????? ??
  • ????????????bindReady();//注冊監聽?????????? ??
  • ????????????if?(jQuery.isReady)//ready就運行??????????????? ??
  • ????????????????fn.call(document,?jQuery);?????????? ??
  • ????????????else??
  • ????????????????//?增加這個函數到queue中。可見支持無數的ready的調用。 ??
  • ????????????????jQuery.readyList.push(function()?{ ??
  • ????????????????????return?fn.call(this,?jQuery); ??
  • ????????????????}); ??
  • ??
  • ????????????return?this; ??
  • ????????} ??
  • ????}); ??
  • ??
  • jQuery.extend(?{ ??
  • ????isReady?:?false, ??
  • ????readyList?:?[], ??
  • ????//?Handle?when?the?DOM?is?ready ??
  • ????????ready?:?function()?{???????????? ??
  • ????????????if?(!jQuery.isReady)?{?????? ??
  • ????????????????jQuery.isReady?=?true; ??
  • ???????????????? ??
  • ????????????????if?(jQuery.readyList)?{????????????????? ??
  • ????????????????????jQuery.each(jQuery.readyList,?function()?{ ??
  • ????????????????????????this.call(document); ??
  • ????????????????????});????????????? ??
  • ????????????????????jQuery.readyList?=?null; ??
  • ????????????????} ??
  • ???????????????? ??
  • ????????????????jQuery(document).triggerHandler("ready"); ??
  • ????????????} ??
  • ????????} ??
  • ????}); ??
  • ??
  • var?readyBound?=?false; ??
  • ??
  • function?bindReady()?{ ??
  • ????if?(readyBound) ??
  • ????????return; ??
  • ????readyBound?=?true; ??
  • ??
  • ????//?Mozilla,?Opera,?webkit?nightlies?支持DOMContentLoaded事件???? ??
  • ????if?(document.addEventListener?&&?!jQuery.browser.opera) ??
  • ????????//當DOMContentLoaded事件觸發時就運行jQuery.ready ??
  • ????????document.addEventListener("DOMContentLoaded",?jQuery.ready,?false); ??
  • ??
  • ????//IE或不是frame的window ??
  • ????if?(jQuery.browser.msie?&&?window?==?top) ??
  • ????????(function()?{ ??
  • ????????????if?(jQuery.isReady) ??
  • ????????????????return; ??
  • ????????????try?{ ??
  • ????????????????//?在ondocumentready之前,一直都會拋出異常?????????????? ??
  • ????????????????//?http://javascript.nwbox.com/IEContentLoaded/ ??
  • ????????????????document.documentElement.doScroll("left"); ??
  • ????????????}?catch?(error)?{ ??
  • ????????????????//一直運行bindReady()(=arguments.callee) ??
  • ????????????????setTimeout(arguments.callee,?0); ??
  • ????????????????return; ??
  • ????????????}??????????? ??
  • ????????????jQuery.ready();//documentready就運行jQuery.ready ??
  • ????????})(); ??
  • ??
  • ????if?(jQuery.browser.opera) ??
  • ????????document.addEventListener("DOMContentLoaded",?function()?{ ??
  • ????????????if?(jQuery.isReady) ??
  • ????????????????return; ??
  • ????????????????//只有styleSheets完全enable時,才是完全的load,其實還有pic ??
  • ????????????for?(var?i?=?0;i?<?document.styleSheets.length;?i++) ??
  • ????????????????if?(document.styleSheets[i].disabled)?{//通過styleSheets來判斷 ??
  • ????????????????????setTimeout(arguments.callee,?0); ??
  • ????????????????????return; ??
  • ????????????????}??????????? ??
  • ????????????????jQuery.ready(); ??
  • ????????????},?false); ??
  • ??
  • ????if?(jQuery.browser.safari)?{ ??
  • ????????var?numStyles; ??
  • ????????(function()?{ ??
  • ????????????if?(jQuery.isReady) ??
  • ????????????????return; ??
  • ????????????????//首先得得到readyState=loaded或=complete ??
  • ????????????if?(document.readyState?!=?"loaded"??
  • ????????????????????&&?document.readyState?!=?"complete")?{ ??
  • ????????????????setTimeout(arguments.callee,?0); ??
  • ????????????????return; ??
  • ????????????} ??
  • ????????????//取得style的length,比較它們之間的長度,看看是不是完成loaded ??
  • ????????????if?(numStyles?===?undefined) ??
  • ????????????????numStyles?=?jQuery("style,?link[rel=stylesheet]").length; ??
  • ????????????if?(document.styleSheets.length?!=?numStyles)?{ ??
  • ????????????????setTimeout(arguments.callee,?0); ??
  • ????????????????return; ??
  • ????????????}??????????? ??
  • ????????????jQuery.ready(); ??
  • ????????})(); ??
  • ????} ??
  • ??
  • ????//最后只能依賴于window.load. ??
  • ????jQuery.event.add(window,?"load",?jQuery.ready); ??
  • } ??
  • ??
  • //為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); ??
  • ????????????????}; ??
  • ????????????}); ??
  • ??
  • //?Prevent?memory?leaks?in?IE ??
  • //?And?prevent?errors?on?refresh?with?events?like?mouseover?in?other?browsers ??
  • //?Window?isn't?included?so?as?not?to?unbind?existing?unload?events ??
  • jQuery(window).bind('unload',?function()?{ ??
  • ????for?(var?id?in?jQuery.cache) ??
  • ????????//?Skip?the?window ??
  • ????????if?(id?!=?1?&&?jQuery.cache[id].handle) ??
  • ????????????jQuery.event.remove(jQuery.cache[id].handle.elem); ??
  • });??
  • 轉載于:https://www.cnblogs.com/rooney/archive/2008/12/02/1346132.html

    總結

    以上是生活随笔為你收集整理的Event 系列: jquery event 源码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。