前端環境:Jquery+Bootstrap,checkbox使用了iCheck前端
關於iCheck控件點擊事件的處理,其中有兩個相關事件ifClicked和ifChanged
通過實驗發現,ifClicked是點擊的時候觸發,此時check狀態還沒變化
ifChanged是狀態變化後觸發。
也就是說,當點擊checkbox的時候,觸發順序是:異步
ifClicked事件-->checkbox check狀態變化-->ifChanged事件測試
若是有其餘邏輯觸發iCheck的.iCheck('check')和.iCheck('uncheck'),改變狀態時,會直接觸發ifChanged事件,不會觸發ifClicked。
(備註:看網上也有人提出ifChanged事件在check狀態變化以前觸發(討論連接:https://bbs.csdn.net/topics/391953382),我也不知道是怎麼回事。這是我本身測試的結果,並且從ifChanged這個事件命名來看,也應該是在狀態變化以後來觸發的。).net
假如咱們須要某些關聯操做,須要明確指定點擊的時候纔要觸發某些事件(而不是狀態變化的時候觸發),可是點擊的時候check狀態又沒有發生變化,此時獲取狀態是錯誤的。code
上面提到的帖子裏提到用setTimeout定時器人爲模擬一個異步操做的方法。這個方法,也有弊端,時間間隔設定要恰當,不然點擊速度太快,兩次點擊時間間隔小於設定的時間間隔,會出現狀態異常。事件
帖子裏還有一個方案:ci
self.on("ifClicked", function (ent) { if($(self).is(":checked")) //如今判斷時如果選中的,點擊完了就變成了未選中了 else //這裏判斷是沒選中,點擊完了就變成選中了 })
這種方法適用於checkbox單獨一個使用,通常的checkbox都是好多放在一個組裏,此種方法判斷就有點麻煩了。get
我這裏提出另一個方法。使用ifClicked和ifChanged聯合解決:
設定一個bool變量:iCheckBoxClickFlag記錄是否被點擊
當被點擊的時候,觸發ifClicked事件,iCheckBoxClickFlag設定爲true
當觸發ifChanged事件的時候,再根據iCheckBoxClickFlag的狀態,判斷是不是點擊事件過來的。假如是,就執行自定義邏輯input
//iCheckBox是否被點擊 var iCheckBoxClickFlag = false; //處理ifClicked $("input:checkbox[name='city_cb']").on('ifClicked', function(event){ console.log('checkbox click'); iCheckBoxClickFlag=true; }); //處理ifChanged $("input:checkbox[name='city_cb']").on("ifChanged",function(){ console.log('checkbox changed...'); if(!iCheckBoxClickFlag){ return; } iCheckBoxClickFlag = false; //自定義邏輯 }