[JS] Radio Shift Multi Select

by Mesak

最近工作需要寫了個小程式,這邊做個紀錄

程式碼在這邊:http://jsfiddle.net/mesak/AZnpP/1/embedded/result/

這個程式的作用是 點第一個物件,按住 Shift ,點第 n 個物件,在第一個到第n 個物件都會被 checked

這個功能在 gmail 也有實現出來

var index = 0;
var shift_down = false;
var radio_group = {
      'y':$(':radio[id^="idradio_y"]'),
      'n':$(':radio[id^="idradio_n"]')
    }
radio_group.y.prop('checked',true);
$(':radio').bind('change',function(){
    var this_index = radio_group[this.value].index(this);  
    if( shift_down )
    {
        var start = Math.min(index,this_index);
        var end   = Math.max(index,this_index);
        radio_group[this.value].slice(start,end).prop('checked',true);
    }
    index = this_index
})
$(document).bind('keydown',function(e){
    if(e.which == 16 ){
        shift_down = true;
        $('#output tr').eq(index).addClass('info')
    }
}).bind('keyup',function(e){
    if(e.which == 16 ){
        shift_down = false;
        $('#output tr').removeClass('info')
    }
}).bind('selectstart',function(){return false})

解釋一下 這個程式的大概語意

首先需要把 物件根據自己的 value 做分類,以防多次 selector,節省一點記憶體是很重要的www

接著把事件綁在 所有 radio 上,根據他的 value 值去取得目前 物件在 群組內的數值

如果 shift 被按下 就把 起始值 index 與 目前被選擇的物件 index  區間內的物件 被選擇

接著把 目前的 index 值 set 到 外部的 index 值

如果要改成  checkbox  則需要在 事件中 把 checked 值給抓取下來

var checked = $(this).prop('checked');

把後段的 true 改成 checked 就可以 多選取消、多選核選

You may also like