|

ÔÚjavasriptÖÐdelegateÕâ¸ö´Ê¾³£³öÏÖ£¬¿´×ÖÃæµÄÒâ˼£¬´úÀí¡¢Î¯ÍС£ÄÇôËü¾¿¾¹ÔÚʲôÑùµÄÇé¿öÏÂʹÓÃ?ËüµÄÔÀíÓÖÊÇʲô?ÔÚ¸÷ÖÖ¿ò¼ÜÖУ¬Ò²¾³£ÄÜ¿´µ½delegateÏà¹ØµÄ½Ó¿Ú¡£ÕâЩ½Ó¿ÚÓÖÓÐÊ²Ã´ÌØÊâµÄÓ÷¨ÄØ?ÕâÆªÎÄÕ¾ÍÖ÷Òª½éÉÜÒ»ÏÂjavascript
delegateµÄÓ÷¨ºÍÔÀí£¬ÒÔ¼°Dojo£¬jQueryµÈ¿ò¼ÜÖÐdelegateµÄ½Ó¿Ú¡£
JavaScriptʼþ´úÀí
Ê×ÏȽéÉÜÒ»ÏÂJavaScriptµÄʼþ´úÀí¡£Ê¼þ´úÀíÔÚJSÊÀ½çÖÐÒ»¸ö·Ç³£ÓÐÓÃÒ²ºÜÓÐȤµÄ¹¦ÄÜ¡£µ±ÎÒÃÇÐèÒª¶ÔºÜ¶àÔªËØÌí¼ÓʼþµÄʱºò£¬¿ÉÒÔͨ¹ý½«Ê¼þÌí¼Óµ½ËüÃǵĸ¸½Úµã¶ø½«Ê¼þίÍиø¸¸½ÚµãÀ´´¥·¢´¦Àíº¯Êý¡£ÕâÖ÷ÒªµÃÒæÓÚä¯ÀÀÆ÷µÄʼþðÅÝ»úÖÆ£¬ºóÃæ»áÏêϸ½éÉÜ¡£ÏÂÃæÎÒÃǾßÌå¾Ù¸öÀý×ÓÀ´½âÊÍÈçºÎʹÓÃÕâ¸öÌØÐÔ¡£Õâ¸öÀý×ÓÖ÷Ҫȡ×ÔDavid
WalshµÄÏà¹ØÎÄÕÂ(How JavaScript Event Delegation Works)¡£
¼ÙÉèÓÐÒ»¸ö UL µÄ¸¸½Úµã£¬°üº¬Á˺ܶà¸ö Li µÄ×ӽڵ㣺
<ul id="parent-list"> <li id="post-1">Item 1</li> <li id="post-2">Item 2</li> <li id="post-3">Item 3</li> <li id="post-4">Item 4</li> <li id="post-5">Item 5</li> <li id="post-6">Item 6</li> </ul> |
µ±ÎÒÃǵÄÊó±êÒÆµ½LiÉϵÄʱºò£¬ÐèÒª»ñÈ¡´ËLiµÄÏà¹ØÐÅÏ¢²¢Æ®³öÐü¸¡´°ÒÔÏÔʾÏêϸÐÅÏ¢£¬»òÕßµ±Ä³¸öLi±»µã»÷µÄʱºòÐèÒª´¥·¢ÏàÓ¦µÄ´¦Àíʼþ¡£ÎÒÃÇͨ³£µÄд·¨£¬ÊÇΪÿ¸öLi¶¼Ìí¼ÓһЩÀàËÆonMouseOver»òÕßonClickÖ®ÀàµÄʼþ¼àÌý¡£
function addListeners4Li(liNode){ liNode.onclick = function clickHandler(){...}; liNode.onmouseover = function mouseOverHandler(){...} } window.onload = function(){ var ulNode = document.getElementById("parent-list"); var liNodes = ulNode.getElementByTagName("Li"); for(var i=0, l = liNodes.length; i < l; i++){ addListeners4Li(liNodes[i]); } } |
Èç¹ûÕâ¸öULÖеÄLi×ÓÔªËØ»áƵ·±µØÌí¼Ó»òÕßɾ³ý£¬ÎÒÃǾÍÐèÒªÔÚÿ´ÎÌí¼ÓLiµÄʱºò¶¼µ÷ÓÃÕâ¸öaddListeners4Li·½·¨À´ÎªÃ¿¸öLi½ÚµãÌí¼Óʼþ´¦Àíº¯Êý¡£Õâ¾ÍÌí¼ÓµÄ¸´ÔӶȺͳö´íµÄ¿ÉÄÜÐÔ¡£
¸ü¼òµ¥µÄ·½·¨ÊÇʹÓÃʼþ´úÀí»úÖÆ£¬µ±Ê¼þ±»Å×µ½¸üÉϲãµÄ¸¸½ÚµãµÄʱºò£¬ÎÒÃÇͨ¹ý¼ì²éʼþµÄÄ¿±ê¶ÔÏó(target)À´Åжϲ¢»ñȡʼþÔ´Li¡£ÏÂÃæµÄ´úÂë¿ÉÒÔÍê³ÉÎÒÃÇÏëÒªµÄЧ¹û£º
// »ñÈ¡¸¸½Úµã£¬²¢ÎªËüÌí¼ÓÒ»¸öclickʼþ document.getElementById("parent-list").addEventListener("click",function(e) { // ¼ì²éʼþÔ´e.targeÊÇ·ñΪLi if(e.target && e.target.nodeName.toUpperCase == "LI") { // ÕæÕýµÄ´¦Àí¹ý³ÌÔÚÕâÀï console.log("List item ",e.target.id.replace("post-")," was clicked!"); } }); |
Ϊ¸¸½ÚµãÌí¼ÓÒ»¸öclickʼþ£¬µ±×ӽڵ㱻µã»÷µÄʱºò£¬clickʼþ»á´Ó×ӽڵ㿪ʼÏòÉÏðÅÝ¡£¸¸½Úµã²¶»ñµ½Ê¼þÖ®ºó£¬Í¨¹ýÅжÏe.target.nodeNameÀ´ÅжÏÊÇ·ñΪÎÒÃÇÐèÒª´¦ÀíµÄ½Úµã¡£²¢ÇÒͨ¹ýe.targetÄõ½Á˱»µã»÷µÄLi½Úµã¡£´Ó¶ø¿ÉÒÔ»ñÈ¡µ½ÏàÓ¦µÄÐÅÏ¢£¬²¢×÷´¦Àí¡£
ʼþðÅݼ°²¶»ñ
֮ǰµÄ½éÉÜÖÐÒѾ˵µ½ÁËä¯ÀÀÆ÷µÄʼþðÅÝ»úÖÆ¡£ÕâÀïÔÙÏêϸ½éÉÜÒ»ÏÂä¯ÀÀÆ÷´¦ÀíDOMʼþµÄ¹ý³Ì¡£¶ÔÓÚʼþµÄ²¶»ñºÍ´¦Àí£¬²»Í¬µÄä¯ÀÀÆ÷³§ÉÌÓв»Í¬µÄ´¦Àí»úÖÆ£¬ÕâÀïÎÒÃÇÖ÷Òª½éÉÜW3C¶ÔDOM2.0¶¨ÒåµÄ±ê׼ʼþ¡£
DOM2.0Ä£Ðͽ«Ê¼þ´¦ÀíÁ÷³Ì·ÖΪÈý¸ö½×¶Î£ºÒ»¡¢Ê¼þ²¶»ñ½×¶Î£¬¶þ¡¢Ê¼þÄ¿±ê½×¶Î£¬Èý¡¢Ê¼þÆðÅݽ׶Ρ£Èçͼ£º

