iCheck控件ifClicked和ifChanged事件的討論

前端環境: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;
    //自定義邏輯
}
相關文章
相關標籤/搜索