最近實現一個功能,用多選框的選中,實現啟用和禁用功能。
1、實現的過程中發現一個問題:啟用和禁用之前有條件判斷,如果不滿足條件則取消事件,但是發現只要點擊多選框其選中狀態都會發生變化。
想到的是input點擊后有瀏覽器默認的事件,首先想到的辦法是在點擊事件里面給checkbox的狀態在改成checked。
<!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js"> </script> <script> $(document).ready(function(){ $("#ckb").click(function(){ if(true){ //條件不滿足,還原多選框的選中狀態 $(this).attr("checked",'true'); } }); }); </script> </head> <body> <input type="checkbox" id="ckb" checked/>啟用 </body> </html>
經過測試發現,在此修改checkbox的狀態為選中狀態是沒有效果的,點擊多選框還是會切換選中狀態。
2、由此想起應該還是默認事件影響的,只有取消相應的默認事件,經過查詢發現使用e.preventDefault();就可以取消。
<!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js"> </script> <script> $(document).ready(function(){ $("#ckb").click(function(e){ if(true){ //條件不滿足,取消默認事件 e.preventDefault(); //條件不滿足,還原多選框的選中狀態 //$(this).attr("checked",'true'); } }); }); </script> </head> <body> <input type="checkbox" id="ckb" checked/>啟用 </body> </html>
測試發現,不管怎么點擊,checkbox始終都是選中狀態。這樣可以實現功能,問題解決了。
3、由此有個疑問:checkbox的瀏覽器的默認事件和點擊事件哪個先運行呢?為了驗證問題做了下面的測試
<!DOCTYPE html> <html> <head> <script src="/jquery/jquery-1.11.1.min.js"> </script> <script> $(document).ready(function(){ $("#ckb").click(function(e){ if(true){ //條件不滿足,取消默認事件 e.preventDefault(); alert($(this).attr("checked")); $(this).removeAttr("checked"); alert($(this).attr("checked")); } }); }); </script> </head> <body> <input type="checkbox" id="ckb" checked/>啟用 </body> </html>
先取消瀏覽器的默認事件,在取消checkbox的選中屬性,發現多選框最后還是選中狀態。由此只能說明瀏覽器的默認事件是在點擊事件之后運行的。
正常情況下在鼠標點擊之前,checkbox的狀態是選中,那么在點擊checkbox時,它會將當前的狀態取反即取消選中,然后執行響應事件,最后默認事件將這個狀態生效。
上面的這個代碼中,由於去掉了默認事件,因此,在執行響應事件時,checkbox確實取消選中了,但是在事件結束時,由於沒有沒有默認事件,那么這個checkbox就回到了點擊之前的狀態。