WEB前端技巧之JQuery为动态添加的元素绑定事件.md

jquery 为动态添加的元素绑定事件

如果直接写click函数的话,只能把事件绑定在已经存在的元素上,不能绑定在动态添加的元素上

可以用delegate来实现

  1. .delegate( selector, eventType, handler )

例如示例:

  1. $('someUlSelector').delegate('someLiSelector','click',function(){
  2. //codes...
  3. //$(this) for the current jquery instance of the element
  4. });

jQuery 事件 - delegate() 方法


jQuery的delegate有好几个缺憾

因为sizzle少提供了以refEl为参考、一个按selector来筛选els的filter(els,selector,refEl)的功能,jq需要自己去实现类似的功能。

  • 其一:selector是基于:root的,而不是:scope的。所以,在写代码时,需要带上 scrope 的定位部分。—-注::rootdocument根节点:scope代理节点

示例代码如

  1. <HTML><HEAD><TITLE>JK Test</TITLE>
  2. <METAcontent="text/html; charset=gb2312"http-equiv=Content-Type>
  3. <scriptsrc="http://common.cnblogs.com/script/jquery.js"type="text/javascript"></script>
  4. <style>
  5. div{border:1px solid balck;padding:5px;margin:2px;}
  6. </style>
  7. </HEAD>
  8. <body>
  9. <divid="div1">div1
  10. <divid="div1_1">div1_1
  11. <divid="div1_1_1">div1_1_1
  12. <spanstyle="color:red">span</span>
  13. </div>
  14. </div>
  15. <divid="div1_2">div1_2
  16. </div>
  17. </div>
  18. </body>
  19. <scripttype="text/javascript">
  20. $('#div1').delegate('#div1>*','click',function(){alert(this.innerHTML);});//点击div1_1,div1_2或时,都有效。
  21. </script>
  22. </HTML>
  1. //例如,代理div1的儿子,需要这样写:
  2. $('#div1').delegate('#div1>*','click',fun});
  3. //而不是这样写:
  4. $('#div1').delegate('>*','click',fun});
  • 其二:多个祖先满足条件时,只触发了target的closest的那一个祖先,而不是都触发。—-想不通jquery为什么要采用这个策略

示例代码如

  1. <HTML><HEAD><TITLE>JK Test</TITLE>
  2. <METAcontent="text/html; charset=gb2312"http-equiv=Content-Type>
  3. <scriptsrc="http://common.cnblogs.com/script/jquery.js"type="text/javascript"></script>
  4. <style>
  5. div{border:1px solid balck;padding:5px;margin:2px;}
  6. </style>
  7. </HEAD>
  8. <body>
  9. <divid="div1">div1
  10. <divid="div1_1">div1_1
  11. <divid="div1_1_1">div1_1_1
  12. <spanstyle="color:red">span</span>
  13. </div>
  14. </div>
  15. <divid="div1_2">div1_2
  16. </div>
  17. </div>
  18. </body>
  19. <scripttype="text/javascript">
  20. $('body').delegate('div','click',function(){alert(this.innerHTML);});//点击id1_1_1时,应该同时代理到三个div的点击
  21. </script>
  22. </HTML>
  • 其三:与sizzle一样,可能是没有回溯,在某些情况下有bug。

例如,当span有多个祖先是div时,这个代理会失效:$('body').delegate('body>div span','click',fun;});
示例代码如

  1. <HTML><HEAD><TITLE>JK Test</TITLE>
  2. <METAcontent="text/html; charset=gb2312"http-equiv=Content-Type>
  3. <scriptsrc="http://common.cnblogs.com/script/jquery.js"type="text/javascript"></script>
  4. <style>
  5. div{border:1px solid balck;padding:5px;margin:2px;}
  6. </style>
  7. </HEAD>
  8. <body>
  9. <divid="div1">div1
  10. <divid="div1_1">div1_1
  11. <divid="div1_1_1">div1_1_1
  12. <spanstyle="color:red">span</span>
  13. </div>
  14. </div>
  15. <divid="div1_2">div1_2
  16. </div>
  17. </div>
  18. </body>
  19. <scripttype="text/javascript">
  20. $('body').delegate('body>div span','click',function(){alert(this.innerHTML);});//点击span时,应该出现alert的
  21. </script>
  22. </HTML>

中文API的解释delegate





原文地址:https://www.cnblogs.com/pangxiansheng/p/4c7cf226777cb2a2cfb214480a166307.html