pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

jquery 新建的元素事件綁定問題

js的事件監(jiān)聽跟css不一樣,css只要設(shè)定好了樣式,不論是原來就有的還是新添加的,都有一樣的表現(xiàn)。而事件監(jiān)聽不是,你必須給每一個元素單獨綁定事件。 常見的例子是處理表格的時
       js的事件監(jiān)聽跟css不一樣,css只要設(shè)定好了樣式,不論是原來就有的還是新添加的,都有一樣的表現(xiàn)。而事件監(jiān)聽不是,你必須給每一個元素單獨綁定事件。


      常見的例子是處理表格的時候。每行行末有個刪除按鈕,點了這個能夠刪除這一行。


  1. <table>
  2.     <tbody>
  3.         <tr>
  4.             <td>這行原來就有</td>
  5.             <td><buttonclass="del">刪除</button></td>
  6.         </tr>
  7.         <tr>
  8.             <td>這行原來就有</td>
  9.             <td><buttonclass="del">刪除</button></td>
  10.         </tr>
  11.     </tbody>
  12. </table>
復(fù)制代碼


通常,我會這么綁定


1.jQuery(function($){
2.   //已有刪除按鈕初始化綁定刪除事件
3.    $(".del").click(function() {
4.        $(this).parents("tr").remove();
5.   });
6.});


       對于在domready之前就存在的刪除按鈕,一切都很完美。但如果在domready之后用js動態(tài)添加幾行,那新增的幾行中的這些按鈕都將失去任何作用。


       如何解決這個問題?以下提供4種解決方案:



0號解決方案——onclick法
如果不顧結(jié)構(gòu)與行為分離的準(zhǔn)則的話,通常,我會這么做。
注意,此時的deltr這個function必須是全局函數(shù),得放jQuery(function($) {})外面,放里邊就成局部函數(shù)了,html里的onclick就調(diào)用不到了!



  1. 1.<td><buttononclick="deltr(this)">刪除</button></td>

  2. 1.jQuery(function($){
  3. 2.   //添加行
  4. 3.    $("#add2").click(function(){
  5. 4.        $("#table2>tbody").append('<tr><td>新增行</td><td><button nclick="deltr(this)">刪除</button></td></tr>')
  6. 5.   });
  7. 6.});
  8. 7.//刪除行的函數(shù),必須要放domready函數(shù)外面
  9. 8.function deltr(delbtn){
  10. 9.    $(delbtn).parents("tr").remove();
  11. 10.};
復(fù)制代碼


1號解決方案——重復(fù)綁定法
即,在domready的時候就給已有的元素綁定事件處理函數(shù),
而后當(dāng)新增加的元素的時候再次綁定。



  1. 1.<td><buttonclass="del">刪除</button></td>

  2. 1.jQuery(function($){
  3. 2.   //定義刪除按鈕事件綁定
  4. 3.   //寫里邊,防止污染全局命名空間
  5. 4.   function deltr(){
  6. 5.        $(this).parents("tr").remove();
  7. 6.   };
  8. 7.   //已有刪除按鈕初始化綁定刪除事件
  9. 8.    $("#table3 .del").click(deltr);
  10. 9.   //添加行
  11. 10.    $("#add3").click(function(){
  12. 11.        $('<tr><td>新增行</td><td><button class="del">刪除</button></td></tr>')
  13. 12.           //在這里給刪除按鈕再次綁定事件。
  14. 13.            .find(".del").click(deltr).end()
  15. 14.            .appendTo($("#table3>tbody"));
  16. 15.   });
  17. 16.});
復(fù)制代碼


2號解決方案——事件冒泡法
利用事件冒泡的原理,我們給這個按鈕的祖先元素綁定事件處理函數(shù)。
然后通過event.target這個對象來判斷,這個事件是不是我們要找的對象觸發(fā)的。
通常可以利用一些DOM屬性,比如event.target.className、event.target.tagName等之類的來判斷。



  1. 1.<td><buttonclass="del">刪除</button></td>

  2. 1.jQuery(function($){
  3. 2.   //第四個表格的刪除按鈕事件綁定
  4. 3.    $("#table4").click(function(e) {
  5. 4.       if (e.target.className=="del"){
  6. 5.            $(e.target).parents("tr").remove();
  7. 6.       };
  8. 7.   });
  9. 8.   //第四個表格的添加按鈕事件綁定
  10. 9.    $("#add4").click(function(){
  11. 10.        $("#table4>tbody").append('<tr><td>新增行</td><td><button class="del">刪除</button></td></tr>')
  12. 11.   });
  13. 12.});
復(fù)制代碼


