實現checkbox的多選

來源:互聯網
上載者:User

標籤:矩形地區   pos   use   接下來   分享   str   記錄   checkbox   方向   

checkbox多選

  技術一般水平有限,有什麼錯的地方,望大家指正。

  全選,多選都是為了使用的方便,一般情況下全選就夠用了,但是使用者要求實現一個多選的功能也沒有辦法老老實實的做吧。

  多選的實現也較為簡單,首先需要一個遮罩可以標識給使用者當前所選擇的地區,其次就是選中使用者所需要的資訊,按照這個思路我們來一步步實現。

遮罩實現

  我們用一個div來當做遮罩層:

.mask{height:1px;width:1px;position:absolute;background-color:gray;opacity:0.2}
function createMask(){  var div = document.createElement("div");  div.className = "mask";  div.id = "mask";  document.body.appendChild(div);}

  接下來就是唯一需要注意的地方就是遮罩的大小的變化,遮罩是用一個div來實現,所以需要動態表示出寬高位置來為使用者標識出選擇的位置:

 

  我們把可以移動的地區分成四份(不是個標準的四象限~湊合看),假如原點就是我們滑鼠按下時的位置。

  當我們在A象限拖動時這是最正常的一種情況,滑鼠按下時的點就是遮罩的左上方那個點,寬高就是滑鼠運動時的座標減去滑鼠按下時的座標。

  當在B象限拖動時,我們拖動的方向是左下方,此時滑鼠按下時的點就是遮罩的右上方,決定遮罩大小的點就是我們滑鼠移動時的點和滑鼠按下時的點之間的距離,這個很好計算出來,在有了遮罩的大小之後最重要的就是決定遮罩的位置,我們要明白不管遮罩怎麼移動決定它的位置的都是左上方那個點。當在B象限移動時moveY>downY,moveX<downX,所以此時遮罩的寬:downX-moveX,高:moveY-downY,左上方的點為moveX,downY。

  當在C象限拖動時,此時moveX<downX,moveY<downY,此時滑鼠按下的位置作為遮罩的右下角,遮罩的左上方的點為moveX,moveY,寬:downX-moveX,高:downY-moveY。

  當在D象限移動時,此時moveX>downX,moveY<downY,此時遮罩的左上方的點為:downX,moveY,寬:downX-moveX,高:downY-moveY。

  在螢幕中間按下滑鼠向周圍移動查看效果。

選中實現

  這個較為簡單,記錄滑鼠按下時的座標,記錄滑鼠鬆開時的座標,兩個點決定的矩形地區內的checkbox選中即可(一個demo)。

  downX,downY為滑鼠按下死的座標,upX,upY為滑鼠鬆開是的座標,moveX,moveY為滑鼠移動時的座標。

      //禁止左鍵選中      $(document).bind("selectstart",function(){          return false;      })      $(document).mousedown(function(e){          var downX = e.pageX;          var downY = e.pageY;          $(this).bind("mousemove",function(e){              createMask();              var moveX = e.pageX;              var moveY = e.pageY;              var mask = $("#mask");              mask.css({"width":moveX-downX+"px","height":moveY-downY+"px"})              if(moveX<downX&&moveY>downY){//在B內                  mask.css({"left":moveX+"px","top":downY+"px","width":downX-moveX+"px","height":moveY-downY+"px"})              }else if(moveX<downX&&moveY<downY){//在C內                  mask.css({"left":moveX+"px","top":moveY+"px","width":downX-moveX+"px","height":downY-moveY+"px"})              }else if(moveX>downX&&moveY<downY){//在D內                  mask.css({"left":downX+"px","top":moveY+"px","width":moveX-downX+"px","height":downY-moveY+"px"})              }else{//在A內                  mask.css({"left":downX+"px","top":downY+"px","width":moveX-downX+"px","height":moveY-downY+"px"})              }          })          $(this).bind("mouseup",function(e){            var upX = e.pageX;            var upY = e.pageY;            var doms = $("input");            downX>upX&&changeX();            downY>upY&&changeY();            for(var i=0,il=doms.length;i<il;i++){                var c = $(doms[i]);                var p = c.position();                var top = p.top;                var left = p.left;                if(top>=downY&&top<=upY&&left>=downX&&left<=upX){                    c.prop("checked",!c.prop("checked"));                }            }            $(this).unbind("mousemove");            $(this).unbind("mouseup");            $("#mask").remove();            function changeY(){              var c;              c = downY;              downY = upY;              upY = c;            }            function changeX(){              var c;              c = downX;              downX = upX;              upX = c;            }          }.bind(this))      })      function createMask(){          var div = $("<div id=‘mask‘ class=‘mask‘></div>");          $("body").append(div);      }

 

  基本思路就是這樣,可根據實際需求做一些改造,比如按下ctrl才開始這個功能,為了使用方便也可以封裝成一個方法。

實現checkbox的多選

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.