日期:2014-05-16  浏览次数:20592 次

如何按住shift键批量选中多封邮件?
如题,相信大家可能都用过这种功能,要删除的多封邮件,比如说:每页显示20封,我要删除其中的第3封,和从第5封开始到第10封结束的这些邮件,如果一封一封的去选很显然不方便,如果用全选则把当前页所有20封都选中了,那现在yahoo邮箱和网易邮箱中有可以这样操作:先选中从哪一个开始的,再按住shift键,在直接去点选结束的位置,这样一下子就可以选中你所想要的了,而且做的很灵活,可是看他源代码看他好像是什么aria的,也看不懂,不知用js是怎么实现的这种功能。在网络上有看到过类似的功能,但不灵活。
以下这个只能在IE中可以,在FF和Chrome中都不起作用了。
/*
* Shift全選及變色
*/
var iIndex = new Array();
var j = 0;
function selectit(el) {
//obj.sourceIndex获取obj在源序中的依次位置,
//即对象出现在 document 的 all 集合中的顺序 
iIndex[j++] = event.srcElement.sourceIndex;
var L = iIndex[j - 1] < iIndex[j - 2] ? 1 : 2; 
//比较数组中最后两个数的大小,以确定在循环时的先后 
if (event.shiftKey) { //如果按下Shift键被按下,执行下面的代码 
for (i = iIndex[j - L]; i < iIndex[j - 3 + L]; i++) {  
//遍历介于两次按住Shift键单击中的对象间的所有对象 
}
with (document.all[i]) { //为下面的语句设定默认对象document.all[i]
//判断当前对象的标签是否为复选框,并且name为shift 
if (tagName == "INPUT" && getAttribute("type") == "checkbox" && getAttribute("name") == "gb_select") { 
//设置当前对象的选中状态跟最后一次按住Shift键点击的对象选中状态一致 並設置顏色
checked = event.srcElement.checked;
parentNode.parentNode.parentNode.style.background = checked ? "#f9df7b" : "#ffffff";
}
}
event.srcElement.checked = true//选中当前单击的复选框
}
}


以下这个呢,不灵活:
var oJ={num:0};
window.onload=function(){
oJ.check=[];oJ.deleteV=[];
var oForms=document.getElementsByTagName('form');
for(var i=0,oForm;oForm=oForms[i];i++){
for (var j=0,length=oForm.elements.length;j<length;j++){ 
var oEle = oForm.elements[j];
if(oEle.type=='checkbox' && oEle.className=='checkall'){
oEle.onclick=function(){
selectAll(this.form);
};
}else if(oEle.type=='checkbox' && oEle.className=='id'){
oEle.onclick=function(event){
var event=window.event || event;
var num=this.name.substring(9);
if(this.checked){
if(event.shiftKey){
var start=oJ.num>num?num:oJ.num;
var end =oJ.num>num?oJ.num:num;
for(num=start;num<=end;num++){
oJ.check.push(num);
}
oJ.num=end;
}else{
oJ.check.push(num);
oJ.num=num;
}
}else{
if(event.shiftKey){
var start=oJ.num>num?num:oJ.num;
var end =oJ.num>num?oJ.num:num;
for(num=start;num<=end;num++){
oJ.deleteV.push(num);
}
oJ.num=start;
}else{
oJ.deleteV.push(num);
oJ.num=num;
}
}
if(oJ.deleteV.length!=0)
oJ.last=deleteNum(oJ.deleteV,oJ.check);
else
oJ.last=oJ.check;
oJ.deleteV=[];
oJ.check=oJ.last;
selectBox(this.form,oJ.last);
}
}
}
}
};
function deleteNum(iDelete,iCheck){
var returnArr=[];
for(var i=0,del;del=iCheck[i];i++){
if(!checkNum(del,iDelete))
returnArr.push(del);
}
return returnArr;
}
function checkNum(num,arr){
for(var i=0,n;n=arr[i];i++){
if(num==n)return true;
}
return false;
}
function selectBox(form,arr){
for (var i=0;i<form.elements.length;i++){ 
var ele = form.elements[i]; 
if (ele.type=='checkbox' && ele.className=='id'){
ele.checked=false;
var num=ele.name.substring(9);
if(checkNum(num,arr))
ele.checked ='checked';
}
}
}
function selectAll(form) { 
oJ.check=[];
for (var i=0;i<form.elements.length;i++){
  var ele = form.elements[i];
  if (ele.type=='checkbox' &&