按住shift键对checkbox进行连选

      效果:按住shift在区域内连选-------按照shift键进行勾选时候,如果两次勾选之间有未勾选的复选框,自动进行勾选。
      主要思想:获取指定区域内的所有checkbox,在勾选时监视是否按住了shift,如果按住,两次勾选之间的复选框分别设置成勾选状态。
      目前测试了ie6、ie7、firefox,其它浏览器未做测试。用javascript完成。
      javascript部分:
ContractedBlock.gif ExpandedBlockStart.gif javascript代码
  1ExpandedBlockStart.gifContractedBlock.gif/**//*****按住shift键对复选框进行连续多选******/
  2ExpandedBlockStart.gifContractedBlock.gif/**//*****
  3******author:huankfy
  4******time:2009-08-07
  5******/

  6ExpandedBlockStart.gifContractedBlock.giffunction SectionCheckBoxSelector(containerId){
  7    this._container = document.getElementById(containerId)||containerId;
  8    this._containerId = containerId;
  9    this._checkBoxList = new Array();
 10    this._keyCode = 0;
 11    this._startPosition = -1 ;
 12    this._ShiftClickQuene = new Array(2);//按住shift键时,最后两次click的checkbox
 13    this._eventArray = new Array();
 14    this._iniCheckBox();
 15}

 16
 17ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._iniCheckBox = function(){
 18    this._getCheckBoxs();
 19    this._hookOriginalEvent();
 20    
 21ExpandedSubBlockStart.gifContractedSubBlock.gif    for(var i=0;i<this._checkBoxList.length;i++){
 22        this._checkBoxList[i].onclick = this._checkBoxEvent;
 23        this._checkBoxList[i].sectionObj = this;
 24        this._checkBoxList[i].onkeydown = this._sniperKeyDown;
 25        this._checkBoxList[i].onkeyup = this._sniperKeyUp;
 26    }
    
 27}

 28
 29ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._getCheckBoxs = function(){
 30    var chkBoxs = this._container.getElementsByTagName("input");
 31    if(chkBoxs==null ||chkBoxs==undefined || chkBoxs.length==0return;
 32    
 33ExpandedSubBlockStart.gifContractedSubBlock.gif    for(var i=0,num=0;i<chkBoxs.length;i++){
 34        if(chkBoxs[i].type!="checkbox"continue;
 35        chkBoxs[i].number = num++;
 36        this._checkBoxList.push(chkBoxs[i]);
 37    }

 38}

 39
 40ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._hookOriginalEvent = function(){
 41ExpandedSubBlockStart.gifContractedSubBlock.gif    for(var i=0;i<this._checkBoxList.length;i++){
 42        var tmpClick = this._checkBoxList[i].onclick;
 43ExpandedSubBlockStart.gifContractedSubBlock.gif        if(tmpClick){
 44            var identyfer = this._containerId+this._checkBoxList[i].number;
 45            this._eventArray[identyfer] = tmpClick;
 46        }
    
 47    }
    
 48}

 49
 50ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._checkBoxEvent = function(){
 51    var chk = this;
 52    var sectionObj = chk.sectionObj;
 53
 54    var identyfer = sectionObj._containerId+chk.number;
 55    if(sectionObj._eventArray[identyfer])
 56        sectionObj._eventArray[identyfer].call(chk);
 57
 58    if(chk.checked==false && sectionObj._keyCode!=16return;
 59
 60ExpandedSubBlockStart.gifContractedSubBlock.gif    if(sectionObj._keyCode!=16)
 61        sectionObj._ShiftClickQuene = new Array(2);
 62        sectionObj._startPosition = chk.number;
 63        return;
 64    }
    
 65
 66    sectionObj._recordClick(chk,sectionObj);
 67    sectionObj._shiftPressedAndClick(sectionObj,chk.number);
 68}

 69
 70ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._sniperKeyDown = function(){
 71    var event = window.event || arguments[0];
 72    this.sectionObj._keyCode = event.keyCode;
 73}

 74
 75ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._sniperKeyUp = function(){
 76    this.sectionObj._keyCode = 0;
 77}

 78
 79ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._recordClick = function(chkBox,sectionObj){
 80    sectionObj._ShiftClickQuene[1= sectionObj._ShiftClickQuene[0];
 81    sectionObj._ShiftClickQuene[0= chkBox;
 82}
    
 83
 84ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._shiftPressedAndClick = function(sectionObj,curNumber){
 85    sectionObj._setUnChecked(sectionObj);
 86    
 87    var curNumber = curNumber; 
 88    var counter = sectionObj._startPosition;
 89
 90ExpandedSubBlockStart.gifContractedSubBlock.gif    if(counter==-1)//直接按下shift进行勾选,此时的处理的起始点为当前checkbox
 91        counter = curNumber;
 92        sectionObj._startPosition = counter;
 93    }
    
 94            
 95ExpandedSubBlockStart.gifContractedSubBlock.gif    if(counter>curNumber){
 96        var tmp = counter;
 97        counter = curNumber;
 98        curNumber = tmp;
 99    }

100    
101ExpandedSubBlockStart.gifContractedSubBlock.gif    while(counter<=curNumber){
102        var chk = sectionObj._checkBoxList[counter];
103        chk.checked = true;
104        
105        var identyfer = sectionObj._containerId + chk.number;
106        var tmpClick = this._eventArray[identyfer];
107        if(tmpClick)
108            tmpClick.call(chk);
109            
110        ++counter;
111    }

112}

113
114ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._setUnChecked = function(sectionObj){
115    var chkList = sectionObj._checkBoxList;
116    
117    var pos = sectionObj._getClearPos(sectionObj);
118    var start = pos.start;
119    var end = pos.end;
120ExpandedSubBlockStart.gifContractedSubBlock.gif    if(start!=-1){
121ExpandedSubBlockStart.gifContractedSubBlock.gif        for(var i=start;i<chkList.length&&i<=end;i++){
122            var chk = chkList[i];
123            chk.checked = false;
124            
125            var identyfer = sectionObj._containerId + chk.number;
126            var tmpClick = this._eventArray[identyfer];
127            if(tmpClick)
128                tmpClick.call(chk);
129        }
    
130    }
        
131}

132
133ExpandedBlockStart.gifContractedBlock.gifSectionCheckBoxSelector.prototype._getClearPos = function(sectionObj){
134    var quen = sectionObj._ShiftClickQuene;
135    var start = quen[1]==null?-1:quen[1].number;
136    var end = quen[0]==null?start:quen[0].number;
137ExpandedSubBlockStart.gifContractedSubBlock.gif    if(start>end){
138        var tmp = start;
139        start = end;
140        end = tmp;
141    }

142    
143ExpandedSubBlockStart.gifContractedSubBlock.gif    return {"start":start,"end":end};
144}
    
      调用方式为:
new  SectionCheckBoxSelector( " chkContainer " );  //  chkContainer为checkbox所在容器的id
//
 new SectionCheckBoxSelector(chkContainer); // chkContainer为checkbox所在的容器
      html部分为:
ContractedBlock.gif ExpandedBlockStart.gif Html部分
<div id="chkContainer">
    
<div>按住shift可进行联系选择</div>
    
<input type="checkbox">
    
<input type="checkbox">
    
<input type="checkbox">
    
<input type="checkbox">
    
<input type="checkbox">
    
<input type="checkbox">
    
<input type="checkbox">
    
<input type="checkbox">
    
<input type="checkbox">
</div>

      缺点:
     设计的较差,SectionSelector暴露了太多给checkbox操作,整个对象附加到checkbox上。以下划线命名的部分应该做信息隐藏,而不是暴露,但能力有限,不知该如何做信息隐藏。
     限制:
     当前已处理onclick事件,checkbox的onclick事件不受影响。onmousedown和onmouseover未做处理,如果checkbox有这两个事件,会被劫持掉。

      ps:附上源码,请大家指正。SectionSelector源码下载

  源码做了修改,使用了事件注册机制,解决了内存泄露问题

转载于:https://www.cnblogs.com/huankfy/articles/1541460.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值