ʼþ²¶»ñ£ºµ±Ä³¸öÔªËØ´¥·¢Ä³¸öʼþ(Èçonclick)£¬¶¥²ã¶ÔÏódocument¾Í»á·¢³öÒ»¸öʼþÁ÷£¬Ëæ×ÅDOMÊ÷µÄ½ÚµãÏòÄ¿±êÔªËØ½ÚµãÁ÷È¥£¬Ö±µ½µ½´ïʼþÕæÕý·¢ÉúµÄÄ¿±êÔªËØ¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬Ê¼þÏàÓ¦µÄ¼àÌýº¯ÊýÊDz»»á±»´¥·¢µÄ¡£
ʼþÄ¿±ê£ºµ±µ½´ïÄ¿±êÔªËØÖ®ºó£¬Ö´ÐÐÄ¿±êÔªËØ¸ÃʼþÏàÓ¦µÄ´¦Àíº¯Êý¡£Èç¹ûûÓа󶨼àÌýº¯Êý£¬ÄǾͲ»Ö´ÐС£
ʼþÆðÅÝ£º´ÓÄ¿±êÔªËØ¿ªÊ¼£¬Íù¶¥²ãÔªËØ´«²¥¡£Í¾ÖÐÈç¹ûÓнڵã°ó¶¨ÁËÏàÓ¦µÄʼþ´¦Àíº¯Êý£¬ÕâЩº¯Êý¶¼»á±»Ò»´Î´¥·¢¡£Èç¹ûÏë×èֹʼþÆðÅÝ£¬¿ÉÒÔʹÓÃe.stopPropagation()(Firefox)»òÕße.cancelBubble=true(IE)À´×é֯ʼþµÄðÅÝ´«²¥¡£
jQueryºÍDojoÖÐdelegateº¯Êý
ÏÂÃæ¿´Ò»ÏÂDojoºÍjQueryÖÐÌṩµÄʼþ´úÀí½Ó¿ÚµÄʹÓ÷½·¨¡£
$("#link-list").delegate("a", "click", function(){ // "$(this)" is the node that was clicked console.log("you clicked a link!",$(this)); }); |
jQueryµÄdelegateµÄ·½·¨ÐèÒªÈý¸ö²ÎÊý£¬Ò»¸öÑ¡ÔñÆ÷£¬Ò»¸öʱ¼äÃû³Æ£¬ºÍʼþ´¦Àíº¯Êý¡£
¶øDojoµÄÓëjQueryÏàËÆ£¬½öÊÇÁ½Õߵıà³Ì·ç¸ñÉϵIJî±ð£º
require(["dojo/query","dojox/NodeList/delegate"], function(query,delegate){ query("#link-list").delegate("a","onclick",function(event) { // "this.node" is the node that was clicked console.log("you clicked a link!",this); }); }) |
DojoµÄdelegateÄ£¿éÔÚdojox.NodeListÖУ¬ÌṩµÄ½Ó¿ÚÓëjQueryÒ»Ñù£¬²ÎÊýÒ²Ïàͬ¡£
Óŵãͨ¹ýÉÏÃæµÄ½éÉÜ£¬´ó¼ÒÓ¦¸ÃÄܹ»Ìå»áµ½Ê¹ÓÃʼþίÍжÔÓÚwebÓ¦ÓóÌÐò´øÀ´µÄ¼¸¸öÓŵ㣺
1.¹ÜÀíµÄº¯Êý±äÉÙÁË¡£²»ÐèҪΪÿ¸öÔªËØ¶¼Ìí¼Ó¼àÌýº¯Êý¡£¶ÔÓÚͬһ¸ö¸¸½ÚµãÏÂÃæÀàËÆµÄ×ÓÔªËØ£¬¿ÉÒÔͨ¹ýίÍиø¸¸ÔªËصļàÌýº¯ÊýÀ´´¦Àíʼþ¡£
2.¿ÉÒÔ·½±ãµØ¶¯Ì¬Ìí¼ÓºÍÐÞ¸ÄÔªËØ£¬²»ÐèÒªÒòÎªÔªËØµÄ¸Ä¶¯¶øÐÞ¸Äʼþ°ó¶¨¡£
3.JavaScriptºÍDOM½ÚµãÖ®¼äµÄ¹ØÁª±äÉÙÁË£¬ÕâÑùÒ²¾Í¼õÉÙÁËÒòÑ»·ÒýÓöø´øÀ´µÄÄÚ´æÐ¹Â©·¢ÉúµÄ¸ÅÂÊ¡£
дµ½ÕâÀͻȻÏëÆðÁË֮ǰ¶ÔÓÚDojo DataGridµÄÀ§»ó£ºÄÇô¶àµÄrowsºÍcells£¬ÈçºÎ´¦ÀíËûÃÇʼþÖ®¼äµÄ¹ØÏµ¡£ÏÖÔÚÏëÏ룬ʹÓÃίÍоͺܼòµ¥ÁË¡£ËùÓеÄʼþίÍе½grid×îÍâ²ãµÄ½ÚµãÉÏ£¬µ±Ê¼þ·¢ÉúµÄʱºòͨ¹ýһЩ·½·¨À´»ñÈ¡ºÍÌí¼ÓʼþµÄ¶îÍâÊôÐÔ£¬ÈçrowIndex,
cellIndex£¬Ö®ºóÔÚ·ÖÅäµ½onRowClick,onCellClickÖ®ÀàµÄ´¦Àíº¯ÊýÉÏ¡£
ÔÚJavaScript±à³ÌÖÐʹÓôúÀí
ÉÏÃæ½éÉܵÄÊǶÔDOMʼþ´¦Àíʱ£¬ÀûÓÃä¯ÀÀÆ÷ðÅÝ»úÖÆÎªDOMÔªËØÌí¼Óʼþ´úÀí¡£ÆäʵÔÚ´¿JS±à³ÌÖУ¬ÎÒÃÇÒ²¿ÉÒÔʹÓÃÕâÑùµÄ±à³Ìģʽ£¬À´´´½¨´úÀí¶ÔÏóÀ´²Ù×÷Ä¿±ê¶ÔÏó¡£ÕâÀïÒýÓÃ˾ͽÕýÃÀÏà¹ØÎÄÕÂÖеÄÒ»¸öÀý×Ó£º
var delegate = function(client, clientMethod) { return function() { return clientMethod.apply(client, arguments); } } var ClassA = function() { var _color = "red"; return { getColor: function() { console.log("Color: " + _color); }, setColor: function(color) { _color = color; } }; }; var a = new ClassA(); a.getColor(); a.setColor("green"); a.getColor(); console.log("Ö´ÐдúÀí£¡"); var d = delegate(a, a.setColor); d("blue"); console.log("Ö´ÐÐÍê±Ï£¡"); a.getColor(); |
ÉÏÃæµÄÀý×ÓÖУ¬Í¨¹ýµ÷ÓÃdelegate()º¯Êý´´½¨µÄ´úÀíº¯ÊýdÀ´²Ù×÷¶ÔaµÄÐ޸ġ£ÕâÖÖ·½Ê½¾¡¹ÜÊÇʹÓÃÁËapply(callÒ²¿ÉÒÔ)À´ÊµÏÖÁ˵÷ÓöÔÏóµÄ×ªÒÆ£¬µ«ÊÇ´Ó±à³ÌģʽÉÏʵÏÖÁ˶ÔijЩ¶ÔÏóµÄÒþ²Ø£¬¿ÉÒÔ±£»¤ÕâЩ¶ÔÏó²»±»Ëæ±ã·ÃÎʺÍÐ޸ġ£
Ôںܶà¿ò¼ÜÖж¼ÒýÓÃÁËίÍÐÕâ¸ö¸ÅÄîÓÃÀ´Ö¸¶¨·½·¨µÄÔËÐÐ×÷ÓÃÓò¡£±È½ÏµäÐ͵ÄÈçdojo.hitch(scope,method)ºÍExtJSµÄcreateDelegate(obj,args)¡£ÓÐÐËȤµÄͬѧ¿ÉÒÔ¿´Ò»ÏÂËûÃǵÄÔ´´úÂ룬Ö÷ÒªÒ²ÊÇjsº¯ÊýµÄapply·½·¨À´Öƶ¨Ö´ÐÐ×÷ÓÃÓò¡£
|