3號解決方案——復(fù)制事件法
上面幾種方案可以說即便你沒有用到j(luò)Query庫,你也能相對比較容易的實現(xiàn)。但這種方案相對依賴jQuery的程度更高。而且必須要求jQuery 1.2版以上。低版本jQuery需要插件。
上面兩個方案都是對刪除函數(shù)動了很多腦筋,換了多種觸發(fā)、綁定的方式。這個方案不同,可以與平時純靜態(tài)的元素一樣在domready的時候綁定。但在我們添加新行的時候我們改動一下,不再想上面那樣拼接字符串來添加新行了。這回我們嘗試使用復(fù)制DOM元素的方式。并且復(fù)制的時候連同綁定的事件一起復(fù)制,復(fù)制完之后再用find之類的修改內(nèi)部的元素。
同時,就像這個例子,如果你會把所有元素都刪除光,那template這個模板是必須的,如果不會刪光,那就未必需要用template了。為了防止被誤刪,此處我把template設(shè)了隱藏。
我使用了jQuery中特有的clone(true)



  1. 1..template{display:none;}

  2. 1.<trclass="template">
  3. 2.           <td>這里是模板</td>
  4. 3.           <td><button class="del">刪除</button></td>
  5. 4.       </tr>
  6. 5.       <tr>
  7. 6.           <td>這行原來就有</td>
  8. 7.           <td><button class="del">刪除</button></td>
  9. 8.       </tr>
  10. 9.       <tr>
  11. 10.           <td>這行原來就有</td>
  12. 11.           <td><button class="del">刪除</button></td>
  13. 12.       </tr>

  14. 1.jQuery(function($){
  15. 2.   //第五個表格的刪除按鈕事件綁定
  16. 3.    $("#table5 .del").click(function() {
  17. 4.        $(this).parents("tr").remove();
  18. 5.   });
  19. 6.   //第五個表格的添加按鈕事件綁定
  20. 7.    $("#add5").click(function(){
  21. 8.        $("#table5>tbody>tr:eq(0)")
  22. 9.           //連同事件一起復(fù)制
  23. 10.            .clone(true)
  24. 11.           //去除模板標(biāo)記
  25. 12.            .removeClass("template")
  26. 13.           //修改內(nèi)部元素
  27. 14.            .find("td:eq(0)")
  28. 15.                .text("新增行")
  29. 16.                .end()
  30. 17.           //插入表格
  31. 18.            .appendTo($("#table5>tbody"))
  32. 19.   });
  33. 20.});
復(fù)制代碼

總評:
上面4種方案,各有優(yōu)劣。
0號方案,結(jié)構(gòu)與行為完全沒有分離,而且污染全局命名空間。最不推薦。所以我都不把它當(dāng)作一個方案來看。但對于js初學(xué)者,可以用來項目救急。
1號方案,中規(guī)中矩,沒啥好也沒啥不好
2號方案,這種方法充分的發(fā)揮了js事件冒泡的優(yōu)勢。而且效率最高。但同時由于這種方案無視了jQuery強大的選擇器,所以如果涉及的元素屬性要求過多就會比較麻煩了。你會徘徊在眾多if的條件的是非關(guān)系之中。后來我想起來,可以用jQuery中的$(event.target).is(selector)來作為條件。這樣可以極大提升開發(fā)效率,但略微降低執(zhí)行效率。
3號方案,這是我認為最能體現(xiàn)結(jié)構(gòu)與行為分離的思想的一種方案。但缺點也很明顯,對于jQuery依賴性過于高了,要不就自己寫一個復(fù)制連同事件一起復(fù)制的函數(shù),但這也顯然對于初學(xué)者來說異常困難。但從未來的趨勢的角度來看,還是很推薦使用這種方案的。


具體選用哪一個方案,沒有定數(shù)。具體看你的項目以及你js還有結(jié)構(gòu)與行為分離的思想的掌握程度。最適合的才是最好的。

【網(wǎng)站聲明】本站除付費源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請勿用于商業(yè)用途。如損害你的權(quán)益請聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

由于實際運行環(huán)境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達到,所以這部分不是開發(fā)者能夠決定的,開發(fā)者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個自定義的視頻播放器,需要用到HTML5提供的video標(biāo)簽、以及HTML5提供的對JavascriptAPI的擴展。,HTML5中國,中國最大的HTML5中文門戶。
隨著 Hybrid 應(yīng)用的豐富,HTML5 工程師們已經(jīng)不滿足于把桌面端體驗簡單移植到移動端,他們覬覦移動原生應(yīng)用人性化的操作體驗,特別是原生應(yīng)用與生俱來的豐富的手勢系統(tǒng)。HTML5 沒有提
你想要在自己網(wǎng)站上分享一個產(chǎn)品,或者是一個作品集,又或者僅僅只是一個靈感。在你發(fā)布到網(wǎng)上之前,你想讓它看起來有吸引力,專業(yè),或者至少得看起來像那么回事。那么你接下
H5廣告,包括H5廣告的設(shè)計流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個講義。同時,也讓我意外的收到了非常好反饋和認!這是對我的極大鼓勵!我的
本文主要內(nèi)容有:框架與組件、構(gòu)建生態(tài)、開發(fā)技巧與調(diào)試、html、css與重構(gòu)、native/hybrid/桌面開發(fā)、前端/H5優(yōu)化、全棧/全端開發(fā)、研究實驗、數(shù)據(jù)分析與監(jiān)控、其它軟技能、前端技術(shù)網(wǎng)
主站蜘蛛池模板: 南方珠江-南方一线电缆-南方珠江科技电缆-南方珠江科技有限公司 南汇8424西瓜_南汇玉菇甜瓜-南汇水蜜桃价格 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 杭州实验室尾气处理_实验台_实验室家具_杭州秋叶实验设备有限公司 | HDPE储罐_厂家-山东九州阿丽贝防腐设备| 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 路面机械厂家 | 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 上海物流公司,上海货运公司,上海物流专线-优骐物流公司 | 温室大棚建设|水肥一体化|物联网系统| 长沙广告公司|长沙广告制作设计|长沙led灯箱招牌制作找望城湖南锦蓝广告装饰工程有限公司 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 合肥角钢_合肥槽钢_安徽镀锌管厂家-昆瑟商贸有限公司 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 宽带办理,电信宽带,移动宽带,联通宽带,电信宽带办理,移动宽带办理,联通宽带办理 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 首页 - 张店继勇软件开发工作室| 恒温恒湿试验箱_高低温试验箱_恒温恒湿箱-东莞市高天试验设备有限公司 | 长城人品牌官网 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 电车线(用于供电给电车的输电线路)-百科 | 活性炭-果壳木质煤质柱状粉状蜂窝活性炭厂家价格多少钱 |