最近工作需要寫了個小程式,這邊做個紀錄
程式碼在這邊: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 就可以 多選取消、多選核選