久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

jquery 新建的元素事件綁定問(wèn)題

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


      常見(jiàn)的例子是處理表格的時(shí)候。每行行末有個(gè)刪除按鈕,點(diǎn)了這個(gè)能夠刪除這一行。


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


通常,我會(huì)這么綁定


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


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


       如何解決這個(gè)問(wèn)題?以下提供4種解決方案:



0號(hào)解決方案——onclick法
如果不顧結(jié)構(gòu)與行為分離的準(zhǔn)則的話,通常,我會(huì)這么做。
注意,此時(shí)的deltr這個(gè)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號(hào)解決方案——重復(fù)綁定法
即,在domready的時(shí)候就給已有的元素綁定事件處理函數(shù),
而后當(dāng)新增加的元素的時(shí)候再次綁定。



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

  2. 1.jQuery(function($){
  3. 2.   //定義刪除按鈕事件綁定
  4. 3.   //寫(xiě)里邊,防止污染全局命名空間
  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號(hào)解決方案——事件冒泡法
利用事件冒泡的原理,我們給這個(gè)按鈕的祖先元素綁定事件處理函數(shù)。
然后通過(guò)event.target這個(gè)對(duì)象來(lái)判斷,這個(gè)事件是不是我們要找的對(duì)象觸發(fā)的。
通常可以利用一些DOM屬性,比如event.target.className、event.target.tagName等之類的來(lái)判斷。



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

  2. 1.jQuery(function($){
  3. 2.   //第四個(gè)表格的刪除按鈕事件綁定
  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.   //第四個(gè)表格的添加按鈕事件綁定
  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號(hào)解決方案——復(fù)制事件法
上面幾種方案可以說(shuō)即便你沒(méi)有用到j(luò)Query庫(kù),你也能相對(duì)比較容易的實(shí)現(xiàn)。但這種方案相對(duì)依賴jQuery的程度更高。而且必須要求jQuery 1.2版以上。低版本jQuery需要插件。
上面兩個(gè)方案都是對(duì)刪除函數(shù)動(dòng)了很多腦筋,換了多種觸發(fā)、綁定的方式。這個(gè)方案不同,可以與平時(shí)純靜態(tài)的元素一樣在domready的時(shí)候綁定。但在我們添加新行的時(shí)候我們改動(dòng)一下,不再想上面那樣拼接字符串來(lái)添加新行了。這回我們嘗試使用復(fù)制DOM元素的方式。并且復(fù)制的時(shí)候連同綁定的事件一起復(fù)制,復(fù)制完之后再用find之類的修改內(nèi)部的元素。
同時(shí),就像這個(gè)例子,如果你會(huì)把所有元素都刪除光,那template這個(gè)模板是必須的,如果不會(huì)刪光,那就未必需要用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>這行原來(lái)就有</td>
  8. 7.           <td><button class="del">刪除</button></td>
  9. 8.       </tr>
  10. 9.       <tr>
  11. 10.           <td>這行原來(lái)就有</td>
  12. 11.           <td><button class="del">刪除</button></td>
  13. 12.       </tr>

  14. 1.jQuery(function($){
  15. 2.   //第五個(gè)表格的刪除按鈕事件綁定
  16. 3.    $("#table5 .del").click(function() {
  17. 4.        $(this).parents("tr").remove();
  18. 5.   });
  19. 6.   //第五個(gè)表格的添加按鈕事件綁定
  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ù)制代碼

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


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

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

相關(guān)文檔推薦

由于實(shí)際運(yùn)行環(huán)境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會(huì)達(dá)到,所以這部分不是開(kāi)發(fā)者能夠決定的,開(kāi)發(fā)者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個(gè)自定義的視頻播放器,需要用到HTML5提供的video標(biāo)簽、以及HTML5提供的對(duì)JavascriptAPI的擴(kuò)展。,HTML5中國(guó),中國(guó)最大的HTML5中文門戶。
隨著 Hybrid 應(yīng)用的豐富,HTML5 工程師們已經(jīng)不滿足于把桌面端體驗(yàn)簡(jiǎn)單移植到移動(dòng)端,他們覬覦移動(dòng)原生應(yīng)用人性化的操作體驗(yàn),特別是原生應(yīng)用與生俱來(lái)的豐富的手勢(shì)系統(tǒng)。HTML5 沒(méi)有提
你想要在自己網(wǎng)站上分享一個(gè)產(chǎn)品,或者是一個(gè)作品集,又或者僅僅只是一個(gè)靈感。在你發(fā)布到網(wǎng)上之前,你想讓它看起來(lái)有吸引力,專業(yè),或者至少得看起來(lái)像那么回事。那么你接下
H5廣告,包括H5廣告的設(shè)計(jì)流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個(gè)講義。同時(shí),也讓我意外的收到了非常好反饋和認(rèn)!這是對(duì)我的極大鼓勵(lì)!我的
本文主要內(nèi)容有:框架與組件、構(gòu)建生態(tài)、開(kāi)發(fā)技巧與調(diào)試、html、css與重構(gòu)、native/hybrid/桌面開(kāi)發(fā)、前端/H5優(yōu)化、全棧/全端開(kāi)發(fā)、研究實(shí)驗(yàn)、數(shù)據(jù)分析與監(jiān)控、其它軟技能、前端技術(shù)網(wǎng)
主站蜘蛛池模板: 成人在线免费av | 国产精品久久久久久久久久免费 | 国产精品一卡二卡三卡 | 高清av电影 | 亚洲国产免费 | 99精品久久 | 激情av | 黄色一级片aaa | 最新一级毛片 | 天天看天天干 | 宅女噜噜66国产精品观看免费 | 国产欧美日韩综合精品一 | 国产精品高潮呻吟久久 | 人碰人操| www久久久| 99久久精品国产一区二区三区 | 欧美一区二区三区 | 精品视频久久久久久 | 91性高湖久久久久久久久_久久99 | 久久一区 | 欧美日韩国产中文字幕 | 美女午夜影院 | 亚洲成人一二三 | jizz在线免费观看 | 一区不卡在线观看 | 成人av网站在线观看 | 欧美一级片在线看 | 日韩中文字幕免费在线观看 | 成人三级av| 91精品国产91久久久久久不卞 | 国产精品国产成人国产三级 | 色爱综合 | 看亚洲a级一级毛片 | 国产精品色综合 | 一区二区三区免费观看 | 国产精品美女在线观看 | 91精品国产综合久久精品图片 | 久久国产精品无码网站 | 97超碰成人 | 亚洲国产精久久久久久久 | 欧美一级在线视频 |